![]() |
OpenCV 4.12.0
開源計算機視覺
|
位姿計算問題 [185] 包括求解旋轉和平移,以最小化來自 3D-2D 點對應的重投影誤差。
solvePnP 和相關函式估計物件位姿,給定一組物件點、它們對應的影像投影,以及相機內參矩陣和畸變係數,如下圖所示(更準確地說,計算機視覺領域的慣例是使相機座標系的 X 軸指向右側,Y 軸向下,Z 軸向前)。
在世界座標系 \( \bf{X}_w \) 中表示的點使用透視投影模型 \( \Pi \) 和相機內參矩陣 \( \bf{A} \)(在文獻中也表示為 \( \bf{K} \))投影到影像平面 \( \left[ u, v \right] \) 中。
\[ \begin{align*} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} &= \bf{A} \hspace{0.1em} \Pi \hspace{0.2em} ^{c}\bf{T}_w \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} \\ \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} &= \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} \end{align*} \]
因此,估計的位姿是旋轉向量 (rvec) 和平移向量 (tvec),它們允許將世界座標系中表示的 3D 點轉換到相機座標系中。
\[ \begin{align*} \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} &= \hspace{0.2em} ^{c}\bf{T}_w \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} \\ \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} &= \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} \end{align*} \]
請參閱 cv::SolvePnPMethod 列舉文件,瞭解可能值的列表。下面描述了每種方法的一些細節。
cv::solveP3P() 從恰好 3 個 3D-2D 點對應關係計算物件位姿。P3P 問題最多有 4 個解。
cv::solvePnP() 返回旋轉向量和平移向量,它們使用不同的方法將物件座標系中表示的 3D 點變換到相機座標系。
cv::solvePnPGeneric() 允許檢索所有可能的解。
目前,只有 cv::SOLVEPNP_P3P, cv::SOLVEPNP_AP3P, cv::SOLVEPNP_IPPE, cv::SOLVEPNP_IPPE_SQUARE, cv::SOLVEPNP_SQPNP 可以返回多個解。
cv::solvePnPRansac() 使用 RANSAC 方案計算物件相對於相機座標系的位姿,以處理異常值。
更多資訊可以在 [328] 中找到
位姿細化包括估計旋轉和平移,使用非線性最小化方法並從解的初始估計開始,最小化重投影誤差。OpenCV 提出了 cv::solvePnPRefineLM() 和 cv::solvePnPRefineVVS() 來解決這個問題。
cv::solvePnPRefineLM() 使用非線性 Levenberg-Marquardt 最小化方案 [181] [79],當前的實現將旋轉更新計算為擾動,而不是在 SO(3) 上計算。
cv::solvePnPRefineVVS() 使用 Gauss-Newton 非線性最小化方案 [185],並且使用指數對映計算的旋轉部分的更新。