我正在使用OpenCV' calibrateCamera
并试图了解它如何计算重投影错误以及此错误代表的内容。它似乎是投影点和测量图像点之间(欧几里得)距离的RMS - 这是对的吗?但是,最终的重投影误差是什么意思最小化"? calibrateCamera()
明确使用函数projectPoints()
来查找投影点吗?
答案 0 :(得分:1)
重投影误差是用估计的内在矩阵和外在矩阵重新投影的3D点与通过某些图像处理技术(例如棋盘图案的角落)检测到的2D图像点之间的误差(例如欧几里德距离)。
最终重投影误差被最小化,因为估计内部和外部参数集的问题是非线性问题,因此您必须找到一组参数,以迭代地最小化此重投影误差。
更多信息:A Flexible New Technique for Camera Calibration ; Zhengyou Zhang ; 2000。
答案 1 :(得分:0)
我指的是OpenCV 3.1.0版,在这里您可以找到calibrateCamera
的文档
http://docs.opencv.org/3.1.0/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b和文档说(粗体是我的):
该算法执行以下步骤:
计算初始内在参数(该选项仅可用 对于平面校准模式)或从输入读取它们 参数。失真系数最初都设置为零 除非一些CV_CALIB_FIX_K?是指定的。
估计最初的 相机姿势好像内在参数已经知道。 这是使用solvePnP完成的。
运行全球Levenberg-Marquardt 优化算法最小化重投影错误,即 观察到的特征点之间的平方距离的总和 imagePoints和投影(使用相机的当前估计值 参数和姿势)对象指向objectPoints。看到 projectPoints了解详情。
该函数返回最终的重新投影错误。
无论如何,我不想依赖文档,而是希望看一下代码:
https://github.com/Itseez/opencv/blob/3.1.0/modules/calib3d/src/calibration.cpp#L3298
答案 2 :(得分:0)
使用main.ts
时,需要在重投影后手动计算RMS。这可能有所帮助。
OPENCV: Calibratecamera 2 reprojection error and custom computed one not agree
答案 3 :(得分:-1)
以下是OpenCV代码calibrate.cpp第1629行的重投影误差计算:
返回std :: sqrt(reprojErr / total);
其中total是所有图像的所有点的总和。