![]() |
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],并且使用指数映射计算的旋转部分的更新。