스테레오 정류
스테레오 정류(rectification)는 캘리브레이션된 스테레오 쌍의 두 이미지를 워핑하여, 두 개의 이상적이고 평행한 카메라에서 나온 것처럼 보이게 만든다: 이미지 평면은 공면(coplanar), 광학축은 평행, 행은 정렬된다. 정류 후에는 좌측 이미지의 임의 픽셀에 대한 에피폴라 선이 단순히 우측 이미지의 동일한 행이 된다.
이것이 성립하는 이유: 임의의 카메라 포즈 쌍에 대해, 에피폴라 기하는 좌측 이미지 점의 매칭을 우측 이미지의 1차원 곡선(핀홀 카메라의 경우 직선)으로 제약한다. 정류는 두 에피폴을 수평축을 따라 무한대로 매핑하여 모든 에피폴라 선을 수평이면서 수직으로 정렬되게 만드는, 이미지에 적용되는 호모그래피 쌍 이다.
정류 변환은 어떻게 계산되는가
캘리브레이션된 내부 파라미터 , 렌즈 왜곡, 카메라 간 외부 변환 이 주어졌을 때, OpenCV의 stereoRectify가 사용하는 고전적인 (Bouguet) 구성은 다음과 같이 진행된다:
- 상대 회전 분할. 각 카메라를 의 “절반”만큼 회전시켜, 각 이미지를 최소한으로 방해하면서 두 광학축이 평행하게 만든다.
- 기선에 정렬. 새 축이 기선 벡터 를 따라 향하도록 공통 회전을 적용한다. 이제 두 에피폴 모두 무한대에 위치하므로, 에피폴라 선은 수평이 된다.
- 공통 가상 내부 파라미터 선택. 두 뷰에 대해 단일한 새 카메라 행렬 (동일한 , 동일한 주점 행)를 선택하여, 정류된 쌍이 를 위한 하나의 초점 거리와 하나의 기선을 갖게 한다.
- 리맵 테이블 굽기. 카메라별 워핑 은 렌즈 왜곡 보정 모델과 결합되어 룩업 테이블로 미리 계산되므로, 각 프레임을 정류하는 데는 한 번의 이미지 리맵만 필요하다.
R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(K1, D1, K2, D2, size, R, T)
mapLx, mapLy = cv2.initUndistortRectifyMap(K1, D1, R1, P1, size, cv2.CV_32FC1)
mapRx, mapRy = cv2.initUndistortRectifyMap(K2, D2, R2, P2, size, cv2.CV_32FC1)
rectL = cv2.remap(imgL, mapLx, mapLy, cv2.INTER_LINEAR)
rectR = cv2.remap(imgR, mapRx, mapRy, cv2.INTER_LINEAR)
반환된 행렬은 정류된 픽셀-플러스-시차 를 3D로 직접 재투영한다 — 시차-깊이 변환을 행렬 형태로 표현한 것이다.
이것이 주는 이점
- 1차원 대응 탐색. 매칭이 2차원 탐색에서 단일 행을 따라 스캔하는 것으로 축소되며, 이것이 밀집 시차 알고리즘(블록 매칭, Semi-Global Matching)과 빠른 희소 스테레오 매칭을 실시간으로 다루기 쉽게 만드는 요인이다.
- 단순한 시차 기하. 정류된 프레임에서는 대응이 순전히 수평이므로 과 가 정확히 성립하며, 가상 카메라 쌍에 대해 단일한 공통 초점 거리 와 기선 를 갖는다.
- 공짜로 얻는 이상값 제거. 자신의 스캔라인에서 벗어난(작은 허용 오차를 넘어선) 후보 매칭은 에피폴라 기하를 위반하므로 즉시 폐기할 수 있다.
정류 품질 확인하기
빠른 정상성 검사: 정류된 이미지 사이에서 특징을 매칭하고 수직 시차 을 살펴본다. 잘 정류된 쌍에서는 이것이 픽셀의 작은 일부여야 한다. 시스템적인 오프셋이나 이미지 전체에 걸친 기울기는 외부 파라미터 캘리브레이션이 표류했다는 뜻이다. 로봇 운용 기간 동안 수직 시차가 증가하는 것은 리그가 충격을 받았거나 열적으로 휘고 있다는 표준적인 증상이다.
실무상 주의점
- 정류는 캘리브레이션만큼만 좋다. 의 오차는 매칭을 조용히 저하시키는 수직 정렬 오류로 나타난다 — 매처가 잘못된 행을 탐색해서 실패하거나 편향된 시차를 반환한다.
- 넓은 시야각과 어안 렌즈는 불리하다. 핀홀 정류 쌍으로 워핑하면 주변부에서 상당한 이미지 영역을 잃는다(또는 특수한 정류 모델이 필요하다). 무거운 크롭 인자는 그 렌즈를 선택한 이유인 넓은 시야각을 정확히 낭비한다.
- 기선은 견고하게 유지되어야 한다. 정류는 고정된 를 가정한다. 기계적으로나 열적으로 휘는 리그는 주기적인 재캘리브레이션이나 온라인 외부 파라미터 정련이 필요하다.
- 셔터는 동기화되어야 한다. 두 카메라가 다른 시점에 노출된다면, 움직이는 플랫폼에서는 실질적으로 프레임마다 기선이 바뀐다 — 어떤 정적 정류로도 이를 고칠 수 없다.
SLAM에서의 의미
거의 모든 스테레오 SLAM 프론트엔드 — ORB-SLAM2의 키포인트별 스테레오 매칭, S-PTAM, Kimera의 밀집 SGM 기반 매핑 — 는 정류된 입력을 가정한다. 실시간 속도로 프레임별 깊이를 얻는 유일한 방법이 스캔라인 탐색이기 때문이다. 정류를 이해하면 스테레오 파이프라인이 어디서 깨지는지도 알 수 있다: 잘못된 캘리브레이션, 비동기화된 셔터, 어안 광학 모두 어떤 SLAM 코드가 실행되기도 전에 정류된 모델을 위반한다.