타겟 추적을 위한 카메라의 팬,틸트 제어

영상처리 2013. 12. 10. 13:22

팬/틸트 카메라에서 카메라 영상위에 임의의 한 점이 영상 중심에 오도록 카메라를 제어할 때 필요한 팬, 틸트 제어량을 계산하는 방법에 관한 글입니다.


참고로, 이 글은 [개발한 것들] - 가상 3D 영상 생성 프로그램(http://darkpgmr.tistory.com/85) 글에 대해 댓글로 문의주신 내용에 대한 답변으로 작성된 글입니다.


풀고자 하는 문제는 아래 그림과 같이 영상위에 특정 대상을 화면 중심에 오도록 하려면 카메라의 팬과 틸트를 얼마나 움직여야 하는가 입니다.



얼핏 쉽게 떠오르는 방법은 dy만큼 틸트(tilt)를 시키고, dx만큼 팬(pan)을 시키는 것이겠지만 실제로는 이렇게 하면 원하는 결과를 얻을 수 없습니다. 그 이유는 i) 카메라를 틸트시켰을 때 영상에서 점의 위치가 포물선 형태를 그리며 변한다는 점 그리고 ii) 팬을 시킬 때 회전축이 현재의 틸트값에 따라서 바뀐다는 점 때문입니다.


아래 그림과 같이 영상 위에 한 점 p가 있을 때, 카메라를 상하방향으로 틸트시키면 점 p가 파란색 선을 따라서 일직선으로 움직이는게 아니라 실제로는 붉은색 선을 따라 포물선 형태로 움직입니다.



언뜻 이해가 안갈수도 있는데, 그 이유를 설명해 보면 이렇습니다. 위 그림의 왼쪽 삼각형처럼 카메라의 초점(projection 중점)과 물체(p)와의 관계는 틸트와 관계없이 항상 고정되어 있습니다. 그런데 틸트가 변함에 따라서 이미지 평면에 의해 잘리는 부분만이 변하게 됩니다. 이 잘리는 부분의 길이가 x좌표를 결정하며 카메라의 틸트가 이 물체를 정면으로 바라볼 때 그 값은 최소가 됩니다. 또한 카메라가 다른 방향을 볼수록 그 값은 커집니다. 사각뿔을 상상하면서 사각뿔의 꼭지점이 카메라 초점, 밑면이 이미지 평면이라고 생각하고 사각뿔의 꼭지점을 고정시킨 상태에서 사각뿔을 위 아래로 회전시켜 보면 이해가 좀더 쉬울 것입니다. 이러한 성질은 틸트 뿐만 아니라 패닝(panning)에 대해서도 동일하게 적용됩니다.


이를 수식적으로 계산할 수도 있는데, 점 p가 상하 방향으로 화면 가운데 오도록 틸트를 맞추었을 때의 p의 x좌표를 dx라 한다면 해당 위치에서 카메라를 dt만큼 틸트시켰을 때의 x 좌표는 dx/cos(dt)가 됩니다.


다음으로 틸트에 따른 패닝의 효과를 살펴보면 틸트가 전혀 없는 상태에서 패닝(panning)이 일어나면 카메라 화면이 좌우로 이동하겠지만, 만일 틸트가 90도인 경우(천장을 바라보거나 바닥을 바라보는 경우)에 패닝을 시키면 영상 중심을 중심으로 원을 그리며 회전이 일어납니다. 이와 같이 카메라의 패닝은 현재 틸트값에 따라 전혀 다른 결과를 가져오기 때문에 항상 틸트값을 고려하여 계산해야 합니다.


팬, 틸트 카메라의 특성에 대한 내용은 이 정도로 하고 다시 원래의 문제로 돌아가서 영상위의 임의의 지점으로 카메라 중심을 이동시키기 위한 방법을 생각해 보겠습니다.



1. 카메라의 절대적인 팬, 틸트 값을 모르는 경우


기본적으로 현재의 틸트 값을 모르면 해당 위치로 가기 위해 필요한 이동량을 한번에 계산하는 것은 불가능합니다. 그 이유는 실제 팬/틸트 카메라에서 팬과 틸트의 물리적인 회전축이 각각 하나로 고정되어 있기 때문입니다. 현재 영상에서 상대적인 좌우 회전각과 상하 회전각을 계산하는 것은 가능하지만 실제 물리적인 회전축이 현재 영상의 좌우방향이 아니기 때문에 틸트를 모르면 이동량을 계산할 수 없습니다. 만일 임의의 방향으로 회전이 가능한 카메라가 있다면 이러한 문제가 발생하지 않을 것입니다.


만일 현재의 틸트 값을 모르는 경우에는 일단은 dx만큼 패닝을 시키거나 dy만큼 틸트를 시킨 후에 영상 추적 기술을 접목하여 오차를 계산하고 이를 바탕으로 틸트를 추정하여 이후 다시 한번 이동을 하는 방식으로 중점을 맞추는 방법 등이 가능할 것입니다.



2. 카메라의 절대적인 팬, 틸트 값을 알수 있는 경우


수식 도출을 위해 먼저 좌표계 정의가 필요하며 편의상 월드좌표계, 카메라좌표계, 팬, 틸트를 다음과 같이 정의합니다 (다른 식으로 정의해도 관계없으며 정의하기에 따라서 수식 등이 조금씩 달리질 수 있음)


<그림 1>


<그림 1>과 같이 월드좌표계와 카메라 좌표계를 정의합니다.

  • 월드 좌표계: 지면이 XY 평면, 위쪽이 Z축
  • 카메라 좌표계: 카메라 광학축 방향이 Zc, 오른쪽이 Xc, 아래쪽이 Yc

이 때, 카메라 좌표계의 원점과 월드좌표계 원점은 일치하는 것으로 설정합니다.


또한 월드 좌표계 내에서 카메라의 pan 및 tilt를 다음과 같이 정의합니다.

  • pan(팬): 카메라의 좌우 회전각. 광학축이 월드좌표계 Y축과 평행할때 0도, 왼쪽이 +, 오른쪽이 -
  • tilt(틸트): 카메라의 상하 회전각. 광학축이 월드좌표계 Y축과 평행할때 0도, 위쪽이 +, 아래쪽이 -


즉, 카메라의 pan, tilt는 카메라 광학축(Zc)이 Y축 방향일 때 0이고 카메라를 위로 들면 tilt가 증가, 왼쪽으로 돌리면 pan이 증가합니다.


현재 카메라의 팬 값을 p, 틸트 값을 t라 하고 이동하고자 하는 목표점의 영상좌표를 q(x, y) 라 하면 q를 영상 중심에 맞추기 위한 팬 값 p', 틸트 값 t'은 다음과 같이 계산합니다.


1. 영상좌표 (x, y)에 대한 정규 이미지 좌표 (u, v)를 계산한다.

u = (x-cx)/fx

v = (y-cy)/fy

=> 보다 정밀한 결과를 위해서는 여기에 추가적으로 렌즈왜곡보정까지 해 주어야 함(렌즈왜곡보정에 대해서는 카메라 왜곡보정 - 이론 및 실제 글 참조)


2. (u, v)에 대한 카메라 좌표 Xc를 구한다.

Xc = (u, v, 1)


3. Xc를 월드좌표 Xw로 변환한다. 

=> 3D 좌표계 변환 방법 (예: 월드좌표계 - 카메라 좌표계) 글의 수식 (2) 참조


4. Xw의 팬 각 p', 틸트 각 t'을 계산한다.

Xw = (a, b, c)로 가정하면,

p' = -atan2(a, b)

t' = atan2(c, sqrt(a*a+b*b))


5. 계산된 p', t' 위치로 카메라를 이동시키면 OK.

현재의 팬, 틸트가 p, t이므로 p'-p, t'-t 만큼 이동시키면 원하는 위치로 이동하게 됨


계산 원리는 카메라 초점(프로젝션 중심)과 목표점을 잊는 선을 월드 좌표계 상에서 구한 후, 이 선 방향의 팬과 틸트 값을 계산하는 방식입니다.


※ 위 방법은 카메라의 초점 위치가 팬, 틸트에 관계없이 고정된다는 가정하에 수식을 세운 것입니다. 그런데, 실제 팬/틸트 카메라는 카메라 초점 위치도 같이 변하기 때문에 이에 따른 오차가 있을 수 있으니 참고하시기 바랍니다. 만일 초점의 위치변화까지 고려한다면 좀더 복잡한 수식 도출이 필요합니다..


by 다크 프로그래머