【问题标题】:Reprojection of calibrateCamera and projectPointscalibrateCamera 和 projectPoints 的重投影
【发布时间】:2016-10-20 11:40:18
【问题描述】:

我正在使用 OpenCV 的 calibrateCamera 并试图了解它如何计算重投影误差以及该错误代表什么。它似乎是投影点和测量图像点之间的(欧几里得)距离的 RMS——对吗?然而,最终的重投影误差被“最小化”是什么意思呢? calibrateCamera() 是否明确使用函数projectPoints() 来查找投影点?

【问题讨论】:

    标签: opencv image-processing computer-vision camera-calibration


    【解决方案1】:

    重投影误差是用估计的内在和外在矩阵重投影的 3D 点与通过某些图像处理技术检测到的 2D 图像点(例如棋盘图案的角)之间的误差(例如欧几里德距离)。

    最终的重投影误差被最小化,因为估计内部和外部参数集的问题是一个非线性问题,因此您必须迭代地找到最小化该重投影误差的参数集。

    更多信息:A Flexible New Technique for Camera Calibration ; Zhengyou Zhang ; 2000

    【讨论】:

      【解决方案2】:

      我指的是 OpenCV 版本 3.1.0,在这里你可以找到calibrateCamera 的文档 http://docs.opencv.org/3.1.0/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b 医生说(粗体字是我的):

      算法执行以下步骤:

      计算初始内在参数(该选项仅可用 用于平面校准模式)或从输入中读取它们 参数。失真系数最初都设置为零 除非一些 CV_CALIB_FIX_K?已指定。

      估计初始值 相机姿势,就好像内在参数已经知道一样。 这是使用 solvePnP 完成的。

      运行全局 Levenberg-Marquardt 最小化重投影误差的优化算法,即 观察到的特征点之间的平方距离总和 imagePoints 和投影(使用相机的当前估计 参数和姿势)对象点objectPoints。看 projectPoints 了解详情。

      函数返回最终的重投影误差

      无论如何,与其依赖文档,我更愿意看一下代码:

      https://github.com/Itseez/opencv/blob/3.1.0/modules/calib3d/src/calibration.cpp#L3298

      【讨论】:

        【解决方案3】:

        当您使用projectPoints时,您需要在重投影后手动计算RMS。这可能会有所帮助。 OPENCV: Calibratecamera 2 reprojection error and custom computed one not agree

        【讨论】:

          【解决方案4】:

          这是来自 OpenCV 代码 calibrate.cpp 第 1629 行的重投影误差计算:

          返回 std::sqrt(reprojErr/total);

          total 是所有图像的所有点的总和。

          【讨论】:

            猜你喜欢
            • 2022-08-14
            • 2016-08-15
            • 1970-01-01
            • 2013-04-12
            • 1970-01-01
            • 1970-01-01
            • 2012-08-03
            • 2016-08-02
            • 1970-01-01
            相关资源
            最近更新 更多