Program/OPEN_CV

[Open CV] 특징점 검출과 매칭 _ 좋은 매칭 선별

사막여유 2022. 6. 22. 21:58
728x90

2022.06.23 금일은 좋은매칭 선별에  관한 강의였다.

 

 

두개의 영상에서 검출한 특징점으로 매칭한 후에 좋은 매칭들만 선별하는 방법에 대해서 알아본다.

 

좋은 매칭 선별 방법 #1

 - 가장 좋은 매칭 결과에서 distance 값이 작은 것 N개를 사용

 - cv2.DMatch.distance 값을 기준으로 정렬 후 상위 N개 선택
   ( 유사도가 높다라는 것은 2개의 특징벡터의 distance 값이 작다라고 볼 수 있다. 
     따라서 해당 distance가 작은 것을 기준으로 몇가지만 골라내면 좋은 매칭이라고 할 수 있다. )

위 해당하는 특징점은 실수형 기술자이고 가장 기본적인 매칭결과를 matches 라는 결과로 받은 이후
( matches 는 dmatch라는 클래스 객체를 리스트로 갖고있는 형태 ) 

matches = sorted ( matches , key = lambda x: x.distance )
위와같이 소팅하면 오름차순으로 정렬이 되기때문에 작은 distance값을 앞부분에서 구할 수 있다.

따라서 matches 라는 리스트에서 앞에서부터 80개의 distance값만 뽑아내서

특징점 매칭 결과 영상을 생성한다.

 

좋은 매칭 선별 방법 #2

 - 가장 좋은 매칭 결과의 distance 값과 두 번째로 좋은 매칭 결과의 distance 값의 비율을 계산

  수식으로 설명되어있는 부분은 위 오른쪽 노란 박스 부분이다.

  매칭이 제대로 된것은 distance값이 작게 나올 것이고, 제대로 되지 않은 부분은 distance값이 상대적으로 크게 나오게된다.

 

따라서 가장 작은 distance값은 작고 ( closest_distance ) 그 다음으로 좋은 값이 ( next_closet_distance ) 크게

나타난다고 하면 전체 분수의 값은 작은 값이 나오게 될건데 그렇다는 것은 첫번째 매칭된 것은 제대로 된것이고 

2번째 매칭된것은 다른 쪽에 매칭됐다고 볼 수 있다.

 

그런데 첫번째 distance 값과 두번째 distance값의 차이가 별로 안난다고 하면 두개 모두 매칭이 잘못 됐다고 볼 수 있다.


따라서 이와같이 가장 작은 distance값과 그 다음 값의 비율을 이용하여 Threshold ( 임계값 ) 보다 작거나 큰 것으로

판단하여 매칭이 잘 된 포인트들을 찾을 수 있다.

 

 - 이 비율이 임계값 ( e.g. 0.7 ) 보다 작으면 선택

 

일단 knnMatch를 이용하여 제일 잘 된 매칭 포인트 2개를 받아오게 한다.

그럼 Dmatch List를 또한번 감싼 형태로 된다.

그렇게 나온 결과 리스트를 for문에서 위처럼 비율로 분류한다.

 


Good Match #1

Good Match 이전 ( KAZE )
Good Match 결과 ( KAZE )
Good Match 결과 ( AKAZE )
Good Match 결과 ( ORB )


Good Match #2

Good Match 결과 ( KAZE )

위와같은 방법을 사용해도 빨간원처럼 좋지 않은 결과를 가질 수 있기때문에 후처리가 필요하다.

Good Match 결과 ( AKAZE )
Good Match 결과 ( ORB )

ORB 방법이 아무래도 AKAZE 의 방법보다는 정확성 ( 안정성 ) 이 떨어지지만 

속도방면에서는 가장 빠르다.

 

Good Match 를 하더라도 잘못된 매칭 결과가 남아있을 수 있기 때문에 

그런 것들을 또다시 걸러내고 그것들에 대한 영향을 받지 않은 상태에서 Matching을 잘 하는 방법을 다음시간에 알아본다.

 

 

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

https://bit.ly/3L3avNW

 

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

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

fastcampus.co.kr

728x90