ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Perception] 2-2. Compute Projective Transformations
    CV & ML 2021. 12. 14. 11:21

    오늘은 이미지 변환 중 3D 공간의 평면 물체 (planar objects)를 2D 평면으로 투영하는 변환인 Projective Transformation(투영 변환)을 계산하는 방법에 대해 알아보도록 하겠습니다. 

     

    투영 변환 외에 이미지 변환 종류에 대해 더 자세하게 알고 싶으신 분들은 아래 블로그를 참고해주시길 바랍니다. 

    이미지 변환 종류와 호모그래피

    다크 프로그래머 Geometry #3 2D변환

     

     

    로봇에 장착된 카메라로 평면 물체를 촬영 

    위의 그림은 어떤 로봇이 움직이면서 카메라를 통해 평면 모양의 패턴을 촬영한 상황입니다. 각각의 영상에서 Projective Transformation 행렬을 알게 된다면 실제 공간에서 로봇이 어디에 위치하는지, 패턴은 어디에 위치하는 지를 추정할 수 있습니다.

    이 투영 변환은  역으로 변환이 가능한 행렬이라는 전제가 있습니다.

     

     

    평면 물체의 한 점 $p$이 있다고 할 때, 동차좌표계를 이용해서 나타내기 때문에 3x1 행렬이고, 이 $p$를 투영 변환 행렬$A$로 연산했을 때 나타나는 새로운 점 $p^{'} $는 $Ap$로 맵핑할 수 있습니다. 

     

    행렬 A는 역변환이 가능해야 하므로, $\det (A) \neq 0$   이고, 동차좌표계에서 scale factor를 의미하는 $\lambda$를 이용하여 점 $p^{'}$을 다음과 같이 표현할 수 있습니다.

    $$ \lambda p^{'} = A p $$

     

    이 변환은 collineation(공선형) 변환 혹은 'homography 변환 이라고도 부릅니다. 

    collineation은 선은 선으로 투영된다는 의미입니다.

    예를 들면, 어떤 3점이 같은 선에 존재한다 할 때, 투영변환 후에도 (위치는 다르지만) 3점 모두 같은 선에 여전히 위치한다 성질을 의미합니다. 그리고 같은 선에 존재하고 있는 점들을 'collinear points'라고 부릅니다.

     

    이 투영변환에서는 한 시점에서 찍힌 평행선들은 2D 영상에서 하나의 소실점으로 수렴하게 되는데, 다른 시점에서 이 평행 선들을 찍어도 여전히  하나의 소실점으로 모두 수렴됩니다. 이러한 선들을 'concurrent lines'라고 부릅니다. 

     

    선을 투영변환할 때는 어떻게 나타낼 수 있을까요?변환 전에 직선의 방정식을 다음과 같이 나타낸다고 했을때,$ l^{\top} p = 0$투영 변환 $A$ 후의 직선 방정식은  점 $p^{'}$를 이용하여 나타내면, (이 부분을 잘 모르겠다. 어쨌든 점으로 이루어진게 선이긴 한데, 기울기는 유지되면서 점을 변환한 걸 그대로 기울기에 행렬곱하면 된다?)$$ p^{'} = {1 \over \lambda} A p $$$$ p = \lambda A^{-1}  p^{'} $$ $$ l^{\top} \lambda A^{-1} p^{'} = 0 $$

     

     

    상수 부분인 $\lambda $ 를 나누어주면 다음과 같은 식으로 나타낼 수 있습니다. 

     

    $$l^{\top} A^{-1} p^{'} = 0 $$

     

    위의 식을 토대로 투영 변환된 직선 $l^{'}$는 다음과 같이 나타내줄 수 있습니다.

    $$ l^{'} = A^{-\top} l $$

     

     

    실제 물체의 월드 좌표계를 알고 있을 때

    타일 무늬를 가지고 있는 바닥이 다음과 같이 있다고 합시다.

    왼쪽은 타일 무늬를 원래 모양이고, 오른쪽은 특정 시점에서 찍은 사진이다.

    바닥 타일 부분에서 점을 뽑아 왼쪽에 맵핑하면 다음 그림과 같이 나타낼 수 있다. 두 영상의 변환 관계를 안다면, 왼쪽에 있는 영상을 오른쪽에 나타낼 수 있고, 그 반대도 마찬가지다. 

     

     

    투영변환을 계산하기 위해서 먼저 2D 영상에서 직교하는 X와 Y축에 해당하는 소실점을 각각 찾습니다.

    그림에 나타난 점 A는 물리적 세계에서 X축으로 평행하는 선들인 민트색 부분이 영상에서 수렴하는 소실점입니다. 무한대를 나타내는 점이기 때문에 $z = 0$ 이며, Y축 위치는 0이기 때문에  동차좌표로는 $(1, 0, 0)$으로 나타낼 수 있습니다. 영상 좌표에서는 유한 값을 따로 갖고 있습니다. 

    점 B는 물리적 세계에서 Y축으로 평행하는 선들(보라색)이 영상에서 수렴하는 소실점입니다. 이 점도 무한대를 나타내기 때문에 $z = 0$이고 X축 위치는 0이라서 동차 좌표는 $ (0, 1, 0) $ 입니다. 

     

    바닥에 있는 타일의 원점 C를 강의에서는 $ (0, 0, 1)$ 로 나타내고 있습니다.

     

    우측 상단은 $(1, 1, 1)$이고, 영상에서는 점 $D$로 나타납니다.

     

    월드좌표계 $(1, 0, 0), (0, 1, 0), (0, 0, 1)$ 을 투영 변환 $A$ 에 의해 동일한 선에 있지 않은 점 A, B, C으로 맵핑됩니다. 

    다음 식에서 $a, b, c$는 각각 점 A,B,C를 의미합니다. ($a, b, c$ 각각은 3x1 행렬로 보고 있는데 정확해지면 다시 정리해놓겠습니다.)

    소실점 A,B와 원점 C을 투영 변환한 식

    변환 행렬 $A$는 $(\alpha a $     $\beta  b$     $\gamma c)$ 로 나타낼 수 있습니다.

    동차좌표계이기 때문에 $\alpha, \beta, \gamma$ 를 곱해도 결국 $(a,b,c)$ 같은 좌표입니다.

    $A$를 구하기 위해서는 4번째 점이 필요합니다. 이 때 우리는 월드 좌표계 $(1,1,1)$과 영상 안에 점 D를 이용합니다.

    식을 나타내면 다음과 같이 나타납니다. $\lambda$는 동차좌표계이기 때문에 scale factor로서 곱해주었습니다. 

     

    $a, b, c$가 동일한 선에 위치한 점이 아니기 때문에 ${\alpha \over \lambda}, {\beta \over \lambda}, {\gamma \over \lambda} $ 모두 다른 값이므로, 식의 단순화를 위해 $\lambda$는 1로 설정해줍니다. $d$에 관한 식을 행렬로 분해해주면 다음과 같아집니다.

     

     

    실제 물체의 월드 좌표계를 모를 때는 어떻게 해야 할까?

     

    예를 들어, 다음 그림과 같이 실제 세계에선 사각형 물체지만 2D 영상 안에 찍힌 모습만 알고 있을 때는 어떻게 변환 행렬을 구해주면 될까?

    다른 시점으로 촬영된 물체 간 투영 변환

    점 $(a,b,c,d)$를 $ (a^{'}, b^{'},c^{'},d^{'}) $ 을 맵핑한다는 관계로 투영 변환을 찾아야 합니다.

    이 때는 가상의 점 4개를 도입합니다. $(1,0,0), (0,1,0), (0,0,1), (1,1,1)$ 인 4개의 canonical 점들을 활용하여, 사진에 있는 점 $ a,b,c,d $ 투영하는 변환을 $ T $라고 가정하면, 

    점 $(1,0,0)$을 $ a $로 투영하는 변환 $T$은 다음 식으로 나타낼 수 있습니다.

     

    점 $ b, c, d $는 각각 $T(0,0,1)^{\top}$, $T(0,1,0)^{\top}$, $T(1,1,1)^{\top}$ 으로 나타낼 수 있습니다.

     

    오른쪽 영상에서 점 $(1,0,0)$을 점 $a^{'}$로 투영한 변환을 $T^{'}$이라고 하면 다음과 같이 나타낼 수 있습니다.

    그럼 왼쪽 영상에서 오른쪽 영상으로 맵핑하는 투영 변환을 구하기 위해서 $(1,0,0)^{\top}$는 $T^{-1} a$로 맵핑할 수 있습니다. 그럼 $a^{'}$는 다음 식으로 나타날 수 있습니다.

     

    요번 강의에서는 실제 물체를 월드 좌표계로 표현할 수 있을 때와 없을 때 어떻게 투영변환을 계산할 지에 대해 알아보았습니다. 공부하는 중이다 보니 아직까지는 설명이 모호한 부분들이 많은 것 같습니다. 계속 공부하면서 오류가 생긴 부분들은 추후에 계속 고칠 수 있도록 하겠습니다. 수정할 부분이 보이시면 언제든 댓글로 남겨주세요.

    댓글

Designed by Tistory.