1. 程式人生 > >雙目立體視覺三維重建

雙目立體視覺三維重建

stereo_vision_system.png
雙目立體視覺的整體流程包括:影象獲取、雙目標定、雙目矯正、立體匹配、三維重建。


影象獲取

雙目相機拍攝獲取 左右目影象

雙目標定

內參 外參
相機矩陣 K 1 ,
K 2 K_1, K_2
旋轉矩陣 R R
畸變係數 D 1 , D 2
D_1, D_2
平移向量 T T

《Learning OpenCV》中對於 Translation 和 Rotation 的圖示是這樣的:
stereo_rt.jpg

雙目矯正

通過 OpenCV函式 stereoRectify,包括 畸變矯正立體矯正

輸出引數
左目 矯正矩陣(旋轉矩陣) R 1 R_1 (3x3)
右目 矯正矩陣(旋轉矩陣) R 2 R_2 (3x3)
左目 投影矩陣 P 1 P_1 (3x4)
右目 投影矩陣 P 2 P_2 (3x4)
disparity-to-depth 對映矩陣 Q Q (4x4)

其中,
\begin{aligned}
P_1 =
\begin{bmatrix}
f & 0 & c_x & 0 \
0 & f & c_y & 0 \
0 & 0 & 1 & 0
\end{bmatrix}
\end{aligned}

\begin{aligned}
P_2 =
\begin{bmatrix}
f & 0 & c_x & T_x \cdot f \
0 & f & c_y & 0 \
0 & 0 & 1 & 0
\end{bmatrix}
\end{aligned}

通過 P 2 P_2 可計算出 基線 長度:
\begin{aligned}
baseline = - T_x = - \frac{{P_2}_{03}}{f_x}
\end{aligned}

  • ethz-asl/image_undistort: A compact package for undistorting images directly from kalibr calibration files. Can also perform dense stereo estimation.

立體匹配

stereo_vision_model_01.png

視差計算

通過 OpenCV函式 stereoBM (block matching algorithm),生成 視差圖(Disparity Map) (CV_16S or CV_32F)

disparity map from stereoBM of OpenCV :
It has the same size as the input images. When disptypeCV_16S, the map is a 16-bit signed single-channel image, containing disparity values scaled by 16. To get the true disparity values from such fixed-point representation, you will need to divide each disp element by 16. If disptypeCV_32F, the disparity map will already contain the real disparity values on output.

So if you’ve chosen disptype = CV_16S during computation, you can access a pixel at pixel-position (X,Y) by: short pixVal = disparity.at<short>(Y,X);, while the disparity value is float disparity = pixVal / 16.0f;; if you’ve chosen disptype = CV_32F during computation, you can access the disparity directly: float disparity = disparity.at<float>(Y,X);

三維重建

深度計算

stereo_vision_model_02.png

深度計算公式如下,通過遍歷影象生成 深度圖
\begin{aligned}
Z = depth = \frac{f_x \cdot baseline}{disparity}
\end{aligned}
其中, d i s p a r i t y disparity 代表 視差圖 座標值

影象型別

  • 單位meter --> 32FC1
  • 單位millimeter --> 16UC1

三維點座標計算

  • 根據 小孔成像模型,已知 Z Z 相機內參 可計算出 三維點座標,從而生成 三維點雲
    \begin{aligned}
    \begin{cases}
    Z = depth \
    X = \frac{u-c_x}{f_x} \cdot Z \
    Y = \frac{v-c_y}{f_y} \cdot Z
    \end{cases}
    \end{aligned}