cv2.caliberecam中retval返回值的意义

2024-05-13 21:43:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

尽可能接近零的值到底是什么意思?

例如,当我为我的Logitech网络摄像头执行此操作时:

有效值: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.caliberecamera找到的tvecs和rvecs计算出来的,它重新投影用于寻找这些平移和旋转矢量的点,并计算出重新投影点与这些点的实际坐标之间的欧几里得距离。

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

有人能证实/反驳吗?


Tags: 函数cameraint误差投影errvectorcalibration
1条回答
网友
1楼 · 发布于 2024-05-13 21:43:03

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

均方根误差为1.0意味着,平均每个投影点与实际位置相差1.0px。误差在[0,1]中没有限制,可以认为是一个距离。

相关问题 更多 >