코너 검출을 공부하기 전에 알아야 할 지식 몇 개가 있다.
Harris corner Detection
전방향에서 나타나는 상당한 변화를 찾으면 코너가 검출된다
식: (람다1*람다2)-k(람다의 합)
https://en.wikipedia.org/wiki/Harris_corner_detector
flat
모서리가 없는 지역에서의 이동은 변화가 없는데, 모서리가 코너가 없는 지역에 윈도우가 놓이면 어느 방향에서도 변화를 찾을 수 없음
Shi- Tomasi corner Detection
min(람다1,람다2)
sobel operator
https://en.wikipedia.org/wiki/Sobel_operator
일단 데이터를 불러온다
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
flat_chess = cv2.imread('../DATA/flat_chessboard.png')
flat_chess = cv2.cvtColor(flat_chess,cv2.COLOR_BGR2RGB)
plt.imshow(flat_chess)
체스 모양의 그리드를 불러온다
gray_flat_chess = cv2.cvtColor(flat_chess,cv2.COLOR_BGR2GRAY)
plt.imshow(gray_flat_chess,cmap='gray')
체스판을 흑백으로 변환함
real_chess = cv2.imread('../DATA/real_chessboard.jpg')
real_chess = cv2.cvtColor(real_chess,cv2.COLOR_BGR2RGB)
plt.imshow(real_chess)
gray_real_chess = cv2.cvtColor(real_chess,cv2.COLOR_BGR2GRAY)
plt.imshow(gray_real_chess,cmap='gray')
체스판을 흑백으로 변환함. integer value
Harris Corner Detection
# Convert Gray Scale Image to Float Values
gray = np.float32(gray_flat_chess) #소수점값 반환
# Corner Harris Detection
dst = cv2.cornerHarris(src=gray,blockSize=2,ksize=3,k=0.04)
# result is dilated for marking the corners, not important to actual corner detection
# this is just so we can plot out the points on the image shown
dst = cv2.dilate(dst,None) #침식 기능
# Threshold for an optimal value, it may vary depending on the image. 최적값 임계치는 이미지에 따라 달라짐
flat_chess[dst>0.01*dst.max()]=[255,0,0] #red color
plt.imshow(flat_chess)
이미지를 소수점값으로 변환한다. 해리스 코너 검출로 소수값으로 변환된 체스 사진을 소스로 설정하고, 블록 크기 변수가 주변과 비슷한 크기라서 이를 이용해 코너 고유치와 벡터를 검출함.
k size는 소벨 연산자를 위한 변수,실제 알고리즘의 일부분이 소벨 연산자에 맞는 커널이다. k는 그자체로 해리검출의 자유 변수이다.
dilate는 침식 기능을 한다. 실제 코너 검출에 중요한게 아니라, 코너를 마킹하는데 침식한다.
최적값 임계치는 이미지에 따라 달라진다.
0.01 * max value = max value의 1프로로, 해리스 코너 결과가 무엇이든 최고값의 1퍼센트보다 크다
모서리 내부를 탐지하지 못한다. 모서리 가장자리 플랫으로 인식한 이유 : 어둡거나 밝은 타일처럼 분명하지 않기 때문이다
# Convert Gray Scale Image to Float Values
gray = np.float32(gray_real_chess)
# Corner Harris Detection
dst = cv2.cornerHarris(src=gray,blockSize=2,ksize=3,k=0.04)
# result is dilated for marking the corners, not important to actual corner detection
# this is just so we can plot out the points on the image shown
dst = cv2.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
real_chess[dst>0.01*dst.max()]=[255,0,0]
plt.imshow(real_chess)
체스판의 코너검출을 하였다. 여기 검은 물체에서는 위의 그리드와 다르게 다량의 코너를 검출함.
Shi-Tomasi Corner Detection
모서리 - 탐지된 모서리의 출력 벡터
max Corners는 반환되는 코너의 최대 개수. 만약 발견된 코너보다 더 많은 코너가 있으면, 그 중 가장 강력한 코너가 반환된다. 즉 'max Corners <= 0'은 최대 값에 대한 제한이 설정되지 않고 검출된 코너가 모두 반환됨을 의미한다.
이미지 모서리의 최소 허용 품질을 특징으로 하는 품질 수준 매개 변수.
매개 변수 값에 최소 고유 값 또는 해리스 함수 반응이 최상인 모서리 품질 측정값을 곱한다. 품질 측정값이 제품보다 작은 모서리는 기각된다. 예를 들어, 최상 모서리가 품질 측정값 = 1500이고 품질 수준 = 0.01이면 품질 측정값이 15보다 작은 모서리는 모두 기각된다. a < (품질측정값 * 품질수준)
flat_chess = cv2.imread('../DATA/flat_chessboard.png')
flat_chess = cv2.cvtColor(flat_chess,cv2.COLOR_BGR2RGB)
gray_flat_chess = cv2.cvtColor(flat_chess,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray_flat_chess,5,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel() #특정배열을 평평하게 만들음
cv2.circle(flat_chess,(x,y),3,(255,0,0),-1) # 두께 -1
plt.imshow(flat_chess)
첫줄 -> 체스판, 반환될 최대코너의 수 5 , 품질수준 0.01(수학적으로 말하면 최소 고유값 또는 본질적인 해리스 함수 반응)
두번째 파라미터음수를 넣으면 알고리즘이 발견한 모든 코너를 반환할것임
해리스 코너 처럼 코너를 자동으로 표시해주지 않는 단점이 있음
5개의 코너를 검출함
corners = cv2.goodFeaturesToTrack(gray_flat_chess,64,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(flat_chess,(x,y),3,255,-1)
plt.imshow(flat_chess)
64개의 코너를 검출함
real_chess = cv2.imread('../DATA/real_chessboard.jpg')
real_chess = cv2.cvtColor(real_chess,cv2.COLOR_BGR2RGB)
gray_real_chess = cv2.cvtColor(real_chess,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray_real_chess,80,0.01,10) #더 많은 코너 반환
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(real_chess,(x,y),3,255,-1)
plt.imshow(real_chess)
코너숫자를 늘릴수록 알고리즘은 체스말에서도 점점더 많은 코너를 감지할것임
출처 : udemy X KMOOC OpenCV 및 딥러닝을 이용한 Computervision 파이썬
'Deep Learning > Computer Vision' 카테고리의 다른 글
그리드 검출 (1) | 2023.08.09 |
---|---|
엣지 검출 (0) | 2023.08.09 |
템플릿 매칭 (0) | 2023.08.08 |
파이썬 카메라에 도형 그리기 (0) | 2023.07.23 |
파이썬으로 카메라 연결하기 (2) | 2023.07.23 |