[Tech +]깊이 지도로 포인트군 만들기. 어떻게? 이렇게!

안녕하세요 알비언 AR팀에서 코어 기술을 연구, 개발하고 있는 Layton입니다. 
오늘은 지난 번 AR팀에서 다뤘던 3차원 영상(콘텐츠 보러 가기)에 대한 두 번째 포스팅입니다. 바로 시작하겠습니다.





바늘구멍 사진기 모델 기반 

포인트 군 만들기


이전 포스팅에서 3차원 영상의 종류 중 깊이 지도를 설명해 드린 바 있습니다. 이때 생성된 깊이 지도를 활용하면 보통 3차원 포인트 군을 생성할 수 있는데요. 이번 포스팅에서는 바늘구멍 사진기 모형을 이용해 깊이를 측정하는 원리와 이를 이용해 포인트 군을 생성하는 방법에 대하여 알아보도록 하겠습니다.

깊이 지도를 바늘구멍 사진기 모델로 표현하기

일반적으로 라이다(LiDAR) 등의 깊이 카메라로 촬영한 깊이 지도의 픽셀별 깊이는 해당 위치가 카메라 평면으로부터 얼마나 떨어져 있는지를 나타냅니다.


위 그림은 실제 아이폰 13 프로에 있는 LiDAR로 비상계단의 컬러 영상과 대응하는 깊이 영상을 촬영한 결과입니다. 이때 카메라로부터 가까운 영역은 파란색, 카메라로부터 먼 거리는 빨간색으로 표기하였습니다. 카메라와 가까운 문과 복도 부분은 파란색으로, 카메라에서 먼 복도 부분 벽은 빨간색으로 표기되는 것을 볼 수 있습니다.

이런 색상 영상과 깊이 지도가 촬영되는 실제 원리는 여러 겹의 렌즈를 통과하는 구조이기 때문에 매우 복잡하지만, 포인트 군의 좌표를 계산하는 과정에선 단순화한 모델인 바늘구멍 사진기(pinhole camera) 모델로 촬영된 영상이라 가정합니다. 바늘구멍 사진기란 사각형 통에 작은 바늘 형태의 구멍을 뚫고 해당 구멍을 통해 들어온 빛이 반대편 벽에 부딪혀 상이 맺히는 구조로, 사진을 찍는 원리를 표현한 가장 기초적인 모델입니다.

바늘구멍 사진기 모델의 예시


위 그림과 같이 주어진 실세계 물체 R이 있으면, 실세계의 빛이 R을 비추면서 반사가 되고, 반사된 빛이 바늘구멍을 통해 카메라 내부로 들어가 좌우, 위아래가 반전된 형태의 그림이 맺히게 됩니다. 이러한 원리로 인해 실제로도 카메라에서 얻는 영상들은 항상 반전된 형태로 있기에, 이를 다시 반전시켜 원본 형태의 그림으로 바꾸는 작업도 합니다.

카메라 내부 파라미터로 포인트 군 만들기


바늘구멍 사진기 모델로 표현한 깊이 지도의 각 픽셀값은 카메라의 몇 가지 중요한 파라미터에 따라 결정됩니다. 따라서 거릿값을 결정하는 파라미터들을 잘 활용하면 역으로 깊이 지도에 담긴 사물의 실제 위치를 예측하여 포인트 군으로 표현할 수 있습니다.

우선 포인트 군 좌표 계산에 필요한 중요한 수치들을 설명해보겠습니다.

  1. 중심 픽셀: 깊이 카메라에서는 바늘구멍의 중앙에 대응하는, 점대칭의 중심점에 해당하는 픽셀을 중심 픽셀이라 부릅니다. 중식 픽셀의 x, y축 좌표를 일반적으로 cx, cy라 표현합니다. 단위는 픽셀입니다.
  2. 초점 거리: 카메라의 바늘구멍으로부터 사진이 맺히는 센서까지의 거리를 초점 거리(focal length)라고 합니다. 초점거리의 단위도 픽셀입니다. 센서의 가로세로 길이가 다른 경우를 대비해 fx, fy 로 구분합니다. (이는 사실 광학에서 말하는 초점거리랑은 다른 개념이지만, 영상처리에선 편의성을 위해 이 개념을 사용합니다.)
  3. 깊이: 실제 사물의 위치부터 상이 맺히는 부분까지의 수직 거리를 깊이(depth)라고 정의합니다. 여기선 z로 표현하며, 단위는 미터입니다.

여기까지 잘 따라오셨다면, 이제 주어진 정보들을 이용하여 포인트 군을 만들어 낼 수 있습니다. 
카메라의 초점 거리와 깊이, 중앙 픽셀을 알면 실제 각 깊이의 포인트 군 좌표는 다음과 같이 계산합니다.

그림을 통해 보다 자세히 원리를 설명드리겠습니다.


위 그림처럼 빨간 공의 중앙 부분이 사진에서 x 픽셀에 맺혔다 가정을 해보겠습니다. 그러면 픽셀 x와 중앙 픽셀 cx, 그리고 바늘구멍(핀 홀)은 빨간색의 직각 삼각형을 이룹니다. 반면, 중앙 픽셀이 z만큼 거리에 있을 경우의 위치를 0으로 두었을 경우 빨간 공까지의 거리를 X라고 두면, 삼각형의 비례관계에 의해

가 성립합니다. 따라서 X값은 양 변에 z를 곱하여

가 얻어집니다.

같은 원리로, y축 기준에서의 거리 를 Y라고 하면

가 얻어집니다.

마지막 Z 좌표는 깊이 정보인 z를 그대로 사용합니다.

이렇게 계산한 x,y,z 좌표값을 괄호로 묶어 표현하면

가 됩니다.


위 그림은 계단을 촬영한 깊이 지도와 색상 영상을 이용해 포인트 군을 생성한 결과입니다.
윗층 복도와 아래층 복도가 잘 표현되어있고, 바닥과 벽면 또한 수직으로 구분된 것을 확인할 수 있습니다.

다만 기대했던 것 보다는 완전히 평평한 형태는 아니며, 난간이나 계단 등은 실제 위치와 달리 약간의 왜곡이 있기도 합니다. 이러한 왜곡은 보통 깊이 지도를 촬영하는 과정에서 잡음이 있어 실제 깊이와 측정한 깊이가 서로 달라서 생기는 현상입니다. 

이런 잡음들은 카메라 성능의 한계로 생기기도 하고, 투명하거나 반짝이는 재질 등에서 레이저의 난반사로 인해 오류를 일으켜 생기기도 합니다. 최근에는 깊이 정보의 오류를 딥러닝으로 복원하는 연구들도 활발히 진행되고 있습니다.

정리

이번에는 바늘구멍 사진기 모델을 기반으로 포인트 군을 생성하는 방법을 알아봤습니다. 바늘구멍 사진기로 영상을 촬영하는 원리와 초점거리, 중앙 픽셀, 그리고 깊이 정보를 이용해 깊이 지도를 3차원 포인트 군의 좌표로 변형하는 계산을 했습니다. 해당 원리를 기반으로 실제 아이폰으로 촬영한 깊이 지도에서 포인트 군을 만들어 보았고, 해당 포인트 군이 실세계 물체의 3차원 형태를 잘 표현하는 것을 확인할 수 있었습니다.

이 기법을 좀 더 확장하면, 하나의 사물을 여러 위치에서 깊이 카메라로 촬영한 뒤, 이들을 포인트 군으로 변환하여 하나로 합치는 방법을 생각해볼 수 있습니다. 이 경우는 단순 카메라 내부 파라미터가 아닌, 카메라의 위치와 자세를 표현하는 외부 파라미터(Extrinsic camera parameter)의 정보가 필요합니다. 

다음 포스팅에서는 이러한 외부 파라미터를 찾는 방법에 대해 다룰 예정이니 많은 기대 바라겠습니다. 

긴 글 읽어주셔서 감사합니다. ^^


Ref.

https://ko.wikipedia.org/wiki/바늘구멍_사진기

https://medium.com/yodayoda/from-depth-map-to-point-cloud-7473721d3f

https://www.apple.com/am/iphone-13-pro/specs/

Social Media

 official@mergerity.com