Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cv2.CalibleCamera中retval返回值的含义_Python_Opencv_Camera Calibration - Fatal编程技术网

Python cv2.CalibleCamera中retval返回值的含义

Python cv2.CalibleCamera中retval返回值的含义,python,opencv,camera-calibration,Python,Opencv,Camera Calibration,正如标题所说,我的问题是关于OpenCv中calibrateCamera函数给出的返回值 我在python中有一个函数实现,用于使用黑白网格查找相机的内在参数和失真系数 问题更多的是关于函数返回的retval。如果我理解正确的话,它是“平均重投影误差。这个数字可以很好地估计所发现参数的精度。这应该尽可能接近于零。”如中所述 一个尽可能接近零的值到底意味着什么 例如,当我为我的Logitech网络摄像头执行此操作时: RMS:0.702660793513 摄像机矩阵: [[ 616.30868

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

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

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

一个尽可能接近零的值到底意味着什么

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

RMS:
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);
}
静态双计算机投影错误(
常量向量和对象点,
常量向量和图像点,
常数向量和rvecs、常数向量和TVEC,
常数矩阵和摄像机矩阵,常数矩阵和距离系数,
向量和透视错误)
{
向量图像点2;
int i,总点数=0;
双总误差=0,误差;
perViewErrors.resize(objectPoints.size());
对于(i=0;i<(int)objectPoints.size();i++)
{
项目点(Mat(objectPoints[i])、rvecs[i]、tvecs[i],
cameraMatrix、Discoefs、imagePoints2);
err=范数(Mat(imagePoints[i])、Mat(imagePoints2)、范数_L2);
int n=(int)objectPoints[i].size();
perViewErrors[i]=(float)std::sqrt(err*err/n);
totalErr+=err*err;
总点数+=n;
}
返回标准::sqrt(总误差/总点数);
}
该误差是根据cv2.CalibleCamera发现的TVEC和rvecs计算的,它重新投影用于查找这些平移和旋转向量的点,并计算重新投影点与这些点的实际坐标之间的欧几里德距离

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


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

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

RMS误差为1.0意味着,平均而言,每个投影点距离其实际位置1.0 px。误差在[0,1]中没有界,可以将其视为距离