calibrateCamera()
函数提供rvec
、tvec
、distCoeff
和cameraMatrix
,而solvePnP()
函数则将cameraMatrix
和distCoeff
作为输入,并提供rvec
和tvec
作为输出。这两个函数之间有什么区别?
calibrateCamera()
函数提供rvec
、tvec
、distCoeff
和cameraMatrix
,而solvePnP()
函数则将cameraMatrix
和distCoeff
作为输入,并提供rvec
和tvec
作为输出。这两个函数之间有什么区别?
cv::calibrateCamera(...)
该函数从标定板的多个视图中估计单目相机的以下参数。该标定板的几何形状通常是已知的(例如棋盘):
上述参数的估计通常基于二维-三维对应。该算法检测图像(例如棋盘)中的一些2D点,并指定相应的3D物体点(已知3D几何形状)。在最简单的情况下它执行以下步骤(可以根据 cv::calibrateCamera(..., int flags, ...)
的标志而有所不同):
cv::solvePnP(...)
完成的。cv::projectPoints(...)
完成的。cv::solvePnP(...)
在这里,我已经隐含回答了cv::solvePnP(...)
的角色,因为它是cv::calibrateCamera(...)
的一部分。一旦你有了相机的内参,你可以假设这些参数永远不会改变(除非你改变光学或变焦)。另一方面,外参可以更改,例如你可以旋转相机或将其放置到另一个位置。你应该看到在这种情况下,改变物体姿态到相机的场景非常相似。而这正是cv::solvePnP(...)
所用的。
该函数给出了以下物体姿态的估计:
cv::solvePnP(...)
的输出是一个旋转向量(rvec
)和一个平移向量(tvec
),将三维物体点从模型坐标系变换到三维相机坐标系。
calibrateCamera()可以提供rvec、tvec、distCoeff和cameraMatrix。distCoeff跟图像畸变有关,而cameraMatrix则提供了图像的中心(Cx和Cy)和焦距(Fx和Fy)(投影中心),这些被称为内参数。除非你改变相机的光圈/对焦,否则它们将保持不变。[它还提供了rvec和tvec,我现在还不知道它们有什么可能的用途。这些是相机在现实世界中的位置。rvec和tvec也被称为外参数]
solvePnP()以cameraMatrix和distCoeff作为输入,并提供了rvec和tvec。利用Cx、Cy、Fx和Fy,它可以估计相机的当前位置,即外参数。换句话说,首先使用calibrateCamera()来获取CameraMatrix和distCoeff。将它们用于solvePNP(),它会告诉你随着相机移动到你的真实世界对象(带有一些标记,如你所预期)的旋转(rvec)和平移(tvec)。