opencv中solvePnP和CalibleCamera的区别是什么?

opencv中solvePnP和CalibleCamera的区别是什么?,opencv,Opencv,caliberecamera()提供rvec、tvec、distCoeff和cameraMatrix而solvePnP()将cameraMatrix作为输入,并提供rvec、tvec作为输出。这两个函数之间的区别是什么?CalibleCamera()估计给定相机的内部系数(即相机矩阵和失真系数)。此功能要求您提供N组2D-3D对应关系作为输入,这些对应关系与使用同一相机从不同视点拍摄的N幅图像相关(通常为N=30,请参见本主题)。该函数返回所考虑相机的相机矩阵和失真系数。虽然通常不使用这些参数,

caliberecamera()
提供
rvec
tvec
distCoeff
cameraMatrix
solvePnP()
cameraMatrix
作为输入,并提供
rvec
tvec
作为输出。这两个函数之间的区别是什么?

CalibleCamera()估计给定相机的内部系数(即相机矩阵和失真系数)。此功能要求您提供N组2D-3D对应关系作为输入,这些对应关系与使用同一相机从不同视点拍摄的N幅图像相关(通常为N=30,请参见本主题)。该函数返回所考虑相机的相机矩阵和失真系数。虽然通常不使用这些参数,但也会估计外部参数(即位置和方向),因此函数会为N个输入图像中的每一个返回一对
rvec
tvec

solvePnP
()估计给定相机图像的外部参数。此功能要求您提供一组2D-3D对应关系,这些对应关系与使用具有已知内在参数的相机拍摄的单个图像相关联。该函数返回一对与输入图像相对应的
rvec
tvec

该函数从校准模式的多个视图估计单目相机的以下参数。此图案的几何图形通常是已知的(即,它可以是棋盘):

  • 线性内在参数:以像素为单位的焦距(基本上是比例因子),理想情况下位于图像中心的主点,有时x轴和y轴之间的倾斜系数(但通常为零)
  • 非线性固有参数:前面提到的参数正在形成线性摄像机矩阵,但在从3D摄像机到2D图像平面的转换中也存在一些非线性参数,即镜头畸变
  • 外部参数:三维世界和三维相机坐标系之间的转换矩阵
上述参数的估计通常基于2D-3D对应。该算法检测图像(即棋盘)中的一些2D点,以确定指定的相应3D对象点(已知3D几何体)。它在最简单的情况下执行以下步骤(在
cv::calibleCamera(…,int flags,…)的标志上可能有所不同)

  • 计算线性固有参数,并将非线性参数考虑为零
  • 根据近似的内在函数估计初始相机姿态(外在)。这是使用
    cv::solvePnP(…)
    完成的
  • 执行Levenberg-Marquardt优化算法,以最小化检测到的二维图像点与三维对象点的二维投影之间的重投影误差。这是使用
    cv::projectPoints(…)
    完成的

此时,我还隐式地回答了
cv::solvePnP(…)
的角色,因为这是
cv::calibleCamera(…)
的一部分。 一旦你拥有了相机的本质,你可以假设这些将永远不会改变(除非你改变光学或变焦)。另一方面,外部特性可以更改,即您可以旋转相机或将其放置到其他位置。您应该看到,在这种情况下,将对象的姿势更改为摄影机的场景非常类似。这就是
cv::solvePnP(…)
的用途

该函数估计给定的对象姿势:

  • 模型坐标系中的一组三维对象点(也可以是三维世界)
  • 它们在图像平面上的二维投影
  • 线性和非线性固有参数
cv::solvePnP(…)
的输出以旋转向量(
rvec
)和平移向量(
tvec
)的形式给出,平移向量将三维对象点从模型坐标系带到三维相机坐标系。

calibleCamera()提供了rvec、tvec、distCoeff,cameraMatrix——距离系数与图像失真有关,cameraMatrix提供图像中心(Cx和Cy)和焦距(Fx和Fy)(投影中心)。这些被称为内在参数。除非更改相机的光圈/焦点,否则它们将保持不变。[它还提供了rvec和tvec,我现在还不知道它有什么可能的用途。这是摄像机在现实世界中的位置。rvec和tvec也称为外部参数]

solvePnP()将cameraMatrix,distCoeff作为输入,并提供rvec,tvec---使用Cx,Cy,Fx,Fy,它可以估计相机的当前位置,即外部参数。
换句话说,首先使用calibleCamera()获取CameraMatrix和distCoeff。在solvePNP()中使用它们,它将告诉您相对于真实世界对象移动相机时相机的旋转(rvec)和平移(tvec)(您可以假设有一些标记)。

很好的解释。我可以直接使用CalibleCamera()返回的rvecs/tvecs吗?另一个问题:对于校准模式的多个视图,我必须保持完全相同的位置以保持单词协调系统不变吗?恐怕我仍然不明白CalibleCamera中的rvecs/tvecs与SolvePnPc中的rvecs/tvecs之间的区别。请告诉我如何从solvePnP()方法的单应性中获取对象点和图像点?