繁体   English   中英

calibrateCamera 和 projectPoints 的重投影

[英]Reprojection of calibrateCamera and projectPoints

我正在使用 OpenCV 的calibrateCamera并试图了解它如何计算重投影误差以及这个错误代表什么。 它似乎是投影点和测量图像点之间(欧几里得)距离的 RMS——对吗? 然而,最终的重投影误差被“最小化”是什么意思呢? calibrateCamera()是否明确使用 function projectPoints()来查找投影点?

再投影误差是用估计的本征和外在矩阵进行投影的3D点与通过某些图像处理技术(例如,棋chess图案的角)检测到的2D图像点之间的误差(例如,欧几里得距离)。

最终的重投影误差被最小化,因为估计内部和外部参数集的问题是一个非线性问题,因此您必须找到一组参数来迭代地最小化此重投影误差。

更多信息: 灵活的相机校准新技术 张正有; 2000年

我指的是OpenCV版本3.1.0,在这里您可以找到calibrateCamera文档, 网址http://docs.opencv.org/3.1.0/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b ,该文档说(粗体是我的):

该算法执行以下步骤:

计算初始固有参数(仅适用于平面校准图案的选项)或从输入参数中读取它们。 除非某些CV_CALIB_FIX_K ?,否则失真系数最初都设置为零。 被指定。

估计初始相机姿态,就好像内部参数已经已知一样。 这是使用resolvePnP完成的。

运行全局Levenberg-Marquardt优化算法以最小化重投影误差,即观察到的特征点imagePoints与投影的目标点objectPoints(使用摄像机参数和姿势的当前估计值)之间的距离的平方总和。 有关详细信息,请参见projectPoints。

该函数返回最终的重新投影错误

无论如何,我宁愿不看文档,而宁愿看一下代码:

https://github.com/Itseez/opencv/blob/3.1.0/modules/calib3d/src/calibration.cpp#L3298

使用projectPoints ,需要在重新投影之后手动计算RMS。 这可能会有所帮助。 OPENCV:Calibratecamera 2重新投影错误和自定义计算的不一致

重投影误差在文献中未在数学上 100% 定义。 形式上,单个重投影误差是与投影像素坐标相关的二维向量。

OpenCV 和大多数其他软件和相关束调整算法在优化期间使用这些 2d 向量的欧几里得长度的平方和作为目标 function。

正如 Geoff 和 Alessandro Jacopson 所指出的,cv::calibrateCamera() 的返回值是欧几里得误差的 RMS(与 v3.1 的文档相反)。 这个数量与客观的function值直接相关,但并不完全相同。

重投影误差的其他定义包括平均欧几里得长度和欧几里得长度的中值。 两者都是合法的,在比较值时必须小心。

可以在此处找到有关此主题的深入文章: https://calib.io/blogs/knowledge-base/understanding-reprojection-errors

这是来自OpenCV代码calibrate.cpp第1629行的重投影误差计算:

返回std :: sqrt(reprojErr / total);

其中total是所有图像的所有点的总和。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM