새소식

Perception

Homography : 평면과 평면 사이 관계, Pseudo Inverse

  • -

Homography 는 image stitching 을 할 때 많이 쓰입니다. (굉장히 많이 쓰이는 중요한 개념이지만, 일단은 image stitching 으로 시작해 봅시다. )

 

image stitching 은 여러 장의 사진을 이어 붙이는 작업으로, 파노라마 이미지를 만들 때 사용됩니다. 

이런 파노라마 이미지를 만들 때에는 어떤 방법들이 사용될 수 있을까요 ?

  1. 매우 넓은 FoV 를 가진 렌즈를 사용한다 -  이 방법의 단점은 이미지 왜곡이 일어나고, FoV 가 200도를 넘기기 어렵고, 비쌉니다. 
  2. 여러 장을 찍어서 이어 붙인다. 

그러려면 여러 장의 이미지들의 관계에 대해서 알아야 하고, 이때 사용되는 것이 특징점입니다. 앞으로도 LiDAR 를 사용하지 않고 2D 이미지에서 3D reconstruction 을 진행한다면 특징점을 사용해서 진행하게 될 것입니다. 

 

Homography

 

homography 를 간단하게 말하자면, "Projective geometry 에서 space 의 변형을 나타내는 transform"입니다. 

쉽게 말하자면, 이와 같이 같은 책이 있는 다음과 같은 사진 둘이 있을 때 a 평면을 b 평면으로 변화시키는 matrix 라고 할 수 있습니다. 

homography 는 평면을 가정합니다. 그래서 만약 책상 밑에 사과가 있더라도 homography 에서는 그러한 깊이감을 고려하지 않고 하나의 평면으로 취급합니다. 따라서 평면과 평면과의 관계를 다루는 transform 이라고 이해하시면 될 것 같습니다. 

 

또한 Projective Geometry 상에서 진행하고 있기 때문에 Homogeneous Coordinate 를 사용한다는 점도 염두에 두시기를 바랍니다. 

 

Example

다음과 같은 호모그래피가 있을 때 이 점들은 어떻게 움직이게 될까요 ?

 

점들에 Transformation matrix 를 적용하면 점들이 이동하게 됩니다. 

 

How to get Homography ? : 호모그래피 구하기

만약에 <어떤 Feature가 A 이미지에서는 [a,b] 좌표였고, B 이미지에서는 [a', b'] 좌표에 있다> 라는 정보가 주어진다면 호모그래피를 구할 수 있지 않을까요 ?

 

즉, 우리가 이 특징점들의 대응 쌍들을 알고 있다면 H 를 구할 수 있다는 것입니다.

 

그러면 A, B 를 알면 H 를 어떻게 구할 수 있을까요 ? 

H 를 구한다는 것은 다른 말로 H 만 남긴다는 것과 같습니다. 하지만 바로 계산하기에는 역행렬이 나오기 때문에 계산이 되지 않는 경우도 있습니다. 이때문에 Pseudo-inverse 로 H 를 구합니다. 

 

Pseudo Inverse

 

그런데 이게 도대체 무슨 의미냐, 이겁니다. 왜 inverse 를 곱하면 H 가 나오냐는 것입니다. 

 

그것은 모든 매칭 포인트들은 오차를 가지고 있기 때문입니다. 따라서 Pseudo inverse 를 곱한다는 것은, least-square 를 minimize하는 것과 같습니다. 

 

여기서 A 는 matrix 고 h,b 는 벡터입니다. 우리가 Ah = b 라고 했지만, '실제로는' Ah=b 가 아닐 수도 있잖아요 ?

A와 h 를 곱했을 때 b 와 오차가 있을 수 있겠지요. 그러면 그 오차를 Ah-b 라고 표현할 수 있고, 이 차이의 제곱인 (Ah-b)^2 를 최소화 하는 것이 우리가 해야 할 일입니다.

 

즉, 이 값이 h 가 주어졌을 때 오차의 제곱은 다음과 같이 표현됩니다. 

 

또한 이 값은 제곱이기 때문에 우리는 이 값의 minimum 을 알 수가 있게 됩니다. Square 은 미분값이 0 이 되는 지점이 minimum 값이죠.

 

따라서 이 값이 0 이 되는 지점에서 에러가 최소화됩니다. 

그래서 결론적으로, b 와 가장 가깝게 만드는 h 를 구하기 위해서 pseudo inverse 를 사용한다는 것입니다. 

 

더 좋은 방법

하지만 pseudo inverse 를 이용하면 그렇게 성능이 좋지가 않습니다. 왜냐면 이 방법은 Column 별로 각각 minimum 을 구하는 방법이기 때문입니다. 

 

우리가 Calibration 할 때도 비슷한 방법을 쓰는데, 이와 같이 matrix 를 least-square 방법으로 구할 때에는 "한 번에" 구할 수 있는 방법을 사용합니다. 

matrix 를 전체 한꺼번에 구하는 방법을 사용하는 것이 성능이 더 좋습니다. 

 

즉, h 를 하나의 벡터로 나타내기 위해 다음과 같은 수를 씁니다. z값을 1로 맞춰 주기 위해서 k로 나누게 됩니다. 

그러면 x_b, y_b 는 해당 점의 이미지 상의 위치가 되겠죠 ? 

포인트 당 다음과 같은 식을 2개씩 얻을 수 있습니다. 

그런데 이와 같이 전개를 하면, 조금 다른 문제를 마주하게 됩니다. 우리는 이제 Ax=0의 문제를 풀어야 합니다. 이것의 trivial solution 은x=0 이지만, 그렇게는 뭘 할 수 없겠죠 ?

 

trivial solution 이 아닌 , 0 과 가장 가깝게 만드는 x 를 찾는 문제를 우리는 SVD (Singular Value Decomposition) 을 사용합니다.

 


위 내용은 경희대학교 소프트웨어융합학과 황효석 교수님의 2023년 <3D데이터처리> 수업 내용을 요약한 것입니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.