我理解上述问题是广泛而模糊的。 但要加入背景: 我正在尝试确定相机的姿势和位置估计的准确性。我花了几周时间校准和尝试不同的方法和不同尺寸的电路板,照明,距离等。
我尝试过的方法:
说明
在所有情况下,我都遵循严格的指导原则How to verify the correctness of calibration of a webcam?
在以上因素的所有组合中,我得到几毫米的结果(+ - 15毫米) 对于上述方法,我在1280x720的25mm块的内在函数跨度如下:
不应该是这种情况。当处理1米以下的距离时,相机相对于电路板原点的位置应精确到平均毫米或2毫米(如果不是亚毫米精度)。除非我弄错了?
我的问题是,对于高清网络摄像头来说,什么是理想的简单校准方法,几乎没有失真?
答案 0 :(得分:10)
有许多可能的错误来源。
首先,虽然您尝试过的所有三种校准实施都使用了基本相同的算法,但是有足够的差异可以解释结果中的差异。
主要区别在于棋盘角检测。 Caltech校准工具箱没有自动棋盘检测,并使用第二个优化过程来细化角点。 OpenCV和Camera Calibrator App都会自动检测棋盘,但Camera Calibrator App中使用的算法要好得多。它更加强大,这意味着当OpenCV没有时,它可能会检测到一块电路板,并且它的子像素定位更精确。我的观点是,在这三种方法中,您使用不同的数据点进行校准。因此,您的结果不同也就不足为奇了。
校准后,您会得到什么样的重投影错误? Camera Calibrator应用程序会显示重投影错误的条形图。您应该查看它,并排除导致高错误的图像。理想情况下,您希望平均重投影误差小于半个像素。越低越好。
现在我要问你如何测量从相机到棋盘的距离?您从校准中获得的外显子代表从棋盘的坐标系到相机坐标系的转换,其坐标系的原点是在相机外壳内,在其光学中心。这很难准确测量。更好的方法是place a flat object of a known size on the checkerboard and measure it using the camera。实际上,您可以测量检测到的棋盘角之间的距离。请注意,检测精度是另一个误差来源。
另外,请务必不要将校准图像保存为jpeg。压缩瑕疵会影响棋盘角点检测的准确性。使用像tiff或png这样的无损格式。
答案 1 :(得分:3)
迟到了这个派对,但是如果它可以帮助......
差异并不是那么令人惊讶,因为这三个应用程序虽然主要依赖于相同的算法(并且,对于OpenCV和Matlab工具包,甚至共享作者),但具有不同的实现,具有不同的性能。如果您有兴趣进行公平的比较,您至少应该使用相同的测量集(即检测到的角的位置,子像素细化)驱动它们,这样输出的任何差异纯粹是由于实现。已经正确地指出,通过使用不同的图像格式,您可以有效地使用不同的测量集。
您在主要观点中观察到的变化也不足为奇:很难准确估计它,因为
后一点意味着主点的小但难以检测的变化将导致显着的3D位置误差,除非添加额外的约束,这使得约束误差函数对于量子不是平坦的感兴趣的,即相机相对于校准装置的绝对位置和方向。
要添加的方便约束是: