한 픽셀은 방향을 주고 두 시점은 교차 조건을 준다
핀홀 카메라에서 같은 광선 위의 여러 점은 같은 픽셀에 투영된다. M12.02의 u=f_x X/Z+c_x에서 X와 Z를 같은 비율로 키워도 X/Z가 같기 때문이다. 따라서 한 픽셀을 알았다는 사실만으로 그 점까지의 미터 거리를 정할 수 없다. 카메라 내부 파라미터를 알면 픽셀에 대응하는 방향을 읽을 수 있지만 그 방향 위의 어느 위치인지는 남는다.
그림 M13.05-1. 두 광선은 같은 물리점의 관측을 공통 프레임에서 표현한다. baseline은 카메라 중심 간 거리다. 잡음이 있으면 교차하지 않을 수 있고 작은 시차/잘못된 대응은 깊이 추정을 불안정하게 한다. 직접 제작.
서로 다른 위치의 카메라에서 같은 물리점을 관측하면 두 광선을 같은 기준 프레임에 놓고 위치를 추정할 수 있다. 이것이 삼각측량(triangulation)의 생각이다. 광선의 방향뿐 아니라 카메라 사이의 상대 회전·이동이 필요하다. 두 영상의 픽셀 값이 비슷하다는 이유만으로 같은 물리점이라고 확정할 수는 없다. 반복 무늬·반사·가림 때문에 대응이 틀릴 수 있다.
잡음이 있으면 두 광선이 정확히 한 점에서 만나지 않을 수도 있다. 일반적인 방법은 주어진 카메라 모형에서 관측을 잘 설명하는3D점을 구한다. 아래는 계산을 자립적으로 따라가기 위해 보정과 영상 정렬이 끝난 특별한 배치를 사용한다. 모든 다중 시점 영상에 단순한 시차 공식을 적용하는 것은 아니다. M13.02의 ICP는 이미 있는3D점군 사이 변환을 찾았고, 여기서는 영상 관측에서3D점을 구한다.
공식을 쓰기 전에 스테레오의 배치를 고정한다
왼쪽 optical 프레임을 기준으로 X는오른쪽, Y는아래, Z는앞이다. 오른쪽 카메라 중심은 왼쪽에서 +X 방향으로 B=0.20m 떨어져 있고 두 축은 평행하다. B를 기선 길이(baseline)라고 부른다. 이 배치에서 같은 점의 오른쪽 카메라 좌표는(X−B,Y,Z)다. camera중심이 오른쪽에 있다는 말과 좌표변환의 이동 부호를 혼동하지 않는다.
두 영상은 왜곡이 제거되고 rectification(스테레오 정렬)되어 같은 점의 대응이 같은 영상 행에 놓인다고 가정한다. 두 영상의 초점거리 f_x=f_y=f=400px, 주점(c_x,c_y)=(320,240)px가 같다. 실제 정렬은 원본 영상의 기하를 바꾸므로 정렬 후의 투영 파라미터와 픽셀을 함께 써야 한다. 원본 왜곡 영상 좌표와 보정 후 K를 섞지 않는다.
양쪽 영상은 정적인 같은 점을 같은 시각에 관측한다고 가정한다. 움직이는 물체를 다른 시각에 찍으면 차이가 기선에 의한 시차뿐 아니라 물체 운동을 포함할 수 있다. 렌더링한 합성 좌표의 이 가정을 실제 장치의 동기화가 검증된 것처럼 제시하지 않는다.
시차에서 깊이를 구하고 다시 영상에 돌려 본다
왼쪽 픽셀을(u_L,v_L), 오른쪽을(u_R,v_R)라고 하자. 이 배치에서 u_L=fX/Z+c_x, u_R=f(X−B)/Z+c_x다. 두 식을 빼면 주점이 소거되어 시차(disparity) d=u_L−u_R=fB/Z가 된다. 시차의 단위는px, B와 Z의 단위는m다. OpenCV Depth Map 공식 설명의 스테레오 관계를 이 계약으로 계산한다.
여기의 Z는 왼쪽 카메라의 전방 축 깊이이지 원점부터의 유클리드 거리 sqrt(X²+Y²+Z²)가 아니다. X=(u_L−c_x)Z/f, Y=(v_L−c_y)Z/f로 왼쪽 좌표를 구한다. 주점이 서로 다르다면 u_L−u_R만으로 주점이 소거되지 않는다. 같은f인 배치에서는 (u_L−c_xL)−(u_R−c_xR)처럼 주점 차이를 반영해야 하며, 일반 배치에서는 적절한 투영행렬을 사용한다.
합성 관측은 왼쪽(360,260)px, 오른쪽(340,260)px다. d=20px라 Z=400×0.20/20=4m다. X=(360−320)×4/400=0.4m, Y=(260−240)×4/400=0.2m다. 따라서 왼쪽 좌표는(0.4,0.2,4)m이고 오른쪽 좌표는(0.2,0.2,4)m다. 두 영상의 v가260으로 같은 것도 가정과 맞는다.
재투영(reprojection)은 구한3D점을 각 카메라 모형으로 다시 영상에 보내 관측 픽셀과 비교하는 일이다. 왼쪽은400×0.4/4+320=360, 세로는400×0.2/4+240=260이다. 오른쪽은400×0.2/4+320=340이고 세로260이다. 같은 수식으로 만들었으므로 이 합성 예제는 오차0이다. 실제 보정 품질이나 대응의 진실성을 실험으로 검증한 결과는 아니다.
픽셀의 좌표계와 동차 좌표를 맞춘다
두 영상을 crop 없이 각 축1/2로 줄인다고 하자. 이 손계산에서는 픽셀 좌표가 정확히 절반으로 변하는 규약을 사용한다. f=200px, 주점(160,120), 왼쪽(180,130), 오른쪽(170,130), d=10px가 된다. B는 카메라 사이의 실제 거리이므로0.20m 그대로다. Z=200×0.20/10=4m, X=0.4m, Y=0.2m로 같다. 영상만 줄이고 f400을 그대로 쓰면 깊이가8m로 틀어진다. 실제 resize/crop에서는 픽셀 중심의 대응 규약·offset과 투영행렬을 함께 확인한다.
OpenCV calib3d 공식 문서의 triangulatePoints는 투영행렬과 대응 관측을 받아 동차 좌표를 반환한다. 동차 좌표(a,b,c,w)는 유한한 점에서 w로 앞3성분을 나눠3D좌표를 읽는 표현이다. 예를 들어(4,2,40,10)은(0.4,0.2,4)다. 앞3개를 바로XYZ로 읽으면10배 오류다. w=0은 이 방식으로 유한 좌표를 만들 수 없고, w가 아주 작으면 수치적으로 불안정할 수 있다.
출력 프레임은 넣은 투영행렬의 기준에 달린다. 정렬용 투영행렬을 넣으면 첫 카메라의 정렬 프레임 좌표로 나올 수 있다. 픽셀 좌표를 쓰는지 정규화된 방향 좌표를 쓰는지도 투영행렬과 맞아야 한다. 이 단위는 함수를 호출하지 않고 숫자/프레임 계약을 해석한다. API의 자료형·출력 배치·시차의 저장 배율은 실제 사용할 버전에서 확인한다.
원거리의 작은 시차는 깊이의 큰 변화를 만든다
같은 f=400px와 B=0.20m에서 fB=80px·m다. d=20px면 Z4m지만 d=4px면 Z20m다. 시차가 작을수록 먼 점이다. 그러나 “숫자가 작으니 오차도 작다”는 뜻은 아니다. d=4px를1px만 다르게 읽으면 d3일 때 Z=80/3≈26.67m, d5일 때16m가 된다. 20m에 비해 +6.67m 또는−4m이고 대칭도 아니다.
비교하면 d20에서1px 차이는 d19→80/19≈4.2105m, d21→80/21≈3.8095m다. 같은1px 변동이어도 깊이 영향은 훨씬 작다. 국소 변화율의 크기는 fB/d²이므로 작은 시차에서 민감해진다. 이 값은 작은 변화의 근사이며 위처럼 큰 상대 변화의 정확한 구간을 대신하지 않는다. 확률분포를 정하지 않은 ±1px 범위를 통계적 표준편차라고 부르지도 않는다.
B를 늘리면 같은 깊이의 시차가 커질 수 있지만 가림·공통시야·대응 난도도 달라진다. 더 큰 기선이 모든 장면에서 무조건 낫다는 결론은 아니다. 시차/깊이 지도에서 빈칸은 미확인·매칭 실패일 수 있으며 장애물이 없다는 증거가 아니다. 얇은 물체·텍스처가 없는 벽·반사체의 실패를 단순히 빈 공간으로 바꾸지 않는다.
계산 가능성과 맞는 관측이라는 판단을 구분한다
이번 배치에서 전방 유한점은 B>0,d>0,Z>0를 만족한다. d=0에서는 유한Z를 나눗셈으로 구할 수 없으며, 잡음 속 작은 시차/대응 실패와 매우 먼 점을 추가 근거 없이 구분할 수 없다. d<0이면 이번 축/카메라순서/전방 가정과 맞지 않는다. 절댓값을 취해 정상 깊이로 바꾸지 말고 좌우순서·주점·보정·대응을 확인한다. 다른 배치의 부호 규약을 이 예제로 일괄판정하지 않는다.
정렬 영상에서는 행 일치도 확인한다. 예컨대 수용 조건을 |v_L−v_R|≤1px로 명시했는데 관측이260/264라면4px 차이로 제외한다. 이는 교육용 문턱이며 실제 장치의 보편 기준이 아니다. 행이 같아도 반복 무늬의 다른 점일 수 있으므로 행 조건은 필요 검사 중 하나일 뿐 대응의 신분증이 아니다. 일반적인 여러 시점에서는 각 카메라에서 양의 깊이인지, 관측과 재투영 차이가 허용 범위인지, 광선의 각도가 충분한지도 살핀다. 거의 같은 위치에서 찍거나 회전만 하고 위치가 바뀌지 않았다면 새 깊이 정보를 얻기 어려울 수 있다.
척도 오류는 재투영만으로 드러나지 않을 수 있다. 이 예제의 B를 실제0.20m 대신0.10m로 잘못 넣으면 d20에서 Z2m,X0.2m,Y0.1m가 된다. 잘못된 B와 이 좌표로 재투영하면 두 픽셀은 여전히360/340,세로260으로 맞는다. 카메라 간 거리와3D좌표가 함께 절반이 되어 비율이 같기 때문이다. 그러므로 재투영 오차0도 미터 척도가 맞다는 증명은 아니다. 기선을 알 수 없는 단안 다중 시점의 복원도 독립 길이 근거 없이 절대 미터 척도를 자동으로 얻었다고 할 수 없다.
보고에는 영상/보정 개정·좌표/프레임·시각·기선 단위·대응/제외 이유·시차와 추정 좌표·재투영·민감도/모호성을 남긴다. 작은 재투영 오차로 실제 물체 대응이나 주행 안전을 확정하지 않는다. 다음 M13.06은 이3D관측이 가려지고 희소해질 때 시간에 걸쳐 물체를 연결하는 문제로 이어진다.