영상의 기하학적 해석 - 카메라의 틸드(tilt) 구하기

영상처리 2016. 7. 20. 10:38

카메라의 틸트(tilt)를 구하는 3가지 방법입니다. 카메라 영상을 기하학적으로 해석할 때 보통 많이 필요한 게 카메라의 높이와 틸트입니다. 카메라의 높이는 직접 측량을 한다고 해도 카메라의 틸트는 측정이 쉽지 않기 때문에 몇 가지 방법들을 적어 봅니다.



틸트(tilt)의 기준


여기서는 틸트의 기준을 카메라가 지면과 수평인 경우 0, 위쪽을 +, 아래쪽을 -로 한다.



그림 1. 틸트(tilt)의 기준



방법 1.  이미지 주점을 이용한 측정 방법


이미지에서 이미지의 주점(principal point)에 해당하는 바닥점(P)을 찾은 후 삼각법을 이용해 틸트를 계산한다.


그림 2. 삼각법을 이용한 틸트(tilt) 계산


이미지에서 주점(principal point)의 위치는 카메라 캘리브레이션을 통해 구하거나 또는 간단하게는 이미지의 중심을 주점으로 잡는다.


다음으로 이미지의 주점에 해당하는 지점이 실제 바닥에서 어디인지를 육안으로 확인한다. 이 점을 P라 하자. 이후 카메라와 P와의 수평거리를 d, 카메라의 높이를 h라 하면 카메라의 틸트는 다음과 같이 계산된다.


 --- (1)


☞ h와 d를 측량할 때 카메라가 큰 경우 카메라의 원점을 어디로 잡아야 할지 애매할 수 있다. 흔히 이미지 센서가 있을법한 위치를 기준점으로 생각하기 쉽지만 카메라 원점의 정확한 위치는 이미지센서가 아니라 렌즈의 중심으로 잡는 것이 정확하다.



방법 2. 소실점(vanishing point)을 이용한 방법


앞서 주점(principal point)를 이용한 방법은 줄자나 레이져 거리측정기 등의 번거로운 측량 작업이 필요하다. 하지만 소실점(vanishing point)을 이용한 방법은 입력 영상만 가지고 틸트(tilt) 추정이 가능하며 카메라 높이 등의 부가정보도 필요치 않다. 단, 카메라 파라미터(주점과 초점거리)는 알고 있어야 한다.


영상의 소실점(vanishing point)이란 실세계에서 평행한 선들이 카메라 영상에 투영되면 원근효과로 인해 한 점에서 만날 수 있게 되는데, 이 교점을 소실점이라 한다. 예를 들어, 기찻길을 카메라로 촬영했을 때 영상에서 두 선로가 만나는 점이 소실점이다.


그림 3. 소실점(vanishing point)


그런데, 소실점(vanishing point)의 재미있는 성질은 카메라의 틸트(tilt)가 0일 때는 주점과 동일 수평선 상에 생성되고 틸트가 +일 경우에는 주점의 아래쪽에, 틸트가 -일 경우에는 주점의 위쪽에 소실점이 형성된다는 점이다.


즉, 영상에서 소실점의 위치는 카메라의 틸트에 의해 결정되는 수치로서 영상에서 소실점의 y 좌표를 알면 카메라의 틸트(tilt)는 다음과 같이 간단하게 계산된다.


 --- (2)


단, vy는 소실점의 y좌표(픽셀좌표), cy는 주점의 y좌표, fy는 y축 방향 카메라 초점거리.


식 (2)가 성립하는 이유는 아래 그림과 같다. 즉, 기하학적으로 봤을 때 영상에서 소실점의 위치는 카메라 원점을 지나고 지면에 평행한 선이 이미지 평면과 만나는 곳이기 때문이다.


그림 4. 소실점의 위치


☞ 여기서 소실점은 바닥면에 대한 소실점이며 기둥이나 벽면 등의 세로 방향의 선들에 대한 소실점은 해당되지 않음에 주의한다.


☞ 복도 환경에 설치된 카메라의 경우에는 복도 바닥의 경계선들을 이용하여 소실점을 손쉽게 계산할 수 있지만 야외나 자동차에 설치된 카메라의 경우에는 소실점을 구하는 것이 어려울 수 있다. 이 경우에는 직사각형의 커다란 판을 바닥에 내려놓은 후 영상을 획득하여 소실점을 구한다.


☞ 식 (2)에 의한 틸트 계산은 카메라의 롤(roll) 회전이 없는 경우에 한해 성립한다. 만일 카메라의 roll 회전이 존재하는 경우에는 소실점만으로는 문제 해결이 안되며 소실선(vanishing line) 정보가 필요하다. 소실선이 주어질 경우, 카메라 주점과 소실선의 수직거리를 d(픽셀 단위), 초점거리를 f라 하면 틸트는 θtilt = atan2(d, f)로 계산된다.



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


마지막으로 3D 변환을 이용한 방법은 월드좌표계와 카메라좌표계 사이의 회전변환 행렬이 주어져 있을 때 회전변환 핼렬로부터 카메라의 틸트를 추출하는 방법이다. 단, 이 때의 월드좌표계는 바닥(지면)을 XY 평면으로 설정한 경우여야 한다.


☞ 월드좌표계와 카메라좌표계의 개념에 대해서는 [영상 Geometry #1] 좌표계 글을 참조한다.


월드좌표에서 카메라좌표로의 변환이 3×3 회전변환 행렬 R과 3×1 평행이동 벡터 t로 주어졌다고 가정하자. 즉, 3차원 공간상의 한점 P에 대한 월드좌표를 Pw, 카메라좌표를 Pc라 하면 R, t는 다음 수식을 만족하는 행렬(벡터)이다.


 --- (3)


이러한 좌표계 변환행렬은 opencv의 solvePnP 함수를 이용하여 구할 수 있으며 R, t를 구하는 방법 및 R로부터 틸트(tilt)를 추출하는 방법에 대한 자세한 내용은 Extrinsic Camera Calibration - 카메라의 위치 및 자세 파악 글을 참조한다.


by 다크 프로그래머