Stereo Vision 원리: 두 카메라로 깊이를 계산하는 방법
두 대의 카메라 영상만으로 물체까지의 거리를 계산하는 Stereo Vision의 삼각측량 원리와 기본 구현 흐름을 정리합니다.
Stereo Vision은 사람의 두 눈처럼 서로 다른 위치에 있는 두 카메라의 영상 차이(disparity)를 이용해, 별도의 거리 센서 없이도 물체까지의 깊이(depth)를 계산하는 기술입니다.
이 글에서는 Stereo Vision의 기본 원리인 삼각측량(triangulation)과, 실제로 깊이를 계산하기까지 필요한 처리 단계를 정리합니다.
기본 원리: 삼각측량
두 카메라가 일정한 간격(baseline, B)을 두고 나란히 놓여 같은 지점을 바라본다고 가정하면, 동일한 3D 점이 왼쪽/오른쪽 이미지에서 서로 다른 픽셀 위치에 맺힙니다. 이 픽셀 위치 차이를 disparity(d) 라고 합니다.
두 카메라의 광학 중심을 잇는 직선과 물체, 두 카메라 각각의 시선(line of sight)이 만드는 삼각형을 이용하면 아래 관계식으로 깊이를 구할 수 있습니다.
Z = (f × B) / d
Z: 카메라로부터 물체까지의 거리(깊이)f: 카메라의 초점거리(focal length)B: 두 카메라 사이의 거리(baseline)d: 두 이미지 사이의 disparity(픽셀 차이)
이 식에서 알 수 있는 중요한 성질은, disparity가 클수록 물체가 가깝고, disparity가 작을수록 물체가 멀다는 점입니다. 또한 baseline이 넓을수록 먼 거리 측정의 정확도가 높아지지만, 너무 넓으면 가까운 물체에서 두 영상의 겹치는 영역이 줄어드는 trade-off가 있습니다.
Stereo Vision 처리 파이프라인
실제 시스템에서는 위 공식을 바로 적용하기 전에 다음 단계를 거칩니다.
- Camera Calibration — 각 카메라의 내부 파라미터(초점거리, 렌즈 왜곡)와 두 카메라 간 상대 위치(외부 파라미터)를 구함
- Rectification — 두 영상을 같은 평면에 정렬해, 대응점 탐색을 가로 방향(수평선) 검색만으로 단순화
- Stereo Matching — 좌우 영상에서 대응하는 픽셀을 찾아 disparity map 생성
- Triangulation — disparity map과 calibration 정보를 이용해 실제 깊이(Z)로 변환
간단한 구현 예시 (OpenCV)
아래는 이미 보정(calibration)된 좌우 이미지에서 disparity map을 계산하는 최소 예시입니다. 실제 프로젝트에서는 calibration 단계가 먼저 필요합니다.
import cv2
left = cv2.imread("left.png", cv2.IMREAD_GRAYSCALE)
right = cv2.imread("right.png", cv2.IMREAD_GRAYSCALE)
stereo = cv2.StereoSGBM_create(
minDisparity=0,
numDisparities=64, # 16의 배수
blockSize=7,
)
disparity = stereo.compute(left, right).astype("float32") / 16.0
# disparity 값이 0에 가까울수록 먼 물체, 클수록 가까운 물체
실행 검증하지 않음: 위 코드는 OpenCV
calib3d/StereoSGBMAPI 사용법을 보여주기 위한 예시이며, 실제 카메라 보정 파라미터·이미지 없이 실행 결과를 검증하지 않았습니다. OpenCV 버전에 따라 파라미터 이름이 달라질 수 있습니다.
한계와 주의할 점
- 텍스처가 거의 없는 표면(흰 벽 등)은 대응점을 찾기 어려워 disparity 계산이 부정확해집니다.
- 조명 변화, 반사, 가림(occlusion)이 있는 영역에서는 오차가 커집니다.
- baseline과 카메라 해상도에 따라 측정 가능한 최대 거리와 정밀도가 달라집니다.
- Stereo Vision은 두 카메라의 정확한 calibration 품질에 크게 의존합니다.
결론
Stereo Vision은 별도의 깊이 센서 없이 두 대의 카메라만으로 거리 정보를 얻을 수 있다는 점에서 로봇, 자율주행, 3D 재구성 등 다양한 분야에 사용됩니다. 핵심은 두 영상의 disparity를 정확히 계산하는 것이며, 이를 위해 calibration과 rectification이 선행되어야 합니다.