相機把 3D 點變成影像上的位置:u = f·X/Z + cx。Z 在投影時被除掉了,所以左右移動會改變成像位置,沿著同一條射線前後移動,成像位置完全不變。拖曳橘色的杯子,再用滑桿把杯子沿射線推遠、放大。
同一個點被兩台相機看到,各給一條射線,交點就是它的 3D 位置。兩顆鏡頭平行、相距基線 B 時,兩張照片裡的位置差(視差)是 d = uL − uR = f·B / Z,反過來 Z = f·B / d。把點拉遠,看深度怎麼變得不確定。
只用兩張單目照片,能確定相機的旋轉和平移方向(5 DoF),平移的大小確定不了。整個世界放大 k 倍,兩台相機和所有點一起放大,拍出來的像素完全一樣。拖動滑桿,只有標尺上的數字會變,兩張照片不會變。
SfM 不配對每個像素,只挑「往任何方向移動,周圍都會變」的位置。把游標移到下面的建築圖上:天空與牆的直線邊界、平坦的牆面、窗角、樹葉,分數完全不一樣。
這是 2D 俯視版的增量式重建。橘色三角形是相機,從每台相機射出的細線是它「看到的方向」。步驟 1 只有前兩台相機。步驟 2 加入其餘相機,位姿誤差一台一台累積,細線沒有對準點。步驟 3 執行 bundle adjustment,把所有相機位姿和點一起調整,讓射線收斂回點上。
針孔模型把每個像素變成一條射線,要得到射線上的哪一點,需要 Z。這堂課介紹了三條路,加上直接用感測器量:
| 方法 | Z 的來源 | 尺度 | 限制 |
|---|---|---|---|
| SfM | 多視角三角化,加 bundle adjustment | 未知,要外部資訊(IMU、已知長度、GPS) | 場景要靜止;無紋理處沒有點;結果是稀疏點 |
| Stereo | 視差,Z = f·B / d | 公制(基線已知) | 遮擋、反光、無紋理;深度誤差隨距離平方成長 |
| 學習式單目 | 從訓練資料學到的先驗 | 常是相對深度 | 機器人需要公制距離,要另外校準尺度 |
| 深度相機 | 感測器直接量(很多款內部其實是雙目加紅外線) | 公制 | 範圍有限;戶外強光、透明與反光表面會失效 |
有了 Z 以後,下一步是把每一幀的點雲拼起來、估計相機位姿,建出一張持久的地圖。