코너
- 객체의 뾰족한 부분
- 영상의 고유한 특징을 지님
코너의 특징
- 평탄한 영역과 에지 영역은 고유한 위치를 찾기 어려움
- 코너는 변별력이 높은 편이며, 영상의 이동, 회전 변환에 강인함
코너 검출 방법
해리스(Harris)
- 영상 내부 작은 영역이 모두 방향에 대해 변화가 큰 경우 코너로 규정
- cv2.cornerHarris()를 이용하며 코너 응답 함수 R을 반환, R이 충분히 크면 코너로 구분
- Local Maxima가 아닌 값이 검출 될 수 있음
Fast Features To Track
- Harris 코너 검출 방법의 향상된 버전
- NMS 수행
- cv2.goodFeaturesToTrack()을 사용하며, 이는 코너점 자체를 반환
FAST(Features from Acclerated Segment Test)
- 주변 16개 픽셀 값 크기를 분석하여 기준 픽셀보다 충분히 밝거나 또는 충분히 어두운 픽셀이 n개 연속으로 나타나면 코너로 인식 (보통 n=9)
cv2.cornerHarris(src, blockSize, ksize, k, dst=None, borderType=None) -> dst
- src: 입력 단일채널 8비트 또는 실수형 영상
- blockSize: 코너 응답 함수 계산에서 고려할 이웃 픽셀 크기. 보통 2~5.
- ksize: (미분을 위한) 소벨 연산자를 위한 커널 크기. 보통 3.
- k: 해리스 코너 검출 상수. 보통 0.04~0.06. 0.04를 많이 씀
- dst: 해리스 코너 응답 계수. src와 같은 크기의 행렬, np.ndarray, dtype=np.float32.
- borderType: 가장자리 픽셀 확장 빙식. 기본값은 cv2.BORDER_DEFAULT.
cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance,
corners=None, mask=None, blockSize=None,
useHarrisDetector=None, k=None) -> corners
- image: 8비트 또는 32비트 실수, 단일채널 영상
- maxCorners: 최대 코너 개수. 0 이하이면 무제한.
- qualityLevel: 코너점 결정을 위한 값. 보통 0.01~0.1. (0.01을 많이 씀)
- minDistance: 코너점 사이의 최소 거리 px // 너무 근접하면 가장 높은 값을 빼고 나머진 버린다 것을 의미
- corners: 검출된 코너점 좌표. np.ndarray, shape=(N, 1, 2), dtype=np.float32
- mask: 마스크 영상
- blockSize: 코너 검출을 위한 블록 크기. 기본값은 3.
- useHarrisDetector: 해리스 코너 방법 사용 여부. 기본값은 False
- k: 해리스 코너 검출 시 사용할 k 값.
cv2.FastFeatureDetector_create(, threshold=None, nonmaxSuppression=None, type=None) -> retval
- threshold: 중심 픽셀 값과 주변 픽셀 값과의 차이 임계값. 기본은 10.
- nonmaxSuppression: 비최대 억제 수행 여부. 기본은 True
- type: 코너 검출 방법. 기본값은 cv2.FAST_FEATURE_DETECTOR_TYPE_9_16
- retval: FastFeatureDetector 객체
cv2.FastFeatureDetector.detect(image) -> keypoints
- image: 그레이스케일 영상
- keypoints: 검출된 코너점 정보. cv2.KeyPoint 객체를 담은 리스트. cv2.KeyPoint의 pt 멤버를 이용하여 코너 좌표 검출.
pt는 float 자료형의 튜플이며 pt[0]은 x좌표, pt[1]은 y좌표를 나타냄.
결론
- FAST 방법의 반복 검출률이 대체로 높음
- 다만 FAST 방법은 노이즈에 민감함