Program/OPEN_CV

[Open CV] 특징점 검출과 매칭 _ 호모그래피와 영상매칭

사막여유 2022. 6. 23. 08:10
728x90

2022.06.24 금일은 호모그래피와 영상 매칭에  관한 강의였다.

 

 

지난시간에 계산했던 특징점 매칭을 이용해서 호모그래피를 진행하고 영상 전체를 매칭하는 방법을 알아본다.

 

호모그래피 ( Homography ) 란?

 - 두 평면 사이의 투시 변환 ( Perspective transform )

바닥에 사진이 있는데 이 사진을 v1이라는 지점에서 카메라로 사진을 촬영하고 촬영 결과를 i1이라고 한다.

그럼 비스듬한 상태로 촬영을 했기때문에 비스듬하게 찍혔을것이다. 

이때 원래 사진과 기울어지고 비스듬하게 찍힌 사진과의 관계를 표현하는 것을 호모그래피라고 한다. ( H1 , H2 )

 * 촬영된 i1 과 i2도 호모그래피 관계가 생긴다. ( i1 -> i2 )

호모그래피는 기본적으로 투시변환과 거의 유사한데 따라서 3x3 행렬로 표현할수 있다.
실제 행렬의 element는 9개이지만 미지수는 8개이다.

 

perspective transform 행렬을 구하기위해서 점 4개에 대응되는 관계를 알면 x,y좌표 관계식이 2개나오기 때문에
4개의 점에서는 8개의 방정식이 나오고 8개의 미지수를 계산할 수가 있어서 perspective transform을 계산할 수 있다.

 

 - 8DOF : 최소 4개의 대응점 좌표가 필요

 

이 전 강의에서의 두개의 이미지 ( 정면, 측면(기울어짐) ) 가 어떤 관계에 있는지
계산 하기 위해서는 Homograpy를 계산해야한다.

하지만 계산하기 위해서는 Perspective Transform에 좋은 매칭이 있을수도 있지만 안좋은 매칭이 있을수도 있다는
가정하에 해야하기 때문에 이런 부분을 신경써서 계산해줘야한다.

 


호모그래피 계산 함수

cv2.findHomography ( srcPoints, dstPoints, method=None, ransacReprojThreshold=None, mask=None, maxIters=None, confidence=None ) -> retval, mask

srcPoints : 입력 점 좌표. numpy.ndarray.shape = (N,1,2). dtype = numpy.float32.

dstPoints : 결과 점 좌표. numpy.ndarray.shape = (N,1,2). dtype = numpy.float32.

method : 호모그래피 행렬 계산 방법. 0, LMEDS, RANSAC, RHO 중 선택.
               기본값은 0이며, 이상치가 있을 경우 RANSAC, RHO 방법 권장.

ransacReprojThreshold : RANSAC 재투영 에러 허용치. 기본값은 3.

maxIters : RANSAC 최대 반복 횟수. 기본값은 2000.

retval : 호모그래피 행렬. numpy.ndarray.shape = ( 3,3 ). dtype = numpy.float32.

mask : 출력 마스크 행렬. RANSAC, RHO 방법 사용시 Inlier로 사용된
           점들을 1로 표시한 행렬. numpy.ndarray.shape = ( N,1 ), dtype = uint8.

* 인자 type 과 shape을 잘 지정해줘야함


 

* RANSAC

 - Random Sample Consensus

 - 이상치 ( outlier ) 가 많은 원본 데이터로부터 모델 파라미터를 예측하는 방법

위와같이 점들이 분포되어 있을때 임의의 두점을 잡고 마진을 설정해주어 두 점사이에 들어오는 값들이 

가장 많이 분포하는 곳을 모델 파라메터 ( 직선의 방정식 ) 이라고 보고 이것을 구하는 방법을 RANSAC이라고 한다.

우측 이미지를 직선이라고 본다.

 

 

일단 이 전 이미지를 갖고 와서 설명하자면 

위와같이 80개의 특징점이 매칭된 결과에서 4개의 점을 선택을 하고 Perspective transform 행렬을 일단 계산하고 

나머지 76개를 가지고 검증을 해본다.

그럼 여기서 outlier 가 안들어간 투시변환행렬이다라고 한다면 ( * 위 RANSAC 참고 ) 해당 변환을 사용할 가능성이 크고

outlier가 포함된 투시변환행렬이라고 한다면 마진 안에 들어가는 매칭결과가 적어지기 때문에 해당 변환을 사용하지 않을

가능성이 커 버려지는 형태로 작용된다.

 

따라서 호모그래피 계산 함수에서 method 인자는 RANSAC을 사용하는 것이 가장 좋다고 볼 수 있다.

Outlier가 전혀 없을경우는 0을 써도되고 적게 있을 때는 LMEDS 를 사용하지만 RANSAC이 가장 많이 사용되고 효율적인

알고리즘 이다.

 

mask 인자는 우리가 기존에 알고있던 mask와는 의미가 조금다르다.

정확한 설명은 이후 AR비디오 플레이어 실전코딩에서 다룰 예정이다.

 

 

 

결과 영상

 

 

강사님이 주신 팁으로는

단순한 흑백이미지를 매칭하기 위해서는 위 특징점 검출보다는 템플릿 매칭이 더 적합하다고 한다.

 

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

https://bit.ly/3L3avNW

 

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

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

fastcampus.co.kr

 

728x90