영상의 기하학적 해석 - 영상의 지면 투영(ground projection)

영상처리 2016. 7. 17. 12:05

카메라 영상에서 사람이나 자동차를 찾았을 때, 찾은 물체가 카메라로부터 실제로 얼마나 멀리 떨어져 있고 또 키는 얼마나 큰지 알아내는 것은 영상기하학의 가장 빈번한 응용 중 하나이다.


예를 들어, CCTV 카메라에 잡힌 물체의 실제 거리와 크기를 알아내거나 자동차에 달린 블랙박스 카메라에서 전방의 물체를 자동으로 인식해서 물체의 크기 및 남은 거리, 이동속도를 추정하는 것 등이 있다.


그림 1. 출처: https://users.ece.cmu.edu/~hyunggic/vision_detection_tracking.html


그런데 이러한 영상해석 응용은 그 활용성에 비해서 관련자료나 설명자료 등이 거의 없고 아무래도 수학적(기하학적) 해석이 필요하다 보니 손쉽게 접근하기도 어렵다.


이 글에서는 영상에서 찾은 물체가 카메라를 기준으로 실제 얼마나 멀리 떨어져 있고 또 크기는 얼마인지 구할 수 있는 구체적 방법들을 정리해 본다.


먼저, 들어가기 앞서 다음의 두 글을 읽어보면 좋다 (전파거북이님 말씀처럼 다음 두 글의 내용을 모르고 이 글을 읽으면 본인이 바보로 느껴질 수 있습니다 ^^).



문제 정의


아래 그림과 같이 영상에서 자동차와 보행자를 찾았다고 하자.


그림 2. 물체 기준점


알아내고 싶은 것은 이들 물체가 카메라로부터 실제 얼마나 멀리 떨어져 있고 또 크기(폭, 높이)는 얼마인가이다. 그런데 여기서 물체의 '위치'는 3D 좌표가 아니라 2D 좌표임에 주의해야 한다. 이 문제에 있어서 불변의 가정은 '물체는 땅(지면)에 붙어있다' 이다. 그리고 우리가 구하고자 하는 물체의 위치란 물체가 지면과 맞닿은 지점(중점)의 2D 좌표이다 (그림에서 A 지점).


따라서, 풀고자 하는 문제는 영상내 임의의 영상좌표(픽셀좌표)에 대해 대응되는 2D 지면좌표(ground plane coordinate)를 구하는 문제로 귀결된다. 일단 물체의 위치(지면좌표)가 구해지면 물체의 크기(폭, 높이)는 간단한 비례식을 통해 손쉽게 계산될 수 있다.


정리하면, 이 문제의 가정은 1) 카메라의 높이와 방향이 고정되어 있다(벽에 붙어 있거나 자동차에 부착된 경우 등), 2) 물체는 항상 지면에 붙어 있다, 3) 카메라 파라미터(렌즈 왜곡계수, 높이, 각도 등)를 미리 알고 있다 이고 풀고자 하는 문제는 임의의 영상좌표에 대응되는 2D 지면좌표를 구하는 것이다.



접근 방법들


크게 3가지 접근 방법이 가능하다. 그것은 손과 연필을 이용해 기하학적으로 직접 푸는 방법, 호모그래피(homography)를 이용한 방법, 3D 변환을 이용한 방법이다. 문제에 대한 전반적인 이해를 위해 직접적인 기하학적 계산 방법부터 시작한다.



방법 1. 직접적인 기하학적 계산 방법


사실 직접 손으로 계산하는 방법이 가장 복잡하고 설명도 어렵다. 그래도 영상의 기하학적 이해에는 가장 도움이 된다.


먼저, 아래 그림을 살펴보자. 영상좌표 p에 대응되는 지면좌표를 P라 하면 카메라 원점과 p, P는 그림과 같이 일직선상에 존재한다.



그림 3. 영상좌표의 지면투영


카메라 내부파라미터(초점거리 fx, fy, 주점 cx, cy), 지면에서의 높이(h), 카메라의 틸트(θtilt)는 주어져 있다고 가정한다 (θtilt는 카메라 방향이 지면과 수평일 때 0, 위쪽을 바라볼 때 +, 아래쪽을 바라볼 때 -).


☞ 카메라의 높이와 틸트는 external camera calibration을 통해 구할 수 있다 (Extrinsic Camera Calibration - 카메라의 위치 및 자세 파악 글 참조)


입력 영상 픽셀좌표를 p(x,y), 대응되는 지면좌표를 P(X, Y)라 하자.


먼저 카메라의 내부파라미터에 대한 영향을 없애기 위해 픽셀좌표를 정규좌표로 변환한다.


 --- (1)


구해진 정규좌표 (u, v)와 카메라 높이 h, 틸트 θtilt를 이용한 이후의 계산과정은 아래와 같다 (앞서 두 글에 대한 이해와 상상력을 믿고 자세한 설명은 생략한다). 정규 이미지 평면에서는 주점의 좌표가 c(0, 0)이 되고 이미지 평면과 카메라 원점과의 초점거리가 1이 됨에 주의한다.


그림 4. 기하학적 계산 과정


위 계산 결과에서 d는 카메라 원점과 물체와의 지면에서의 직선거리, θ는 카메라 광학축을 기준으로 한 물체의 방향각이다 (카메라 광학축을 기준으로 왼쪽이 +, 오른쪽이 -). 이를 top-view로 보면 아래 그림과 같다.


그림 5. top-view 관계도


여기까지 해서 물체가 카메라로부터 어떤 방향(θ)에 있고 얼마나 떨어져(d) 있는지 계산되었다.


마지막으로 물체의 위치를 지면좌표로 표현하면 다음과 같다 (단, 카메라 위치를 지면좌표계의 원점, 광학축 방향을 X축으로 가정했을 때의 좌표).


 --- (2)


※유의사항

  • 여기서 설명한 기하학적 방법은 카메라의 roll이 0인 경우에만 성립하며 카메라의 roll이 0이 아닌 경우에는 방법2나 방법3을 이용해야 함
  • 최종 계산된 P(X, Y)는 지면좌표계를 어떻게 정의하느냐에 따라 달라질 수 있는 값이며 여기서는 카메라 원점을 지면에 수직으로 투영시킨 점을 원점, 카메라 광학축 방향을 X축으로 잡았을 경우의 좌표임


☞ 물체의 크기를 구하는 방법은 나중에 일괄적으로 설명합니다.



방법2. 호모그래피(Homography)를 이용한 방법


호모그래피(homography)를 이용한 방법은 실용적으로 가장 간편한 방법이며 특별한 이론적 지식 없이도 활용 가능하다. 그 핵심은 몇몇 샘플링 된 영상좌표들에 대해서 대응되는 지면좌표를 실측을 통해 구한 후 여기서 얻어진 영상좌표→지면좌표 변환관계를 다른 경우에도 일반화하여 적용하는 것이다.


구체적 방법에 들어가기 앞서 먼저 호모그래피(homography)의 개념부터 살펴보자.


호모그래피(homography) ― 한 평면을 다른 평면에 투영(projection)시켰을 때 투영된 대응점들 사이에는 일정한 변환관계가 성립하는데 이 변환관계를 호모그래피라 부른다.



그림 6. 호모그래피(Homoggraphy)


호모그래피(homography)는 3×3 행렬로 표현되며 대응점들의 동차좌표(homogeneous coordinate) 표현에 대해 성립하는 변환관계이다. 즉, 한 평면 위의 점들 (x1, y1), (x2, y2), ... 이 다른 평면 위의 점들 (x1', y1'), (x2', y2'), ... 로 각각 투영되었다면 이들 대응점들 사이에는 다음 관계식을 만족하는 3×3 호모그래피 행렬 H가 항상 존재하고 또 유일하게 존재한다 (단, scale factor는 무시할 경우).


 --- (3)


단, s는 동차좌표(homogeneous coordinate) 표현에 있어서 scale factor. 동차좌표 표현에 대해서는 [영상 Geometry #2] Homogeneous Coordinates 글을 참조하기 바란다.


여기서, H가 유일하게 존재한다는 점에 주목할 필요가 있다. 이 말은 p1, p2, p3, p4를 이용해서 H를 구하나 p2, p3, p4, p5를 이용해서 H를 구하나 그 결과가 동일하다는 뜻이다 (일반적으로 호모그래피를 결정하기 위해서는 4개의 대응쌍이 필요하다). 그리고 이 말이 함축하는 중요한 의미는 임의의 네 대응쌍을 이용해서 구한 H를 다른 모든 점들에 대해서도 동일하게 적용할 수 있다는 것이다.


예를 통해 살펴보자. 아래 그림과 같이 마우스패드에 대한 서로 다른 시점의 두 이미지 A, B가 있다. 두 이미지에서의 4개의 대응쌍 p1-p1', p2-p2', p3-p3', p4-p4'을 찾아서 이들 대응 좌표들로부터 호모그래피(homography) H를 구했다고 하자. 이 때, 이렇게 구한 H는 다른 점들에 대해서도 동일하게 적용된다. 즉, p5에 대응되는 점의 이미지 B에서의 좌표는 H*p5로 구할 수 있다. 그리고 p5 뿐만 아니라 다른 모든 마우스패드 상의 대응점들에 대해서도 p' = Hp가 성립한다.


그림 7. 호모그래피 예


앞서 호모그래피(homography)는 투영관계에 있는 두 평면 사이의 변환관계라 했다. 그런데 그림 7의 예에서는 서로 다른 두 이미지에 투영된 마우스패드 좌표들 사이의 대응관계에 호모그래피를 사용하였다. 어떻게 된 것일까?


호모그래피(homography)는 직접적인 투영관계에 있는 두 평면 사이에서뿐만 아니라 투영관계에 의해 직·간접적으로 연결되는 모든 평면들 사이에서도 일반적으로 성립한다. 즉, 한 평면을 평면 A와 평면 B에 각각 투영했을 때, 평면 A에 투영된 좌표와 평면 B에 투영된 좌표 사이에서도 호모그래피(homography)가 성립한다. 그 이유는 원래 평면에서의 좌표를 p, 평면 A에 투영된 좌표를 p', 평면 B에 투영된 좌표를 p'', 원래 평면과 평면 A와의 호모그래피를 H1, 평면 B와의 호모그래피를 H2라 하면 p' = H1p, p'' = H2p = H2(H1-1p') = H2H1-1p'가 성립한다. 즉, 평면 A와 평면 B 사이에는 호모그래피 H = H2H1-1가 성립한다. 앞서 그림 7은 마우스패드라는 평면 위의 점들이 두 이미지 평면 A, B에 투영된 경우로서 역시 호모그래피가 성립한다.


그림 8. 이미지 평면 사이의 호모그래피


호모그래피(homography)를 사용하는데 있어서 한가지 주의할 사항은 호모그래피는 평면형 물체에 대해서만 성립한다는 점이다. 만일 마우스패드가 아니라 선풍기, 자동차, 아파트 등과 같이 입체를 가진 물체에 대해서는 호모그래피가 성립하지 않는다 (물론 아파트의 한쪽 벽면만 고려할 경우에는 호모그래피가 성립한다).


☞ 풀고자 하는 문제의 경우 지면과 이미지 평면과의 관계이므로 호모그래피가 성립한다.


원래 문제로 돌아가서 호모그래피(homography)를 이용해서 영상에서 검출된 물체의 실제 위치를 구하는 방법은 다음과 같다.


먼저, 카메라 시야 내에서 바닥에 임의의 네 점을 잡고 이들의 지면좌표를 실측을 통해 측정한다. 지면좌표계의 기준(원점 등)은 자신이 원하는데로 잡는다. CCTV 등과 같이 건물 내에 고정된 카메라라면 벽의 한쪽 모서리 등을 원점으로 잡는게 실측에 편리할 것이고 자동차에 부착된 카메라라면 자동차의 앞바퀴 중심이나 카메라를 원점으로 잡는게 편할 것이다. 어쨌든 자신이 잡은 기준(지면좌표계)에 맞춰 네 점의 지면좌표를 측정한 후 해당 점들의 영상좌표(카메라 이미지에서의 픽셀좌표)를 구한다.


픽셀좌표로부터 지면좌표로의 호모그래피 변환행렬 H의 계산은 opencv의 findHomogray함수를 이용하거나 또는 아래 코드를 이용해서 직접 계산한다 (4쌍의 대응점으로부터 호모그래피를 직접 계산해주는 함수코드를 참고용으로 올린다).


homography.txt


호모그래피 행렬 H가 얻어지면 이후의 과정은 간단하다. 임의의 영상 픽셀좌표 p(x, y)에 대응되는 지면좌표는 p를 동차좌표로 확장한 (x, y, 1)에 H를 곱한 결과를 다시 2d 좌표로 변환하면 얻어진다. 즉, H*(x, y, 1)T = (a, b, c)T라면 구하고자 하는 지면좌표는 (a/c, b/c)가 된다. 


※ 참고사항

호모그래피는 영상 픽셀좌표에 직접 적용해도 좋지만 영상의 왜곡까지 고려한다면 픽셀좌표를 정규이미지좌표(normalized image coordinate)로 변환한 후 정규이미지좌표에 대해 호모그래피를 계산 및 적용하는 것이 효과적임



방법 3. 3D 변환을 이용한 방법


3D 변환을 이용하는 방법은 가장 일반적인 방법이며 영상기하학에서 좌표계에 대한 이해만 있으면 어렵지 않게 적용할 수 있다.


카메라의 내부 파라미터(fx, fy, cx, cy) 및 3D 자세정보(R, t)는 미리 주어져 있다고 가정한다.


☞ 카메라의 내부 파라미터는 카메라 캘리브레이션을 통해 구할 수 있고, 3D 자세정보(R, t)는 opencv의 solvePnP 함수를 이용하여 구할 수 있다 (Extrinsic Camera Calibration - 카메라의 위치 및 자세 파악 글 참조)


이 때, 어떤 3차원 공간상의 한 점 P에 대한 카메라좌표를 Pc, 월드좌표를 Pw라 하면 Pc와 Pw 사이의 변환은 다음 수식에 의해 주어진다.


 --- (4)


입력 영상 픽셀좌표를 p(x,y), 대응되는 지면좌표를 P(X, Y)라 하자.


먼저 카메라의 내부파라미터에 대한 영향을 없애기 위해 픽셀좌표를 정규좌표로 변환한다 (영상에서 모든 기하학적 해석은 정규좌표를 통해 이루어진다).


 --- (5)


이 때, 구한 정규좌표를 3차원 카메라좌표로 해석하면 (u, v, 1)이 된다. 정규이미지평면은 카메라 원점에서 초점거리가 1인 평면이므로 정규이미지 평면 상의 점 (u, v)의 카메라좌표계 좌표는 (u, v, 1)이 된다. 이 점을 pc = (u, v, 1)라 하자.


이제 카메라 원점과 pc를 연결한 직선이 지면과 만나는 점을 구하면 원하는 답을 구할 수 있다. 그리고 지면과의 교점을 구하기 위해서는 카메라좌표계가 아닌 월드좌표계에서 계산을 수행해야 한다. 카메라 원점의 카메라좌표를 Cc, 월드좌표를 Cw라 하고 점 pc의 월드좌표를 pw라 하자. 카메라 원점의 카메라좌표는 항상 (0, 0, 0)임에 주의하자. 즉, Cc = (0, 0, 0)이다. 대응되는 월드좌표는 식 (4)를 이용하여 다음과 같이 계산된다.



그림 9. 3D 좌표계 변환


이제 월드좌표계 상에서 Cw와 pw를 잊는 직선이 지면과 만나는 점을 구하면 된다. 벡터(vector)의 개념을 이용하면 Cw와 pw를 잊는 직선상의 임의의 점은 P = Cw + k(pw - Cw)로 표현할 수 있다 (k는 임의의 상수).


 --- (6)


그런데, 월드좌표계 상에서 지면은 Z = 0인 경우이므로 Cw + k(pw - Cw)의 Z좌표가 0이 되도록 k의 값을 구한 후 식 (6)에 대입하면 원하는 지면좌표 P가 구해진다.


☞ 여기서 구한 지면좌표는 월드좌표계를 어떻게 설정하느냐에 따라 달라지는 값임에 주의한다.



세 방법의 비교


세 방법 중 어느 방법을 써도 무방하다. 단, 기하학적 계산 방법은 카메라가 옆으로 기울어진 경우 즉, roll이 0이 아닌 경우에는 사용할 수 없다. 호모그래피 방법과 3D 변환 방법은 roll이 돌아간 경우에도 적용할 수 있다. 또한 호모그래피 방법은 카메라 캘리브레이션이 없이도 픽셀 좌표만 가지고 곧바로 적용할 수 있는 장점이 있다. 단 영상왜곡까지 고려한다면 호모그래피 방법도 카메라 캘리브레이션이 필요하다. 마지막으로 3D 변환 기법은 가장 일반적인 방법으로서 이 문제 뿐만 아니라 다른 문제에도 확장 적용할 수 있다는 장점이 있다.



물체의 크기 구하기


일단 앞서 방법들을 이용하여 물체의 위치(지면좌표)가 구해지면 크기(폭, 높이)를 구하는 것은 비례식을 이용하여 손쉽게 계산할 수 있다.



그림 10. 지면좌표 투영을 이용한 물체의 크기 추정


카메라의 지면에서의 높이를 hcam, 구하고자 하는 물체의 키를 hobj라 하자. 카메라의 높이는 미리 알고 있다고 가정한다. 카메라와 물체와의 거리(d1)는 앞서 방법을 통해 이미 구해진 상태이다. 이제 물체의 발끝이 아닌 머리끝 지점에 대해 지면좌표를 앞서 방법으로 구한다. 그러면 이렇게 구한 지면좌표는 그림 10에서와 같이 카메라와 물체의 최상단 끝을 연결한 선이 지면과 만나는 지점이다. 그 거리를 d2라 하자. 그러면 삼각형의 비례관계에 의해 hcam : hobj = d2 : d2-d1이 성립한다. 즉, hobj = hcam*(d2-d1)/d2로 계산된다. 끝.


폭을 계산하는 것은... ... ... 연습문제로;;


by 다크 프로그래머