opencv中solvePnP和calibrateCamera有什么区别?

时间:2015-02-13 04:28:22

标签: opencv

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

3 个答案:

答案 0 :(得分:13)

cv::calibrateCamera(...)

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

  • 线性内在参数焦距就像素而言(这些基本上是比例因子),主要点将是理想情况下位于图像的中心,有时x轴和y轴之间的偏斜系数(但通常为零)。
  • 非线性内在参数:前面提到的参数正在形成线性相机矩阵,但在从3D相机到2D图像平面的转换中也存在一些非线性参数,即镜头失真。
  • 外在参数:3D世界和3D相机坐标系之间的转换矩阵。

上述参数的估计通常基于2D-3D对应。该算法检测图像(即棋盘)中的一些2D点,以指定相应的3D对象点(已知的3D几何体)。它在最简单的情况下执行以下步骤(可能会因cv::calibrateCamera(..., int flags, ...)的标志而异):

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

cv::solvePnP(...)

此时,我还隐含地回答了cv::solvePnP(...)的角色,因为这是cv::calibrateCamera(...)的一部分。 一旦你拥有相机的内在函数,你可以假设它们永远不会改变(除了你改变光学或变焦)。另一方面,可以更改外部设备,即您可以旋转相机或将其放到另一个位置。您应该看到在这种情况下将对象的姿势更改为相机的方案非常相似。这就是cv::solvePnP(...)的用途。

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

  • 模型坐标系中的一组3D对象点(也可以是3D世界),
  • 他们在图像平面上的2D投影,
  • 线性和非线性内在参数。

cv::solvePnP(...)的输出作为旋转矢量(rvec)和平移矢量(tvec)一起给出,它将3D对象点从模型坐标系带到3D相机坐标系。

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

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