cv2.CalibrateCamera 中 retval return 值的含义
Meaning of the retval return value in cv2.CalibrateCamera
正如标题所说,我的问题是关于 OpenCv 的 calibrateCamera 函数给出的 return 值。
http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
我在 python 中有一个功能实现,用于使用黑白网格查找相机的内在参数和畸变系数。
问题更多是关于函数 returned 的 retval。如果我理解正确的话,它就是
中提到的 "the average re-projection error. This number gives a good estimation of precision of the found parameters. This should be as close to zero as possible."
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.CalibrateCamera 找到的 tvecs 和 rvecs 计算的,它重新投影用于查找这些平移和旋转向量的点,并计算重新投影的点与这些点的实际坐标之间的欧几里得距离.
我不认为这个错误在 [0,1] 范围内,而是取决于用于校准的坐标范围。所以这取决于用于校准的图像的分辨率。
有人可以confirm/refute这个吗?
calibrateCamera
returns 均方根 (RMS) 重投影误差,在良好的校准中通常应在 0.1 到 1.0 像素之间。
计算是通过使用最终的一组校准参数(cameraMatrix
、distCoeffs
、rvecs
和 [=15] 将 3D 棋盘点 (objectPoints
) 投影到图像平面中来完成的=]) 并比较角的已知位置 (imagePoints
)。
1.0 的 RMS 误差意味着,平均而言,这些投影点中的每一个都与其实际位置相距 1.0 像素。误差不在[0, 1]范围内,可以认为是一个距离。
正如标题所说,我的问题是关于 OpenCv 的 calibrateCamera 函数给出的 return 值。
http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
我在 python 中有一个功能实现,用于使用黑白网格查找相机的内在参数和畸变系数。
问题更多是关于函数 returned 的 retval。如果我理解正确的话,它就是
中提到的 "the average re-projection error. This number gives a good estimation of precision of the found parameters. This should be as close to zero as possible."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.CalibrateCamera 找到的 tvecs 和 rvecs 计算的,它重新投影用于查找这些平移和旋转向量的点,并计算重新投影的点与这些点的实际坐标之间的欧几里得距离.
我不认为这个错误在 [0,1] 范围内,而是取决于用于校准的坐标范围。所以这取决于用于校准的图像的分辨率。
有人可以confirm/refute这个吗?
calibrateCamera
returns 均方根 (RMS) 重投影误差,在良好的校准中通常应在 0.1 到 1.0 像素之间。
计算是通过使用最终的一组校准参数(cameraMatrix
、distCoeffs
、rvecs
和 [=15] 将 3D 棋盘点 (objectPoints
) 投影到图像平面中来完成的=]) 并比较角的已知位置 (imagePoints
)。
1.0 的 RMS 误差意味着,平均而言,这些投影点中的每一个都与其实际位置相距 1.0 像素。误差不在[0, 1]范围内,可以认为是一个距离。