calibrateCamera()提供rvec,tvec,distCoeff,cameraMatrix,而solvePnP()将cameraMatrix,distCoeff作为输入,并提供rvec,tvec作为输出。这两个函数之间有什么区别?
答案 0 :(得分:13)
cv::calibrateCamera(...)
该功能从校准图案的几个视图估计单目相机的以下参数。这种模式的几何形状通常是已知的(即它可以是棋盘):
上述参数的估计通常基于2D-3D对应。该算法检测图像(即棋盘)中的一些2D点,以指定相应的3D对象点(已知的3D几何体)。它在最简单的情况下执行以下步骤(可能会因cv::calibrateCamera(..., int flags, ...)
的标志而异):
cv::solvePnP(...)
完成的。cv::projectPoints(...)
完成的。cv::solvePnP(...)
此时,我还隐含地回答了cv::solvePnP(...)
的角色,因为这是cv::calibrateCamera(...)
的一部分。
一旦你拥有相机的内在函数,你可以假设它们永远不会改变(除了你改变光学或变焦)。另一方面,可以更改外部设备,即您可以旋转相机或将其放到另一个位置。您应该看到在这种情况下将对象的姿势更改为相机的方案非常相似。这就是cv::solvePnP(...)
的用途。
该函数估计给定的对象姿势:
cv::solvePnP(...)
的输出作为旋转矢量(rvec
)和平移矢量(tvec
)一起给出,它将3D对象点从模型坐标系带到3D相机坐标系。
答案 1 :(得分:4)
calibrateCamera
(doc)估算给定摄像机的内在系数(即摄像机矩阵和失真系数)。此功能要求您提供N组2D-3D对应关系,这些对应关系与从不同视点使用相同摄像机拍摄的N个图像相关联(通常N = 30,请参阅本主题的this tutorial)。该函数返回所考虑相机的相机矩阵和失真系数。虽然通常不使用这些参数,但也会估计外部参数(即位置和方向),因此函数会为N个输入图像中的每一个返回一对rvec
和tvec
。
solvePnP
(doc)估算给定相机图像的外部参数。此功能要求您提供一组2D-3D对应关系,这些对应关系与使用已知内在参数的相机拍摄的单个图像相关联。该函数返回一对rvec
和tvec
,对应于输入图像。
答案 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)(可以设想一些标记)。