相机标定 计算重投影误差 C++
时间: 2023-08-12 20:26:11 浏览: 506
相机标定的重投影误差是评估标定结果质量的重要指标之一,它表示通过标定得到的相机内参和外参对一个已知的三维点进行投影后再反投影回图像平面,得到的重投影点与原始图像点之间的距离误差。
在C++中,可以通过以下步骤计算重投影误差:
1.读取标定结果,包括相机内参矩阵、畸变系数、外参矩阵等。
2.读取已知的三维点和对应的图像点,构造出3D-2D点对。
3.对于每个3D-2D点对,使用标定结果进行投影和反投影,得到重投影点和原始图像点。
4.计算重投影误差,可以使用欧氏距离或者L2范数等方法。
下面是一个简单的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// 读取标定结果
Mat K, distCoeffs, rvec, tvec;
FileStorage fs("calib_results.xml", FileStorage::READ);
fs["K"] >> K;
fs["distCoeffs"] >> distCoeffs;
fs["rvec"] >> rvec;
fs["tvec"] >> tvec;
fs.release();
// 读取3D-2D点对
vector<Point3f> objectPoints;
vector<Point2f> imagePoints;
// ...
// 计算重投影误差
double totalError = 0;
vector<float> perPointErrors;
for (int i = 0; i < objectPoints.size(); i++)
{
// 投影和反投影
vector<Point2f> projectedPoints;
projectPoints(objectPoints[i], rvec, tvec, K, distCoeffs, projectedPoints);
Point2f reprojectedPoint;
reprojectImageTo3D(imagePoints[i], reprojectedPoint, rvec, tvec, K, distCoeffs);
// 计算距离误差
double error = norm(projectedPoints[0] - imagePoints[i]);
perPointErrors.push_back(error);
totalError += error * error;
}
double rmsError = sqrt(totalError / objectPoints.size());
return 0;
}
```
需要注意的是,计算重投影误差时需要使用到OpenCV中的投影和反投影函数,分别为projectPoints和reprojectImageTo3D。同时,需要将图像点和重投影点转化为OpenCV中的Point2f类型。
阅读全文