OpenCV 4.10.0
开放源代码计算机视觉
|
姿态计算问题 [182] 包括求解旋转和平移,使其最小化来自 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 方案计算对象姿态,该姿态与相机帧相关,目的是处理离群值。
可以在 [325] 中找到更多信息
姿态优化包含使用非线性最小化方法并从解决方案的初始估计开始估算最小化重投影误差的旋转和平移。OpenCV 为此问题提出了 cv::solvePnPRefineLM() 和 cv::solvePnPRefineVVS()。
cv::solvePnPRefineLM() 使用非线性 Levenberg-Marquardt 最小化方案 [178] [77],当前实现将旋转更新计算为扰动,而不是在 SO(3) 中。
cv::solvePnPRefineVVS() 使用 Gauss-Newton 非线性最小化方案 [182],并通过使用指数映射计算旋转部分的更新。