【问题标题】:What is the difference between solvePnP and calibrateCamera in opencv?opencv中solvePnP和calibrateCamera有什么区别?
【发布时间】:2020-06-11 19:01:13
【问题描述】:

calibrateCamera() 提供rvectvecdistCoeffcameraMatrixsolvePnP()cameraMatrixdistCoeff 作为输入并提供rvectvec 作为输出。这两个函数有什么区别?

【问题讨论】:

    标签: opencv


    【解决方案1】:

    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 相机坐标系。

    【讨论】:

    • 很好的解释。我可以直接使用 calibrateCamera() 返回的 rvecs / tvecs 吗?
    • 另一个问题:对于一个校准模式的几个视图,我必须保持完全相同的位置才能使单词协调系统不变吗?
    • 恐怕我还是不明白calibrateCamera中的rvecs/tvecs和solvePnP中的rvects/tvecs有什么区别
    • 你能告诉我如何从solvePnP()方法的单应性中获取objectPoints和imagePoints吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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)(你可以假设有一些标记)。

      【讨论】:

        猜你喜欢
        • 2021-06-25
        • 1970-01-01
        • 2017-08-31
        • 2015-06-17
        • 2013-09-02
        • 2014-08-09
        • 1970-01-01
        • 2019-11-24
        • 2021-04-07
        相关资源
        最近更新 更多