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

영상처리 2016.07.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 다크 프로그래머


저작자 표시 비영리 변경 금지
신고
  • 수제자 2016.07.20 13:09 신고 ADDR 수정/삭제 답글

    가히 최고라 하실만합니다.
    감사합니다. ^^

  • 다크초콜릿 2016.07.20 16:03 신고 ADDR 수정/삭제 답글

    상세한 설명 정말 잘 보고 있습니다!
    감사합니다.:)

  • 보고배웁니다 2016.07.21 13:22 신고 ADDR 수정/삭제 답글

    안녕하세요 다크 프로그래머님 다름이 아니고 opencv extra modules 중에 tracking 모듈을 어떻게 설치하는지 잘몰라서 이렇게 글을쓰게 되었습니다.

    extra modules 중에 tracking 모듈을 어떻게 설치해야 하는지 방법에 대해 게시해주실수있나요?

    감사합니다 ㅠ

    • BlogIcon 다크pgmr 2016.07.23 12:15 신고 수정/삭제

      저도 아직 설치해 보지는 않았는데요.. 설치가 많이 어렵나요? opencv build with extra modules 이런 식으로 검색해 보면 관련 글들이 꽤 있는 것 같긴 하던데요.. 제가 알고 있는 건 extra module은 github 공식사이트에서 따로 다운받아서 build해야 하는 걸로 알고 있습니다 (https://github.com/opencv/opencv_contrib). github 공식사이트에 간략한 설치법도 안내되어 있으니 따라서 한번 해 보시면 될 것 같습니다.

  • 김윤섭 2016.07.21 21:14 신고 ADDR 수정/삭제 답글

    요새 글이 많이 올라오네요 너무 반갑습니다! 정말 대단하신거 같아요 참 연구자이신거 같습니다 존경합니다^^..

    • BlogIcon 다크pgmr 2016.07.23 12:16 신고 수정/삭제

      별말씀을요.. 가슴이 찔리네요. 그래도 잘 봐주셔서 감사합니다. ^^

  • 스냑 2016.08.04 15:11 신고 ADDR 수정/삭제 답글

    좋은정보 감사합니다.

  • 배우는중 2016.10.20 16:59 신고 ADDR 수정/삭제 답글

    음! 2016 IPIU에서 틸드 구하기 포스터 발표한걸 본거 같아요

    • 씨오 2017.02.10 16:35 신고 수정/삭제

      해당 포스터 저자입니다! 제 포스터발표를 기억해주는 분이 계시다니 반갑네요 ㅎㅎ



티스토리 툴바