SIFT Algorithm/OpenCV

Flash·2022년 7월 30일
0
post-thumbnail

SIFT, Keypoint Descriptor

SIFT 알고리즘은 이미지 피라미드를 이용하여 이미지의 크기가 변화하는 것에 대응하는 알고리즘

OpenCV를 이용한 SIFT 실습은 아래의 자료를 참고하여 학습을 수행했다.
참고 자료, SIFT 알고리즘

# OpenCV에서 제공하는 생성 함수를 이용
sift = cv2.xfeatures2d.SIFT_create(nfeatures, nOctaveLayers, 
                        contrastThreshold, edgeThreshold, sigma) 

각 파라미터에 대한 설명을 보탠다.
1. nfeatures: 검출하는 최대 특징 수
2. nOctaveLayers: 이미지 피라미드에 사용할 계층 수
3. contrastThreshold: 필터링 할 빈약할 특징 경계 값
4. edgeThreshold: 필터링 할 엣지 경계 값
5. sigma: 이미지 피라미드 0 계층에서 사용 할 가우시안 필터의 시그마 값

cv2 버전을 재설치하는 과정에서 cv2.imshow()로 이미지를 출력하는 것이 불가해져
cv2_imshow()를 이용하여 출력했다.

Google Colab을 통해서 실습을 수행했는데 3.4x 버전이 필요해서 삭제 후 재설치했다.

SIFT와 BFMatcher를 이용하여 두 이미지의 Feature Matching을 수행했다.

특징 점의 거리 측정 함수로 아래의 것들이 사용된다.

SIFT는 NORM_L1과 NORM_L2를 적합하게 사용할 수 있다.

BFMatcher는 세 가지 매칭 함수를 사용하여 이미지를 매칭한다.

matcher.match(queryDescriptors, trainDescriptors, mask)
matcher.knnMatch(queryDescriptors, trainDescriptors, k, mask, compactResult)
matcher.radiusMatch(queryDescriptors, trainDescriptors, maxDisatance, mask, compactResult)

queryDescriptors: 특징 디스크립터 배열, 매칭의 기준이 될 디스크립터
trainDescriptors: 특징 디스크립터 배열, 매칭의 대상이 될 디스크립터
mask(optional): 매칭 진행 여부 마스크
k: 매칭할 근접 이웃 개수
maxDistance: 매칭 대상의 거리 경계

위의 세 가지 함수를 통하면 DMatch 객체 리스트를 반환하는 데, 이 객체는 매칭 결과를 표현한다.
구성은 아래와 같다.
queryIdx: queryDescriptors의 인덱스
trainIdx: trainDescriptors의 인덱스
imgIdx: trainDescriptor의 이미지 인덱스
distance: 유사도 거리

매칭이 잘 이루어지지 않는 것을 볼 수 있는데 올바른 매칭점만을 얻어내기 위해서 매칭점으로 선택할 퍼센티지를 정해야 한다.

30% 이하의 구간을 선택한 경우

10% 이하의 구간을 선택한 경우

profile
Whiplash We Flash

0개의 댓글