opencv - 较小的重投影误差是否总是意味着更好的校准?

标签 opencv camera-calibration

在相机校准期间,通常的建议是使用许多图像 (>10),并在姿势、深度等方面有所变化。 但是我注意到,通常我使用的图像越少,重投影误差就越小。例如,对于 27 张图像,cv::calibrateCamera 返回 0.23,而只有 3 张图像,我得到 0.11 这可能是因为在校准期间我们正在解决超定系统的最小二乘问题。

问题:

  1. 我们真的使用重投影误差作为校准好坏的绝对衡量标准吗?例如,如果我用 3 张图像校准并得到 0.11,然后用 27 张其他图像校准并得到 0.23,我们真的可以说“第一次校准更好”吗?

  2. OpenCV 使用相同的图像进行校准和计算误差。这不是某种形式的过度拟合吗?如果我实际上使用了 2 个不同的集合 - 一个用于计算校准参数,一个用于计算误差 - 会不会更正确?在那种情况下,我会使用相同的(测试)集来计算来自不同(训练)集的所有校准结果的误差。这不是更公平吗?

最佳答案

抱歉,如果这为时已晚 - 才刚看到。

错误是拟合的重投影。因此,找到图像上的点,计算真实世界模型,重新计算这些点在给定模型的图像上的位置——报告差异。在某种程度上,这有点循环,你可能有一个模型只对那几张图像正确,然后会报告一个非常好的错误,而给它很多图像会产生一个更普遍正确的模型 - 但会有更大的错误错误,只是因为您试图拉伸(stretch)它以适应更大的空间。

确实存在一点,即添加更多图像并不能提高拟合度,并且可能会增加噪声,因为从未完美地检测到点。重要的是提供更大的参数集,更多的角度和位置,而不是等效的数据

使用相同的图像集来预测误差并不是真正的问题,因为拟合在实际物理镜头参数方面确实具有真正的意义 - 这不像在相同的数据上训练/测试神经网络。

编辑:3D-DIC 中包含比 opencv 更好的校准例程(尽管基于相同的概念) (免费但不是OSS,注册本站获取下载链接)具体见calibration manual .

关于opencv - 较小的重投影误差是否总是意味着更好的校准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11918315/

相关文章:

c++ - OpenCV - 将相机矩阵和畸变系数存储为 Mat

opencv - 使用已知的相机位置和矩阵查找 3D 对象位置

python - 在无法访问相机的情况下删除鱼眼效果

C++Amp 将 16 位图像从一个纹理复制到另一个纹理(来自 openCV Mat)

android - 在 Android 上移动轮廓

opencv - OpenCV-使用水中的静态图像校准相机

opencv - OpenCV摄像机校准-使用Kinect

android - 如何设置android camera2参数以获得最佳文本识别效果

c++ - 如何在 Linux 中将 OpenCV 添加到 LD_LIBRARY_path?

opencv - JavaCV 计算 SIFT 关键点的 ORB 描述符