이미지에서 코너를 효과적으로 검출해내는 알고리즘
관련 알고리즘
- 슬라이딩 윈도우
- Sobel

특정 크기의 윈도우를 상하 좌우로 이동했을때
# Syntex
dst = cv2.cornerHarris(src, blockSize, ksize, k)
# Example
gray = np.float32(gray_flat_chess)
# --> GrayScale 처리된 데이터 Input
dst = cv2.cornerHarris(src=gray,blockSize=2,ksize=3,k=0.04)
src: 입력 이미지입니다. 이미지는 그레이스케일 (단일 채널) 이미지여야 합니다. 싱글 채널 8bit 혹은 부동소수점 matrixblockSize: 코너 감지에서 고려할 이웃 픽셀의 크기입니다. 일반적으로 작은 값을 선택합니다 (예: 2 또는 3).ksize: Sobel 미분기의 필터 크기입니다. 일반적으로 홀수 값을 사용합니다 (예: 3, 5, 7).k: Harris 감도 계수입니다. 보통 0.04에서 0.06 사이의 값을 사용합니다.| Harris | Harris |
|---|---|
![]() | ![]() |
해리스 코너 검출의 한계를 개선한 알고리즘
최소 고유값을 기반으로 판단하기 때문에 엣지와 평면 픽셀을 더 잘 구분할 수 있다.
코너 사이의 최소 거리, 코너 품질 수준 등 다양한 파라미터로 더 정교하게 코너를 검출할 수 있다.
최소 고유값
행렬의 고유값중(eigenvalue) 최소 값
# Syntex
cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])
# Example
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)
해리스와 다르게 직접 찍어주지 않는다.
image: 입력 이미지로, 그레이스케일 이미지이어야 합니다.maxCorners: 검출할 최대 코너 수. 만약 이 값을 0으로 설정하면 가능한 모든 코너를 검출합니다.qualityLevel: 코너 품질 수준. 일반적으로 0과 1 사이의 값을 가지며, 코너 검출 임계값의 비율을 설정합니다. 예를 들어, 0.01로 설정하면 최고 코너 강도의 1% 이상인 코너만 검출합니다.minDistance: 검출된 코너 사이의 최소 거리. 두 코너가 이 거리보다 가까이 있는 경우, 그 중 하나는 제거됩니다.corners: 검출된 코너를 저장할 배열. 함수 호출 시에는 생략 가능하며, 반환값으로 얻을 수 있습니다.mask: ROI (Region of Interest)를 지정하는 마스크. 이미지와 같은 크기의 이진 배열로, 검출할 영역을 지정할 수 있습니다.blockSize: 코너 검출에 사용하는 영역(block)의 크기. 일반적으로 홀수 값(예: 3x3, 5x5 등)을 사용합니다.useHarrisDetector: 해리스 코너 검출기를 사용할지 여부를 지정하는 플래그. 기본값은 False이며, 이 경우 Shi-Tomasi 방법을 사용합니다.k: 해리스 코너 검출기의 자유 매개 변수. useHarrisDetector 플래그가 True인 경우에 사용됩니다.| Shi-Tomasi | Shi-Tomasi |
|---|---|
![]() | ![]() |
우측 채스판을 보면 기존 Harris보다 코너를 더 잘 구분한것을 확인할 수 있다.