본문 바로가기

OpenCV

perspective transformation 와 homography 차이

320x100
320x100

 

 

 기하 변환(geometric transformation)에 대해 공부 중이다. 다크프로그래머 블로그(영상처리 -> [영상 Geometry] 시리즈에 많은 개념들이 이해하기 쉽게 정리되어 있다)를 보며 많이 배우고 있다. 오늘은 블로그 글을 읽으며 공부하던 중에 헷갈리는 개념이 있어서 알아본 결과를 정리해보고자 한다.

 

perspective transformation(원근 변환)와 homography( = projective transformation) 이 두 개념 사이에 어떤 차이가 있는 걸까??

 

알아본 결과 perspective transformation = homography 관계라고 한다.

 

 

 OpenCV에서는 cv2.getPerspectiveTransform( )와 cv2.findHomography( )로 perspective 변환과 homography를 각각 지원한다. 이렇게 따로 지원해줘서 perspective 변환과 homography는 별개라고 생각했는데 이 둘이 같은 거더라.

 

둘 다 투영 변환 행렬을 구하 건 같은데 사용하는 파라미터 수( = 점 개수 )에 차이가 있을 뿐이었다.

 

  1. cv2.getPerspectiveTransform( ) 함수는 4개의 점만을 이용해서 변환 행렬을 찾는다.
    확실하게 대응되는 점 세트 4개를 알고 있는 경우,
    cv2.getPerspectiveTransform( ) 함수를 사용해서 투영 변환 행렬을 구해주면 된다.

    예를 들어,
    변환 전 카드의 네 모서리를 pointsA로 잡고
    변환 후 사용자가 적당한 비율로 설정한 points를 pointsB로 잡은 다음
    cv2.getPerspectiveTransform( )을 통해 변환 행렬을 찾아주면 다음과 같은 결과를 얻을 수 있다.



  2. cv2.findHomography( )는 4개 이상의 대응점들을 통해 변환 행렬을 찾아준다.
    이 과정에서 정확한 변환 행렬을 찾는데 방해가 되는 outlier 대응점들을 제거하는 데에 RANSAC 알고리즘이 사용되도록 설정할 수 있다.

    만약 상황이 아래와 같다면 cv2.findHomography( ) 통해 변환 행렬을 찾아주면 된다.
    (1) 대응점들이 4개 이상이면서
    (2) 이 점들의 대응 신뢰도가 떨어져서 모든 점이 정확하게 대응된 점이라고 확신할 수 없고
    (3) cv2.getPerspectiveTransform( ) 사용을 위해 가장 좋은 4개를 뽑으려 해도 선택할 기준이 없어 애매한 경우

    cv2.findHomography( ) 함수는 4개 이상의 대응점을 입력으로 받을 수 있어 (1) 문제가 해결되고,
    outlier 대응점을 제거할 수 있는 RANSAC 알고리즘을 사용할 수 있도록 설계되어 있어 (2), (3) 문제를 해결할 수 있다.

    ☞  outlier가 많이 포함된 대응점들에서 RANSAC을 통해 걸러내는 과정
 
[ 참고 사이트 ]