Program/OPEN_CV

[Open CV] 특징점 검출과 매칭 _ 코너 검출

사막여유 2022. 6. 19. 23:45
728x90

2022.06.19 금일은 특징점 검출과 매칭 코너검출에  관한 강의였다.

 

 

이번 시간에는 다양한 코너 검출에 관해 알아본다.

 

코너라고 하는 부분은 영상에서의 모서리 부분 영상안에서 객체의 뾰족하게 튀어나와있는 부분들을 의미한다.

이러한 코너를 검출을 하는 이유는 코너점들이 영상에서 고유한 특징을 가지고있어서 변별력이 높게 잘 검출할 수 있기

때문.

그래서 영상에서의 코너 특징을 찾아서 두개의 영상을 비교한다거나 다른 부분을 찾거나 매칭을 하는등의

처리를 하는 부분에서 코너검출이 많이 사용된다.

 

코너의 특징

 - 평탄한 영역 ( flat ) & 에지 ( edge ) 영역은 고유한 위치를 찾기 어려움

 - 코너 ( corner ) 는 변별력이 높은 편이며 영상의 이동, 회전 변환에 강인함 

 

다양한 코너 검출 방법 ( 대표적 ) 

FAST 코너검출은 P점 주위의 밝은 픽셀들이 9픽셀 이상이 있으면 코너라고 판단한다.

하지만 무조건 밝은 픽셀들은 아니고 뾰족한 부분이 밝은 객체라고 한다면 주변의 어두운 9픽셀이 있으면 코너라고

판단한다.

 * 위 3가지 방법중 가장 효율적인 것은 FAST 검출법으로 보고있다.

 


해리스 코너 응답 함수 계산

cv2.cornerHarris ( src, blocksize, ksize, k , dst, borderType ) -> dst

src : 입력 단일채널 8비트 또는 실수형 영상

blockSize : 코너 응답 함수 계산에서 고려할 이웃 픽셀 크기. 보통 2~5

ksize : ( 미분을 위한 ) 소벨 연산자를 위한 커널 크기. 보통 3

k : 해리 코너 검출 상수 ( 보통 0.04~0.06 )

dst : 해리스 코너 응답 계수. src와 같은 크기의 행렬 ( numpy.ndarray ).
        dtype = numpy.float32.

borderType : 가장자리 픽셀 확장 방식. 기분값은 cv2.BORDER_DEFAULT.


추적하기 좋은 특징 코너 검출

cv2.goodFeaturesToTrack ( image, maxCorners, quallityLevel, minDistance, corners, mask ,                                                                blockSize, useHarrisDetector, k ) -> corners

image : 8비트 또는 32비트 실수, 단일채널 영상

maxCorners : 최대 코너 개수. maxCorners <= 0이면 무제한 ( -1 ).

qualityLevel : 코너점 결정을 위한 값. 보통 0.01 ~ 0.1

minDistance : 코너점 사이의 최소 거리 ( 주어진 거리에서 가장 코너같은것만 검출 )

corners : 검출된 코너점 좌표. numpy.ndarray.shape = ( N,1,2 ).dtype=numpy.float32.
                ( N이 코너점 개수 )

mask : 마스크 영상

blockSize : 코너 검출을 위한 블록 크기. 기본값은 3.

useHarrisDetector : 해리스 코너 방법 사용여부. 기본값은 False.

k : 해리스 코너 검출 시 사용할 k값


FAST 코너 검출

cv2.FastFeatureDetector_create ( , treshold, nonmaxSuppression , type ) -> retval

cv2.FastFeatureDetector.detect  ( image ) -> keypoints

threshold : 중심 픽셀 값과 주변 픽셀 값과의 차이 임계값
                  위 이미지에서 나온 P점보다 밝은값의 임계값
                  * Default 값 = 10, 충분히 큰값을 넣어줘야 검출이 잘됨 ( 30~60 )

nonmaxSuppression : 비최대 억제 수행 여부. 기본값 True.
                                    근방의 코너가 검출될 가능성을 없애는 옵션

type : 코너 검출 방법. 기본값은 cv2.FAST_FEATURE_DETECTOR_TYPE_9_16
          ( 주변 16개 픽셀중에서 9개 이상일때 검출 , 논문에서 16개를 사용하는 것이 좋다고 나옴 )

retval : FastFeatureDetector 객체

image : ( 입력 ) 그레이스케일 영상keypoints : ( 출력 ) 검출된 코너점 정보. cv2.KeyPoint 객체를 담은 리스트
                   cv2.KeyPoint의 pt 멤버를 이용하여 코너 좌표 추출.

 * FastFeatureDetector_creat 함수를 사용해서 클래스 객체를 만들어주고 
   클래스 객체서 detect 함수를 호출하여 입력영상에서 코너점을 검출할 수 있다.

 * keypoints  에서 pt멤버는 float 자료형의 튜플이며 x좌표는 pt[0], y좌표는 pt[1]로 접근할 수 있음


 

실제 구현된 코드를 보면

 

위 코드를 보면 goodFeaturesToTrack 과 FAST 코너 검출의 2가지 방법을 사용해서 각각의 코너점

추출 영상을 보여준다.

 

goodFeaturesToTrack 검출을 보게되면 corners 튜플의 첫번째에 있는 코너의 검출 개수를 사용하여for문을 돌리고 corners 의 x , y 좌표를 받아서 해당 코너에 원을 그려주는 방법으로 표현하였다.

이와 비슷한 방법으로 FAST 검출또한 코너의 x,y 좌표를 받아서 코너에 원을 그려주는 방법으로 표현하였다.

 

그런데 실제로 검사 시간을 측정해보면

코너 검출 결과는 비슷하지만 GFTT 와 FAST의 검사시간이 큰차이가 있는 것을 볼 수 있다.

코너 검출 결과 ( 좌 : GFTT, 우 : FAST )
검사 시간

 

코너 검출 반복성 비교

 - FAST 방법의 반복 검출률이 대체로 높음

 - 다만 FAST 방법은 노이즈에 민감함

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90