2022.06.22 금일은 특징점 매칭에 관한 강의였다.
2개 영상에서 검출한 특징점을 매칭 하는 방법
특징점 매칭 ( feature point matching )
- 두 영상에서 추출한 특징점 기술자를 비교하여 서로 유사한 기술자를 찾는 작업
- 결국 특징점 검출과 매칭은 두장의 영상을 비교하여 얼마나 유사한지를 찾는 작업이라고
생각이 든다.
- 왼쪽 영상에서 4개의 특징점을 검출하였고, 오른쪽 영상에서는 3개의 특징점만 검출하였다.
그럼 각각의 점에서 근방에 있는 부분 영상을 추출하고 특징 벡터를 추출한다.
( 특징벡터는 실수 형태의 기술자일 수도 이진 형태의 기술자일 수도 있다. )
왼쪽의 #3번 같은 경우에는 오른쪽 특징점과 매칭이 될 부분이 하나도 없지만 실제로 매칭을 시켜보면
알고리즘 내부에서 어쨋든 가장 Distance가 작은놈을 찾아서 매칭을 시켜주게 됨
물론 잘못된 매칭이기 때문에 걸러내는 작업은 따로 해줘야 한다.
특징 벡터 유사도 측정 방법
- 실수 특징 벡터 : L2 노름 ( L2 norm ) 사용
- 이진 특징 벡터 : 해밍거리 ( hamming distance ) 사용
실수를 사용할지 이진을 사용할지는 알고리즘에 따라 다르게 지정해줘야 한다.
지정은 매칭을 하는 알고리즘을 새로 생성할 때 어떤 Distance 를 쓸 건지 지정을 하면 되는데
일단 DescriptorMatcher라는 클래스 내부에
match, knnMatch, radiusMatch 3가지 형태의 매칭 함수가 있다.
* match : 가장 비슷한 것 하나만 골라라
knnMatch : 가장 비슷한것 k 개만 골라라
radiusMatch : 반지름의 반경을 주고 반경에 들어가는 것에 비슷한 것을 모두 찾아라
실제로 위 함수들을 사용할 때는 DescriptorMatcher클래스를 사용하는 것이 아니라
cv2.BFMatcher or cv2.FlannBasedMatcher를 사용하면 되는데 대부분은 BFMatcher를 사용해도 문제가 없다.
BFMatcher는 하나의 특징점마다 비교할 영상의 모든 특징점들을 비교하여 가장 Distance가 작은놈을 찾는 방식으로
아래에서 나오듯이 전수조사라고 한다.
하지만 경우에 따라 특징점이 만개 이상 검출된다고 했을 때는 모든 부분을 전수조사하기 때문에 느릴 수 있다.그럴 경우에는 Flann이라는 방법을 사용하는데 근사화하여 조사하는 방법인데 속도는 빠르지만 정확성이
살짝 떨어질 수도 있다.
* BF : Brute-force ( 전수 조사 )
Flann : Fast Library for Approximate Nearest Neighbor ( K-D Tree 사용 )
위 함수들이 반환하는 타입은 cv2.DMatch 에서 볼 수 있듯이
* queryIdx : 1,2번 영상을 비교한다고 했을 때의 1번 영상에서 추출된 특징점의 번호
trainIdx : 2번 영상에서 추출된 특징점의 번호
imgIdx : 대부분의 경우 사용되지는 않는데
1번 이미지에서 특징점을 찾고 2번 이미지를 여러 장 받아서 매칭 할 때 사용
distance : 매칭 결과의 Distance 값이 저장된다
( L2 norm , Hamming Distance )
특징점 매칭 알고리즘 객체 생성
cv2.BFMatcher_create ( , normType = None, crossCheck = None ) -> retval
normType : 특징점 기술자 거리 계산 방식 지정. 기본값은 cv2.NORM_L2.
crossCheck : 이 값이 True 이면 양방향 매칭결과 ( 1,2번 영상이 서로 특징점을 체크하여 같은 값이 있을 때만 )
가 같은 경우만 반환함. 기본값은 False
결괏값은 정밀해질 수 있지만 시간이 더 소요됨
cv2.DescriptorMatcher.match ( queryDescriptors, trainDescriptors, mask = None ) -> matches
- queryDescriptor : ( 기준 영상 특징점 ) 질의 기술자 행렬
- trainDescriptor : ( 대상 영상 특징점 ) 학습 기술자 행렬
- mask : 매칭 진행 여부를 지정하는 행렬 마스크.
- matches : 매칭 결과. cv2.DMatch 객체의 리스트
cv2.DescriptorMatcher.knnmatch ( queryDescriptors, trainDescriptors, k, mask = None, compactResult = None )
-> matches
- queryDescriptor : ( 기준 영상 특징점 ) 질의 기술자 행렬
- trainDescriptor : ( 대상 영상 특징점 ) 학습 기술자 행렬
- k : 질의 기술자에 대해 검출할 매칭 개수
- mask : 매칭 진행 여부를 지정하는 행렬 마스크.
- compactResult : mask가 None이 아닐 때 사용되는 파라미터. 기본값은 False이며, 이 경우 결과 matches는 기준 영상
특징점과 같은 크기를 가짐
- matches : 매칭 결과. cv2.DMatch 객체의 리스트
특징점 매칭 결과 영상 생성
cv2.drawMtahces ( img1, keypoints1, img2, keypoints2, matches1to2, outImg = None, matchcolor=None, singlePointColor = None, matchesMask = None, flags = None ) -> outImg
- img1, keypoints1 : 기준 영상과 기준 영상에서 추출한 특징점
- img2, keypoints2 : 대상 영상과 대상 영상에서 추출한 특징점
- matches1to2 : 매칭 정보. cv2.DMatch의 리스트.
- outImg : 출력 영상
- matchColor : 매칭 된 특징점과 직선 색상
- singlePointColor : 매칭 되지 않은 특징점 색상
- matchesMask : 매칭 정보를 선택하여 그릴 때 사용할 마스크
- flags : 매칭 정보 그리기 방법.
기본값은 cv2.DRAW_MATCHES_FLAGS_DEFAULT.
* 매칭된 결과를 특징점끼리 선으로 연결해서 보여주는 함수
위와 같은 결과를 얻을 수 있지만 선이 너무 많기 때문에 매칭이 잘 됐는지 안 됐는지는 확인이 거의 불가능하다.
그래서 이 부분에 대해서는 다음 시간에 좋은 매칭 선별이라고 하는 서로 매칭이 유의미한 것만 표기하는 방법을 설명할
예정이다.
위와 같이 1번, 2번의 특징점 개수를 살펴보면 2번 영상에서 찾은 특징점 개수를 1번 영상에서
모두 매칭 한 결과를 볼 수 있다.
그리고 다시 한번 작성하자면 이진 기술자인지 실수 기술자인지를 잘 구분하여cv2.NORM_HAMMING을 사용할지를 잘 선택해주어야 한다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 특징점 검출과 매칭 _ 호모그래피와 영상매칭 (0) | 2022.06.23 |
---|---|
[Open CV] 특징점 검출과 매칭 _ 좋은 매칭 선별 (0) | 2022.06.22 |
[Open CV] 특징점 검출과 매칭 _ 특징점 기술 (0) | 2022.06.21 |
[Open CV] 특징점 검출과 매칭 _ 특징점 검출 (0) | 2022.06.20 |
[Open CV] 특징점 검출과 매칭 _ 코너 검출 (0) | 2022.06.19 |