검색결과 리스트
글
[영상 Geometry #5] 3D 변환
(3D 비전 geometry 4번째 파트 3D 변환입니다)
4. 3D 변환 (3D Transformations)
컴퓨터 비전에서 관심있는 3D 변환은 회전과 평행이동 뿐입니다 (즉, rigid 변환). 하늘에 떠 있는 비행기가 갑자기 커지거나 로보트로 변신하는 것 등은 관심사항이 아닙니다.
4.1 변환 행렬
3차원 공간의 점 (X, Y, Z)를 X축, Y축, Z축을 중심으로 θ 라디안(radian) 회전시키는 행렬을 각각 Rx(θ), Ry(θ), Rz(θ)라 하면 이들은 다음과 같다.
--- (1)
--- (2)
--- (3)
이 때, 회전방향은 아래 그림과 같이 각 축에 대해 반시계 방향이다 (오른손 주먹을 말아쥐고 엄지를 들었을 때 엄지 방향이 회전축 방향, 말아쥔 손가락 방향이 회전방향).
이제 위 3개의 기본 회전변환을 조합하면 임의의 3D 회전을 표현할 수 있다.
--- (4)
좌표축이 아닌 임의의 단위벡터 u = (ux, uy, uz)을 회전축으로 한 회전변환 행렬은 다음과 같다 (단, ux2 + uy2 + uz2 = 1) (출처: 위키피디아)
--- (5)
회전변환 R, 평행이동 t = [tx, ty, tz]T를 이용한 일반적인 3D 변환식(rigid 변환)은 다음과 같다.
--- (6)
2D 변환과 마찬가지로, 3D 변환에서도 homogeneous 좌표를 사용하면 다음과 같이 회전변환과 평행이동을 하나의 변환행렬로 즉, 선형변환 형태로 표현할 수 있다.
--- (7)
참고로, 위키피디아에 보면 어떤 행렬 R이 회전변환이 되기 위한 필요충분 조건은 RT = R-1, det(R) = 1 이라 한다.
4.2 변환관계 구하기
예를 들어 3D 공간에서 비행기 한대가 마음대로 이동한다고 했을 때, 비행기 동선의 임의의 두 지점 사이의 변환관계를 구하는 것이 목적입니다. 물론 이 변환관계는 회전변환과 평행이동만으로 표현이 가능합니다. 먼저 두 벡터 사이의 회전변환을 구하는 문제부터 시작해서 평행이동을 포함한 변환까지 구해보도록 하겠습니다.
4.2.1 회전변환 구하기
크기가 같은 임의의 두 벡터 u = [x, y, z]T, u' = [x', y', z']T가 있을 때, u을 u'로 이동시키는 회전변환은 다음과 같이 구할 수 있습니다.
--- (8)
--- (9)
--- (10)
--- (11)
θ는 두 벡터 u, u' 사이의 사잇각이며 벡터의 내적을 이용하면 손쉽게 구할 수 있습니다. 회전축이 문제인데, 회전축은 두 벡터 u, u'에 의해 결정되는 평면에 수직인 벡터 즉, 벡터의 외적을 이용하면 됩니다. 이렇게 구한 회전각 θ와 회전축 단위벡터 v를 앞서 식 (5)에 대입하면 원하는 회전변환 행렬을 구할 수 있습니다.
☞ 벡터의 개념 및 백터의 내적, 외적은 알아두면 여러모로 유용합니다. 참고로, 벡터의 외적은 http://blog.naver.com/mindo1103/90103361104 글을 참조하면 잘 설명되어 있습니다. 앞 글에서도 설명했지만 벡터의 외적 u1 × u2 란 두 벡터 u1, u2에 의해 결정되는 평면에 수직이면서(오른손 방향) 그 크기가 u1, u2를 두 변으로 하는 평행사변형의 면적과 같은 벡터를 말합니다
4.2.2 Rigid 변환 구하기
이제 회전뿐만 아니라 평행이동까지 포함한 문제로 확대해 보겠습니다.
3차원 공간에서 어떤 물체의 위치 및 방향을 유일하게 결정하기 위해서는 최소 몇 개의 점이 필요할까요?
물체 위의 3개의 점만 있으면 됩니다. 또한 마찬가지로 3차원 공간에서 움직이는 물체의 위치관계를 표현하기 위해서는 3개의 매칭쌍만 있으면 됩니다.
즉, 3D에서 rigid 변환을 결정하기 위해 필요한 매칭쌍의 개수는 3개입니다.
위 비행기 그림을 예로 들어 rigid 변환을 구하는 과정을 설명하겠습니다.
위치 A에서의 비행기 상의 임의의 점을 (x, y, z), 위치 A'에서의 대응되는 점을 (x', y', z')라 할 때, 주어진 3개의 매칭쌍 p1-p1', p2-p2', p3-p3'를 이용하여 (x, y, z)에서 (x', y', z')로의 rigid 변환관계를 구하는 것이 목적입니다 (pi = (xi,yi,zi), pj'=(xj',yj',zj')).
과정을 간략히 말로 설명하면 1) p1이 원점이 되도록 A를 평행이동 시킨 후, 2) A'의 방향과 일치되도록 회전시켜서, 3) p1'까지 평행이동시킨다 입니다.
결국 관건은 회전변환인데, 두 물체를 일치시키기 위해서는 총 2번의 회전이 필요합니다. 먼저 벡터 p1p2가 벡터 p1'p2'가 되도록 회전시킨 후 (R1), p3와 p3'이 일치되도록 한번 더 회전을 시킵니다 (R2).
--- (12)
R1은 4.2.1 회전변환 구하기 방법을 사용하면 구할 수 있습니다.
그런데 문제는 R2를 구하는 것인데, 이걸 구하는 게 쉽지가 않네요.. 이리 저리 궁리를 해 봤지만 간결한 방법은 발견하지 못했습니다. 제가 푼 방법을 간략히 설명하면 다음과 같습니다.
먼저 R1까지 적용하면 벡터 R1*p1p2와 벡터 p1'p2'가 일치됩니다. 다음으로 벡터 R1*p1p3를 회전시켜서 p1'p3'이 되도록 만들어야 합니다. 회전축은 R1*p1p2인데 회전각이 문제입니다. 벡터 R1*p1p3와 벡터 p1'p3' 사잇각을 구하는 것은 바람직하지 않습니다. 두 벡터를 R1*p1p2에 수직인 평면에 projection 시킨 후 사잇각을 구해야 합니다. projection을 직접 구하는 것은 어렵기 때문에 R1*p1p2 & R1*p1p3에 의해 결정되는 평면에 수직인 벡터(법선벡터)와 R1*p1p2 & p1'p3'에 의해 결정되는 평면에 수직인 법선벡터를 구해서 두 법선벡터가 일치되도록 회전을 시키면 됩니다. 즉, R2는 (R1*p1p2)×(R1*p1p3)를 (R1*p1p2)×p1'p3'로 회전시키는 행렬입니다.
☞ 이상으로 3D 공간에서 물체의 임의의 변환관계를 3개의 매칭쌍을 이용하여 계산하는 방법을 살펴보았습니다. 그런데 여기서 설명한 방법은 나름 구해본 방법이기 때문에 더 좋은 방법이 있을 거라 생각합니다 (지금은 모르지만). 특히 여기서 설명한 방법은 매칭쌍이 3개인 경우에만 적용가능하며 매칭쌍이 3개 이상인 경우까지는 확장이 안됩니다. 즉, 다수의 (3개 이상) 매칭쌍에 대해 이들을 가장 잘 근사하는 변환을 구할 때에는 다른 방법이 필요할 것입니다.
4.3 좌표축 변환
마지막으로 3D 공간에서 좌표축 변환 행렬을 살펴보고 글을 마무리하겠습니다.
[영상처리] - [컴퓨터 비전에서의 Geometry #1] 좌표계 에서 설명했던 월드 좌표계와 카메라 좌표계 사이의 변환이 좌표축 변환에 해당합니다.
월드좌표계 상에서 카메라 초점(카메라 좌표계의 원점)의 좌표를 (Fx, Fy, Fz), 월드좌표계의 좌표축을 카메라 좌표계 좌표축으로 회전시키는 행렬을 R이라 하겠습니다.
이 때, 월드 좌표계의 점 (X, Y, Z)을 카메라 좌표계로 봤을 때의 좌표 (Xc, Yc, Zc)는 다음과 같이 구해집니다.
--- (13)
회전변환 행렬의 경우 RTR = I 즉, R-1 = RT가 성립하므로 위 식은 아래와 같이 쓸 수 있습니다.
--- (14)
카메라 좌표계 상의 점을 월드 좌표계로 바꿀 때에도 위 식을 역으로 이용하면 됩니다.
실제로 R을 구하는 방법에 대해서는 [영상처리] - 3D 좌표계 변환 방법 (예: 월드좌표계 - 카메라 좌표계) 글을 참조하기 바랍니다.
by 다크 프로그래머
'영상처리' 카테고리의 다른 글
[영상 Geometry #6] 이미지 투영(Imaging Geometry) (92) | 2013.07.22 |
---|---|
[영상 Geometry #4] Homography 보완 (38) | 2013.07.12 |
[영상 Geometry #3] 2D 변환 (Transformations) (81) | 2013.07.08 |
설정
트랙백
댓글
글
[영상 Geometry #4] Homography 보완
앞서 설명한 [컴퓨터 비전에서의 Geometry #3] 2D 변환 (Transformations)에 대한 보완 글입니다.
내용상으로는 앞 글에 추가하는게 맞겠으나 이렇게 따로 포스팅하는게 좀더 효과적일 것 같습니다.
앞서 #3 글에서는 두 이미지 간의 2D 변환 모델에 대해 전반적으로 다뤄 보았습니다. 그런데, 앞 글에서도 언급하였지만 affine 변환과 homography는 아래 그림과 같이 비정상적인 형태로 변환이 구해질 수가 있습니다.
뒤집힘(reflection)은 affine, homography에서 모두 발생할 수 있으며 뒤틀림(twist), 오목(concave)는 homography에서만 발생할 수 있습니다.
이들을 비정상적인 형태라 한 이유는 우리가 3차원 공간에서 아무리 물체를 회전시키고 위치를 변경해도 오른쪽 형태와 같은 영상이 나올 수 없기 때문입니다. 물론 뒤집힘의 경우는 발생은 가능하지만 패턴매칭 관점에서는 역시 비정상적인 상황입니다. 평면물체의 모든 3D 변화는 homography로 표현할 수 있지만 반대로 모든 homography 변환이 실제 영상에서 일어날 수 있는 변환인건 아닙니다.
다음은 위와 같은 비정상적인 변환이 발생할 수 있는 시나리오입니다. 영상에서 도로 표지판을 검출하는 알고리즘을 개발하고자 합니다. 먼저, 표지판에 대한 영상에서 특징점(sift, surf 등)을 추출하여 DB에 저장해 둡니다. 이제 입력 영상에서 특징점을 추출한 후에 DB에 저장된 특징점들과 매칭을 수행합니다. 매칭된 특징점들 사이의 변환관계를 RANSAC(RANSAC의 이해와 영상처리 활용 참조)을 이용하여 affine이나 homography로 근사합니다. 이 때 구해진 변환관계는, 원래 매칭이 잘못되었거나 또는 RANSAC이 실패한 경우 위와 같은 뒤집힘, 뒤틀림, 오목 등이 빈번하게 발생합니다.
한 해결법은 구해진 변환이 위 경우(뒤집힘, 뒤틀림, 오목)에 해당하는지를 검사하여 만일 그렇다면 매칭에 실패한 것으로 판단하는 것입니다.
정상적인 변환인지 여부를 판단하는 방법은 다음과 같습니다.
구해진 (h9=1이 되도록 normalized된) 2D homograpy 변환이 다음과 같다고 했을 때,
--- (1)
보통 다음 조건을 하나라도 만족하면 비정상적인 변환으로 판단합니다.
___ (2)
식 (2)에서 D는 처음 2×2 부분행렬([h1 h2; h4 h5])의 행렬식 값(determinant)이고 sx는 x축 스케일 팩터(scale factor), sy는 y축 스케일 팩터, P는 perspective 정도를 나타냅니다.
Homogeneous 형태로 표현된 3×3 2D 변환행렬에서 처음 2×2 부분행렬은 회전, 스케일, shearing, reflection 파트를, [h3, h6]는 평행이동(translation)을, h7, h8은 원근(perspective) 변화를 나타냅니다.
D<0라 함은 점들 사이의 회전 순서가 지켜지지 않았음을 의미하며 뒤집힘 또는 뒤틀림이 발생했음을 의미합니다. sx는 처음 2×2 부분행렬에 의해 x축 단위벡터 [1 0]T가 얼마나 길이가 변했는지를 나타내며 sy는 y축 단위벡터의 길이(scale) 변화를 나타냅니다. 위 조건식에서 sx, sy < 0.1은 원래 물체의 크기에 비해 너무 스케일이 작아졌는지 여부를, sx, sy > 4는 너무 켜졌는지를 검사하는 것입니다. 식 (2)에 있는 스케일 조건은 참고용일 뿐이며 자신의 문제에 따라서 정상 범위를 적절히 조절하면 됩니다. 마지막으로 P는 perspective 효과(사각형이 사다리꼴로 되는 것)가 난 정도를 나타내는데, 이 값이 0이면 perspective 효과가 전혀 나타나지 않음을 의미합니다. 즉, P>0.002는 perspective가 너무 심하게 일어난 경우를 비정상적인 경우로 간주하겠다는 의미이므로 문제에 따라서는 이 조건을 사용하지 않아도 무방합니다 (또는 threshold를 적절히 조절하여 사용해도 됩니다).
단, 오목(concave)한 경우는 위 D<0 조건으로는 검사가 되지 않습니다. 오목한 경우를 알아내기 위해서는 (0, 0), (1, 0), (0, 1), (1, 0) 네 점을 처음 2×2 부분행렬로 변환시킨 후 변환된 결과가 오목한지 여부를 검사해야 합니다. 오목 여부의 판단은 [수학 이야기] - 다각형 도형의 면적(넓이) 구하기 글을 참고하세요.
Affine 변환의 경우에는 h7 = h8 = 0인 경우로서, P는 항상 0입니다. 따라서, affine 변환이 정상적인지 여부는 D, sx, sy를 구해서 위와 마찬가지로 조건을 검사하면 됩니다.
by 다크 프로그래머
'영상처리' 카테고리의 다른 글
[영상 Geometry #5] 3D 변환 (59) | 2013.07.15 |
---|---|
[영상 Geometry #3] 2D 변환 (Transformations) (81) | 2013.07.08 |
[영상 Geometry #2] Homogeneous Coordinates (24) | 2013.07.06 |
설정
트랙백
댓글
글
[영상 Geometry #3] 2D 변환 (Transformations)
(3D 비전 geometry 3번째 파트 2D 변환입니다)
변환에 대해서는 2D 변환과 3D 변환을 구분해서 설명하겠습니다. 2D 변환은 detection 또는 tracking 문제에 있어서 아래 그림과 같이 두 이미지 사이의 매칭(matching) 관계를 이미지 평면에서 직접 모델링할때 사용되는 방법입니다.
<그림 1>
이러한 2D 변환 관계를 모델링 할때, 어떤 변환 모델을 사용할지는 문제에 따라 다를 것입니다. 회전변화만을 허용할지, 스케일 변화까지 고려할지, 아니면 affine 또는 원근(perspective) 변화까지 고려할지를 잘 선택해야 합니다. 물론 perspective 변환을 사용하는 경우가 가장 일반적이긴 하지만 그만큼 자유도가 높기 때문에 잘못된 결과를 낼 가능성도 높습니다.
먼저 용어(기호)를 정의하고 넘어가면, 이미지 I에서의 점들은 X = (xi, yi), 이미지 I'에서 X에 대응되는 점들을 X' = (xi', yi'), X와 X' 사이의 변환 관계 중 회전변화(rotation)는 R, 평행이동(translation)은 T라 표기하겠습니다. 변환에 대한 기본적인 내용은 http://blog.daum.net/shksjy/228를 참조하기 바랍니다. 변환(Transformation)에 대한 전반적인 내용이 직관적으로 잘 정리되어 있습니다.
그러면 2D 변환들을 rigid 변환부터 homography까지 단계적으로 하나씩 살펴보겠습니다.
3.1 Rigid Transformation
3.2 Similarity Transformation
3.3 Affine Transformation
3.4 Homography (Projective Transformation)
3.5 OpenCV에서의 2D 변환 함수들
3.6 2D 변환 모델의 선택
3.7 참고 자료(references)
3.1 Rigid Transformation (강체 변환)
가장 기본적인 변환은 rigid(강체) 변환입니다. Rigid 변환은 다른 말로 유클리디언 변환(Euclidean transformation)이라고도 하는데, 형태와 크기를 유지한체 위치와 방향(rotation)만 바뀔 수 있는 변환입니다. 즉, 회전(rotation)과 평행이동(translation)만을 허용하는 변환입니다.
일반적인 rigid 변환을 다루기 전에 rigid 변환 중에서도 더욱 제약조건이 심한 경우부터 살펴보겠습니다.
3.1.1 평행이동(translation)만을 허용한 경우
영상 이동체 추적 문제에 있어서 추적 대상의 크기가 고정이고 회전도 일어나지 않는 경우에는 위치 변화만을 추적하면 됩니다.
--- (1)
이 경우, tx는 xi' - xi 들의 평균, ty는 yi' - yi 들의 평균으로 손쉽게 변환 관계를 구할 수 있습니다.
--- (2)
3.1.2 회전(rotation)만을 허용한 경우
(x, y)를 반시계 방향으로 θ 라디안(radian)만큼 회전시키는 변환행렬은 다음과 같습니다.
--- (3)
회전변환에서 주의할 점은 회전의 기준은 원점이라는 사실입니다. 즉, 물체가 제자리에서 도는 것이 아니라 (0, 0)을 기준으로 크게 도는 것입니다.
회전변환의 자유도(degree of freedom)는 1입니다. 따라서 하나의 매칭 쌍만 있으면 회전변환을 유일하게 결정할 수 있습니다. 그렇다면 점 (x1, y1)을 점 (x1', y1')로 회전시키는 변환행렬은 어떻게 구할 수 있을까요? 1
식 (3)을 직접 이용하는 것은 좋은 방법이 아닙니다. 회전변환은 원점을 기준으로 하기 때문에 만일 두 점의 원점과의 거리가 서로 다르다면 이러한 회전변환 행렬을 존재하지 않게 됩니다.
이 문제를 해결하는 방법은 일단 스케일(scale) 변화까지 고려하여 변환을 구한 후, 나중에 스케일 변화를 제거하는 것입니다. 스케일 변화까지를 고려한 회전변환은 일반적으로 다음과 같이 표현할 수 있습니다 (a = s*cosθ, b = s*sinθ인 셈).
--- (4)
이 식을 전개한 후에, 다시 a, b에 관해 묶으면 다음과 같은 형태로 바꿀 수 있습니다.
--- (5)
이제 식 (5)에 매칭 쌍을 하나만 대입해도 역행렬을 이용하여 a, b를 구할 수 있습니다. 만일, 매칭쌍이 여러 개인 경우에는 다음과 같이 식을 세우고 최소자승법(Least Square method) 즉, pseudo inverse를 이용하면 a, b를 손쉽게 구할 수 있습니다.
--- (6)
이렇게 a, b를 구하고 나면 스케일(scale) s와 회전각 θ는 다음과 같이 계산됩니다.
--- (7)
이제 s는 버리고 θ만 이용하면 두 점 집합 사이의 매핑 관계를 회전변환만으로 설명할 수 있게 됩니다. 물론 영상에서 물체의 크기 변화까지 허용한다면 s도 같이 이용하면 됩니다.
그런데, 실제 문제에 있어서는 이미지 원점(이미지 왼쪽 상단 모서리)을 중심으로 한 회전변환은 현실적이지 못합니다. 보통의 경우는 현재 물체의 위치에서 제자리 회전이 일어나는 경우가 대부분이겠지요.. 이런 경우는 위 회전변환만으로는 표현이 불가능하며 일반적인(general한) rigid 변환 모델을 필요로 합니다.
3.1.3 Rigid 변환
일반적인 rigid 변환을 행렬식으로 나타내면 다음과 같습니다.
--- (8)
Full rigid 변환을 이용하면 이제 임의의 회전 및 위치이동이 가능해집니다. 예를 들어, 어떤 물체가 제자리에서 θ만큼 회전하는 경우는 먼저 영상 원점을 중심으로 θ만큼 회전한 후에 원래 있던 자리로 평행이동해 오면 됩니다.
Rigid 변환은 식에서 알 수 있듯이 자유도가 3이며, 변환을 추정하기 위해서는 최소 2개 이상의 매칭쌍을 필요로 합니다. 주어진 매칭쌍들로부터 rigid 변환을 추정할 때에는 앞서 회전변환에서와 같이 일단은 스케일 변화까지 같이 고려하는 것이 좋습니다. 식 (8)을 스케일 변환까지 포함하도록 확장하여 다시 쓰면 아래와 같습니다 (a = s*cosθ, b = s*sinθ, s는 스케일).
--- (9)
이를 전개한 후, a, b, c, d에 대한 행렬식으로 다시 묶으면 다음과 같습니다.
--- (10)
--- (11)
주어진 매칭쌍들을 (x1,y1)-(x1',y1'), (x2,y2)-(x2',y2'), ... 라 할 때, 이 점들을 식 (11)에 대입하여 다음과 같은 형태로 행렬식을 세웁니다.
--- (12)
이제 식 (12)에서 역행렬(매칭쌍이 2개인 경우) 또는 pseudo inverse(매칭쌍이 2개 이상이고 전체 매칭쌍을 가장 잘 근사하는 rigid 변환을 찾을 경우)를 이용하면 a, b, c, d를 결정할 수 있습니다. 또한 앞서와 마찬가지로 식 (7)을 이용하면 스케일 s와 회전각 θ를 구할 수 있게 됩니다.
마지막으로 이렇게 구한 θ와 c, d를 식 (8)에 대입하면 우리가 원하던 rigid 변환을 얻게 됩니다. ◇
여기서 한가지 짚고 넘어갈 점이 있습니다. 식 (8)에서 제가 평행이동(translation) 부분을 [tx, ty]라 쓰지 않고 [c, d]라 한 이유가 있습니다. 그건 [c, d]가 물체의 평행이동량 뿐만 아니라 (영상원점을 중심으로 한) 회전변환으로 인한 이동량까지 같이 포함된 값이기 때문입니다.
그렇다면 위에서 구한 rigid 변환으로부터 실제 물체가 얼마나 평행이동했는지를 알아낼 수 있을까요? (물체가 얼마나 이동했는지 알아내는 것은 영상 이동체 추적 분야에서는 매우 중요한 문제입니다)
사실 이 부분에서 저도 굉장히 햇갈렸는데.. 저의 결론은 rigid 변환식 자체에서는 알아낼 수 없다 입니다. 예를 들어, 아래 탁구라켓 그림을 살펴보도록 하죠. 만일 아래 그림과 같이 영상 내에서 탁구 라켓이 이동했다면 이 라켓의 평행이동량은 얼마일까요?
<그림 2>
조금만 생각해 보면 이건 어떤 절대적인 문제가 아니라 기준의 문제임을 파악할 수 있을 것입니다. (만일 라켓의 손잡이만 놓고 본다면 평행이동량은 꽤 큽니다. 하지만 라켓의 라바 부분만 놓고 보면 이번엔 평행이동량이 매우 작습니다).
사실 무엇을 기준으로 삼을지는 우리의 주관의 영역이며 그 기준에 따라 평행이동량은 다르게 계산될 수 있습니다. 하지만 문제는 rigid 변환은 우리가 무엇을 기준으로 삼는지에 관계없이 수식적으로 유일하게(동일하게) 결정된다는 점입니다. rigid 변환을 결정하기 위해서는 매칭쌍 2개만 있으며 되기 때문에, p1-p1'과 p2-p2'을 이용해 구한 rigid 변환과 p2-p2', p3-p3'을 이용한 rigid 변환이 동일해야 합니다. 또한 p1-p1', p2-p2'에서 구한 rigid 변환으로 p3를 변환시키면 p3'이 나와야 합니다.
결론적으로 rigid 변환식 자체에서는 평행이동량을 구할 수 없습니다. 그렇다면 평행이동량(또는 물체의 변화된 새로운 위치)을 어떤 식으로 구해야 할까요?
그건 우리가 정한 기준점이 rigid 변환에 의해 어디로 이동하는지를 살펴보면 될 것입니다 (기준점은 당연 물체의 무게중심으로 잡는게 좋겠죠..)
3.2 Similarity Transformation (닮음 변환)
Similarity 변환 즉, 닮음 변환은 rigid 변환에 추가적으로 스케일 변화까지 허용한 변환입니다 (중학교때 배우는 닮은 도형을 생각하면 됩니다). 즉, similarity 변환은 회전(rotation), 평행이동(translation), 크기변화(scaling)로 구성되는 변환이며 앞서 나왔듯이 그 일반식은 다음과 같습니다 (단, a2+b2≠0).
--- (13)
Similarity 변환의 자유도는 4이며 similarity 변환을 유일하게 결정하기 위해서는 2개의 매칭쌍이 필요합니다. 2
Similarity 변환은 사실 rigid 변환에서 이미 모두 다루었기 때문에 여기서 다시 설명할 필요는 없을 것 같습니다. 다만 여기서는 위 회전, 평행이동, 스케일변화를 하나의 단일(single) 행렬로 표현할 수 있는 homogeneous 표현법에 대해서만 언급하고 넘어가겠습니다.
[컴퓨터 비전에서의 Geometry #2]에서 다루었던 homogeneous 좌표 표현을 사용하면 similarity 변환은 다음과 같이 하나의 행렬 변환으로 표현될 수 있습니다.
--- (14)
즉, 회전, 스케일링, 평행이동이 행렬 변환 하나로 표현된 것입니다.
X' = AX인 행렬 A는 X에서 X'로의 선형 변환(linear transformation)입니다. 이렇게 homogeneous 형태의 선형변환으로 표현했을 때 가장 큰 장점은 여러 변환들을 행렬 곱으로 자유롭게 결합(composition)할 수 있다는 점입니다. 예를 들어 변환 A1, 변환 A2, 변환 A3를 순서대로 적용하는 것은 X' = A3A2A1X가 되며, 또한 A = A3A2A1인 행렬을 구해서 X' = AX와 같이 하나의 변환으로 표현할 수도 있습니다.
3.3 Affine Transformation
Affine 변환은 직선, 길이(거리)의 비, 평행성(parallelism)을 보존하는 변환이며 그 일반식은 다음과 같습니다.
--- (15)
또는 다음과 같은 homogeneous 형태로도 표현할 수 있습니다.
--- (16)
좀더 쉽게 말하면 Affine 변환은 회전, 평행이동, 스케일 뿐만 아니라 shearing, 반전(reflection)까지를 포함한 변환입니다.
Affine 변환의 자유도는 6이고, 따라서 3쌍의 매칭쌍이 있으면 affine 변환을 유일하게 결정할 수 있습니다. 임의의 세 점 (x1,y1), (x2,y2), (x3,y3)를 (x1',y1'), (x2',y2'), (x3',y3')로 매핑시키는 affine 변환은 다음과 같이 계산할 수 있습니다 (식 15를 전개하여 a,b,c,d,e,f에 대해 묶은 후 세 점을 대입).
--- (17)
물론 매칭쌍이 3개 이상인 경우에는 pseudo inverse를 이용하여 affine 변환을 구할 수 있습니다.
2D 평면에서의 affine 변환을 직관적으로 이해하는 한 방법은 임의의 삼각형을 임의의 삼각형으로 매핑시킬 수 있는 변환이 affine이다 (단, 평행성을 보존하면서) 라고 이해하는 것입니다.
<그림 3>
평행성을 보존한다는 의미는 예를 들어 위 그림과 같이 점 p1, p2, p3를 p1', p2', p3'으로 매핑시키는 affine 변환을 구했을 때, 이 affine 변환을 가지고 p4를 매핑시키면 p4'이 나와야 한다는 의미입니다.
정말 그렇게 되는지는 식 (15)를 가지고 설명해 보겠습니다. 식 (15)를 X'=AX+B로 놓고 p1, p2, p3를 가지고 affine 변환 즉, A와 B를 결정했다고 해 보죠. 그러면 p1' = Ap1 + B, p2' = Ap2 + B, p3' = Ap3 + B는 당연히 만족해야 하는 것입니다. 벡터 p1p4 = p1p2 + p1p3이므로 p4 = p2 + p3 - p1입니다. 따라서 p4의 affine 변환인 Ap4 + B는 A(p2+p3-p1) + B = Ap2 + Ap3 - Ap1 + B = (p2'-B) + (p3'-B) - (p1'-B) + B = p2' + p3' - p1'가 됩니다. 즉, p4가 p2' + p3' - p1'으로 매핑된다는 것인데, p2'+p3'-p1'은 바로 p1'p2', p1'p3'을 두 변으로 하는 평행사변형의 꼭지점입니다.
사실 여기까지는 수학적인 관점에서의 내용이고 정작 중요한 것은 과연 affine 변환이 우리가 풀고자 하는 문제에 있어서 영상에서의 물체의 변화를 모델링하기에 가장 적합한 모델이냐 여부일 것입니다. 특히나 affine 변환부터는 reflection 즉, 뒤집힘이 허용되기 때문에 이러한 자유도가 문제에 득이 될지 실이 될지를 잘 따져보고 모델을 선택해야 할 것입니다.
3.4 Homograpy (Projective Transformation)
Planer surface 물체의 경우에는 3D 공간에서의 2D 이미지로의 임의의 원근투영변환(perspective projective transformation)을 두 이미지 사이의 homography로 모델링할 수 있습니다. 즉, 어떤 planar surface가 서로 다른 카메라 위치에 대해 이미지 A와 이미지 B로 투영되었다면 이미지 A와 이미지 B의 관계를 homography로 표현할 수 있다는 것입니다.
그래서 homography를 planar homography라고도 부르며, homography는 평면물체의 2D 이미지 변환관계를 설명할 수 있는 가장 일반적인 모델입니다. 또한 Homography는 projective transformation과 같은 말입니다.
Homography는 homogeneous 좌표계에서 정의되며 그 일반식은 다음과 같습니다.
--- (18)
Homography는 자유도가 8이며 따라서 homography를 결정하기 위해서는 최소 4개의 매칭쌍을 필요로 합니다. Homography의 자유도가 9가 아니라 8인 이유는 (x,y,1), (wx',wy',w)이 homogeneous 좌표이므로 homography의 scale을 결정할 수 없기 때문입니다 (∵ homography 변환 X'=HX에서 X, X'은 homogeneous 좌표이기 때문에 X'=kHX도 성립하게 됩니다. 즉, H가 homography 행렬이라면 임의의 0이 아닌 k에 대해 kH도 또한 동일한 homography 행렬이 됩니다).
주어진 매칭쌍들로부터 homography를 실제 구하는 과정에 대해서는 Elan Dubrofsky, "Homography Estimation", 2009 글을 참조하기 바랍니다. Homography를 구할 수 있는 다양한 방법들이 잘 정리되어 있습니다.
Homography를 직관적으로 이해하기 위한 한 좋은 방법은 2D 평면에서 임의의 사각형을 임의의 사각형으로 매핑시킬 수 있는 변환이 homography다 라고 생각하는 것입니다. 물론 사각형이 뒤집혀질 수도 있습니다.
<그림 4>
3.5 OpenCV에서의 2D 변환 함수들
OpenCV에서는 다음과 같이 homography만 3×3 행렬로 표현하고, affine 등 그 외 변환은 2×3 행렬로 표현합니다 (두 행렬 모두 원소 타입은 double 입니다, CV_64FC1).
--- (19)
--- (20)
OpenCV에서 2D 변환과 관련된 함수들을 정리해 보았습니다.
- estimateRigidTransform(): 다수의 매칭쌍으로부터 similarity 변환이나 affine 변환을 구할 때 사용 (파라미터로 선택 가능). 내부적으로 RANSAC을 이용. opencv2/video/video.hpp
- getAffineTransform(): 3쌍의 입력 매칭쌍으로부터 affine 변환을 구해줌. opencv2/imgproc/imgproc.hpp
- invertAffineTransform(): affine 변환의 역변환을 구해줌, opencv2/imgproc/imgproc.hpp
- getPerspectiveTransform(): 4쌍의 입력 매칭쌍으로부터 homography 행렬을 계산해 줌. opencv2/imgproc/imgproc.hpp
- findHomography(): 다수의 매칭쌍으로부터 homography 행렬을 계산해 줌 (근사 방법은 전체 데이터 fitting, RANSAC, LMedS 중 선택), opencv2/calib3d/calib3d.hpp
- transform(): 2×2 또는 2×3 변환행렬(similarity, affine 등)을 이용하여 좌표변환을 할 때 사용
- perspectiveTransform(): 3x3 homography 변환행렬 또는 4×4 변환행렬을 이용하여 좌표변환을 할 때 사용
이 외에 OpenCV API 목록에는 없지만 opencv/modules/video/src/lkpyramid.cpp에 보면 icvGetRTMatrix 라는 함수가 하나 숨어있습니다. 이 함수를 이용하면 RANSAC이 아닌 전체 매칭쌍을 근사한 similarity 변환 또는 affine 변환을 구할 수 있습니다.
3.6 2D 변환 모델의 선택
그러면 실제 자신의 영상인식 문제에 사용할 2D 변환 모델을 선택할 때 고려할 사항 또는 참고사항을 몇 가지 적어보겠습니다.
먼저, homography는 위 <그림 1>의 고양이 그림판과 같은 planar한 물체에 대한 변환 모델입니다 (homography 뿐만 아니라 affine, similarity 등도 모두 평면형 물체에 대한 변환 모델입니다). 따라서 주사위 등과 같은 3차원 (입체) 물체의 매핑 관계는 homography만으로는 표현이 안됩니다 (이 경우는 3D 변환 모델이 필요할 것입니다). 물론 주사위의 각각의 면은 homography로 매핑시킬 수 있습니다. 그렇다고 3D 물체에 2D 변환을 사용하지 못하는 것은 아닙니다. 카메라에 아주 근접한 경우가 아니라면 대부분의 물체는 평면으로 가정해도 큰 무리가 없기 때문입니다. 예를 들어, 사람 얼굴을 찾거나 추적하는 경우에 고개를 옆으로 돌리지 않는 한 얼굴 모습은 크게 바뀌지 않습니다.
Homography는 가장 일반적인 2D 변환 모델이며 planar한 물체의 모든 가능한 3D 변화를 표현할 수 있는 모델입니다. 하지만 일반적인 만큼 데이터에 overfitting 될 수 있는 위험성도 가지고 있습니다. 따라서 이 위험도를 줄이기 위해서는 문제의 특성에 따라 가능한 낮은 자유도의 변환을 사용하는 것이 좋습니다. 하지만 위 <그림 1>처럼 3D 공간에서 자유롭게 움직이는 물체를 검출하기 위해서는 어쩔 수 없이 homography를 사용해야 합니다.
Detection과 Tracking의 차이. Detection 문제에 있어서는 문제 특성에 따라 적절한 변환을 선택하면 되지만, tracking의 경우에 있어서는 3D 모션이 있더라도 굳이 homography를 사용할 필요가 없으며 대부분 similarity나 affine으로 충분합니다. 그 이유는 인접한 영상 프레임 사이에는 변화가 그리 크지 않기 때문입니다.
마지막으로, homography나 affine을 사용하면 가끔 말도 안되게 매핑이 되는 경우를 종종 발견할 수 있을 것입니다. 그 경우는 바로 매핑이 뒤집혀진(reflected) 경우인데, 그건 affine과 homography가 reflection을 포함하기 때문입니다. 그런데 영상인식 관점에서는 이 reflection이 불필요한 경우가 대부분입니다. 예를 들어, <그림 1>에서 고양이 그림판이 뒤집혀서 뒷면이 보이는 경우까지를 고려하는게 합당할까요? DB에 저장된 고양이 그림과 그림판의 뒷면(뒷면에는 과연 뭐가 있을까요?)을 매칭시키는 것은 패턴매칭 관점에서 말도 안되며 가능하지도 않습니다. 따라서 homography나 affine을 사용할 경우에는 추정된(estimated) 변환에 reflection이 포함되었는지를 조사하여 reflection이 들어간 경우에는 추정이 잘못된 것으로 판단하는게 좋습니다.
3.7 참고 자료(references)
http://blog.daum.net/shksjy/228
Elan Dubrofsky, "Homography Estimation", 2009
by 다크 프로그래머
'영상처리' 카테고리의 다른 글
[영상 Geometry #4] Homography 보완 (38) | 2013.07.12 |
---|---|
[영상 Geometry #2] Homogeneous Coordinates (24) | 2013.07.06 |
[영상 Geometry #1] 좌표계 (113) | 2013.07.06 |