눈을 번갈아 감으면 가까운 손가락은 왜 움직여 보일까?
두 눈은 조금 다른 위치에서 세상을 본다. 가까운 물체는 먼 물체보다 배경에 대해 더 크게 위치가 바뀐다. 스테레오 카메라는 같은 장면 점이 두 이미지에서 얼마나 옮겨졌는지라는 비슷한 기하학적 단서를 쓴다. 유용한 거리 신호지만 먼저 가정을 밝혀야 한다.
거리는 두 시점의 불일치에 숨어 있다.
나머지 조건부터 일치시킨다
모델은 보는 방향이 평행하고 영상면이 정렬된 이상적인 핀홀 카메라 두 대를 쓴다. 중심의 수평 간격은 0.06미터이며 초점거리는 각각 800픽셀이다. 픽셀 단위 초점거리는 기하를 영상 좌표에 연결한다. 렌즈 사양의 밀리미터 초점거리와 같은 수치가 아니다.
한 장면 점은 두 영상에서 다른 가로 위치에 나타난다. 정렬 뒤의 좌표 차이를 시차라고 한다. 실제 시스템은 보정과 영상 정렬을 통해 이 편리한 배열에 가까워지도록 한다. 예제가 단순한 것은 그 과정이 이미 성공했다고 가정하기 때문이다.

삼각형에서 짧은 규칙이 나온다
이 배열에서 시차는 초점거리 곱하기 기준선 간격을 깊이로 나눈 값이다. 예제의 분자는 48픽셀·미터다. 따라서 1미터의 점은 48픽셀, 2미터에서는 24픽셀, 4미터에서는 12픽셀의 시차를 갖는다. 거리가 두 배면 이동량은 절반이다.
여기서 깊이는 카메라 관찰축 방향의 거리다. 카메라 중심에서 점까지 비스듬히 잰 전체 거리는 아니다. 이 구분으로 작은 모호함을 막을 수 있다. 도식은 읽기 쉽게 카메라 간격을 과장했지만 계산은 계속 6센티미터를 쓴다.
가까운 물체가 더 큰 신호를 준다
그림에는 0.5미터의 점도 있으며 시차는 96픽셀이다. 곡선은 빠르게 내려간 뒤 먼 거리에서 완만해진다. 같은 영상 좌표 불확실성이 물체 위치에 따라 전혀 다른 깊이 불확실성으로 바뀌는 이유다.
4미터 예제에서 측정 시차가 12에서 11픽셀로 바뀌면 추정 깊이는 약 4.36미터가 된다. 13픽셀이면 약 3.69미터다. 역수 공식의 결정적인 결과이지 카메라에서 측정한 오차 막대가 아니다. 비대칭은 무작위 잡음이 아니라 나눗셈에서 나온다.

어려운 일은 대응점을 찾는 것이다
공식은 두 사진에서 같은 물리적 점을 찾았다고 가정한다. 반복 벽지, 무늬 없는 벽, 반사와 투명 표면은 이를 모호하게 만든다. 한쪽에서 보이는 특징이 다른 쪽에서는 가려질 수도 있다. 이런 가림은 식을 더 정밀하게 계산한다고 해결되지 않는다.
실제 시스템은 주변 영역과 일관성 검사 등으로 믿을 만한 대응을 고른다. 모든 픽셀을 같은 확신으로 보여 주면 화려한 깊이 지도가 불확실성을 숨길 수 있다. 이 예제는 합성 점의 대응을 알고 있으므로 기하만 분리하며 실제 매칭 알고리즘의 신뢰도를 측정하지 않는다.

간격을 넓히는 것도 절충이다
같은 깊이와 초점거리에서 카메라 간격을 늘리면 시차가 커져 먼 거리 차이를 측정하기 쉬워질 수 있다. 대신 두 영상이 덜 비슷해지고 겹치는 영역과 가림도 달라진다. 모든 장면과 작업 거리에 최적인 간격은 없다.
단순 식에서 초점거리도 비슷한 관계를 보이지만 광학계를 바꾸면 시야와 실제 영상 형성도 바뀐다. 해상도, 보정 정확도, 왜곡도 중요하다. 그래프는 설계 선택을 생각하는 도구이지 사양 하나로 전체 깊이 품질을 평가하는 지름길이 아니다.
뇌에는 다른 단서도 있다
사람은 원근, 움직임, 명암, 가림, 익숙한 크기도 깊이 지각에 쓴다. 양안 시차는 그중 하나이며 장면과 관찰자에 따라 유용성이 달라진다. 두 카메라의 계산을 완전한 시각 모델이나 시력 진단으로 받아들이면 안 된다.
유용한 습관은 거리 추정이 어디서 왔는지 묻는 것이다. 대응에는 근거가 있었을까? 기하는 보정됐을까? 영상 이동은 얼마나 컸을까? 두 사진은 강한 깊이 단서를 담을 수 있지만 픽셀에서 기하로 가는 경로가 보여야 숫자도 믿을 수 있다.
더 읽어 보기
OpenCV: camera calibration and 3D reconstruction ↗OpenCV: depth from stereo ↗공식 문서와 함께 읽으면 좋은 자료입니다.
