【问题标题】:Meaning of the retval return value in cv2.CalibrateCameracv2.CalibrateCamera中retval返回值的含义
【发布时间】:2015-06-20 03:04:37
【问题描述】:

正如标题所说,我的问题是关于 OpenCv 的 calibrateCamera 函数给出的返回值。

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

我在 python 中有一个函数实现,可以使用黑白网格查找相机的内在参数和失真系数。

问题更多是关于函数返回的 retval。如果我理解正确,它是“平均重投影误差。这个数字可以很好地估计找到的参数的精度。这应该尽可能接近零。”如

中所述

http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

尽可能接近于零的值究竟是什么意思?

例如,当我为我的罗技网络摄像头做这件事时:

有效值:0.702660793513

相机矩阵:

[[ 616.30868126    0.          339.02126978]
 [   0.          605.08224927  241.64607568]
 [   0.            0.            1.        ]]

失真系数:

[ 0.19805527 -0.62915986  0.00924648  0.02618232  1.02491764]

在这种情况下,误差如何量化内在参数估计的质量?

编辑:

所以我去寻找答案并深入挖掘并检查此函数的 cpp 实现。

这是计算这个错误值的函数:

static double computeReprojectionErrors(
        const vector<vector<Point3f> >& objectPoints,
        const vector<vector<Point2f> >& imagePoints,
        const vector<Mat>& rvecs, const vector<Mat>& tvecs,
        const Mat& cameraMatrix, const Mat& distCoeffs,
        vector<float>& perViewErrors )
{
    vector<Point2f> imagePoints2;
    int i, totalPoints = 0;
    double totalErr = 0, err;
    perViewErrors.resize(objectPoints.size());

    for( i = 0; i < (int)objectPoints.size(); i++ )
    {
        projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i],
                      cameraMatrix, distCoeffs, imagePoints2);
        err = norm(Mat(imagePoints[i]), Mat(imagePoints2), NORM_L2);
        int n = (int)objectPoints[i].size();
        perViewErrors[i] = (float)std::sqrt(err*err/n);
        totalErr += err*err;
        totalPoints += n;
    }

    return std::sqrt(totalErr/totalPoints);
}

考虑到使用 cv2.CalibrateCamera 找到的 tvecs 和 rvecs 计算此错误,它重新投影用于查找这些平移和旋转矢量的点,并计算重新投影点与这些点的实际坐标之间的欧几里得距离。

我不认为这个误差在 [0,1] 范围内,而是取决于用于校准的坐标范围。因此,这取决于用于校准的图像的分辨率。

有人可以证实/反驳这一点吗?

【问题讨论】:

标签: python opencv camera-calibration


【解决方案1】:

calibrateCamera 返回均方根 (RMS) 重投影误差,通常在良好的校准中应该在 0.1 到 1.0 像素之间。
计算是通过使用最终的校准参数集(cameraMatrix、distCoeffs、rvecs 和 tvecs)将 3D 棋盘点 (objectPoints) 投影到图像平面并比较已知位置来完成的。角落(imagePoints)。

1.0 的 RMS 误差意味着,这些投影点中的每一个平均距离其实际位置 1.0 像素。误差不限[0, 1],可以认为是距离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 2015-06-04
    • 1970-01-01
    • 2011-08-24
    • 2012-07-26
    • 2022-01-20
    • 2020-09-09
    • 2010-09-11
    相关资源
    最近更新 更多