【发布时间】:2020-06-11 19:01:13
【问题描述】:
calibrateCamera() 提供rvec、tvec、distCoeff 和cameraMatrix 而solvePnP() 将cameraMatrix、distCoeff 作为输入并提供rvec、tvec 作为输出。这两个函数有什么区别?
【问题讨论】:
标签: opencv
calibrateCamera() 提供rvec、tvec、distCoeff 和cameraMatrix 而solvePnP() 将cameraMatrix、distCoeff 作为输入并提供rvec、tvec 作为输出。这两个函数有什么区别?
【问题讨论】:
标签: opencv
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 相机坐标系。
【讨论】:
calibrateCamera (doc) 估计给定相机的内在系数(即相机矩阵和失真系数)。此功能要求您提供 N 组 2D-3D 对应关系作为输入,这些对应关系与使用同一相机从不同视点拍摄的 N 幅图像相关联(通常 N=30,请参阅此主题的 this tutorial)。该函数返回所考虑相机的相机矩阵和失真系数。虽然这些通常不使用,但外部参数(即位置和方向)也会被估计,因此该函数为 N 个输入图像中的每一个返回一对rvec 和tvec。
solvePnP (doc) 估计给定相机图像的外部参数。此功能要求您提供一组 2D-3D 对应关系,与使用已知内在参数的相机拍摄的单个图像相关联。该函数返回一对rvec和tvec,对应于输入图像。
【讨论】:
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)(你可以假设有一些标记)。
【讨论】: