OpenCV立体声校准的重投影误差较低,但不正确



几个月来我一直在尝试让OpenCV相机校准工作,但到目前为止我一直没有成功。我处于可以得到低重新投影误差(低于 0.5 像素(的地步,但是当我检查 stereoRectify 输出的图像时,它们显然没有得到正确纠正。相应的点不水平对齐。校正的明显效果是稍微旋转一个图像并放大另一个图像。整流生成的视差图是嘈杂的,根本不正确(同时使用StereoSGBM和StereoVar(。

我尝试使用几组不同的校准图像,范围从 20 到 80 帧不等。我尝试了棋盘大小、距离和旋转的各种组合,但都无济于事。在每种情况下,我都会得到不同的结果,但都带有上述无用的视差图类型。

MATLAB

立体声校准在相同的视频上产生更好的结果,但不幸的是,在我的情况下,MATLAB 不能作为长期解决方案。我不明白为什么OpenCV认为它找到了良好的立体声校正,而事实并非如此。 我是否缺少有关如何校准相机的内容?还有其他人遇到过这样的问题吗?

鉴于它在 MATLAB 中工作,我假设您的立体摄像头设置正确,这意味着它们是完全固定的。我想到的是:您是否单独校准了相机?因此,您可以从那里使用摄像机矩阵和立体校正中的失真系数。另外,我注意到findChessboardCorners在图像质量较低时表现不佳。但这应该会导致高 RMS 错误。无论如何,您不仅应该拥有相当多的图片(我使用了 100 张(,而且还应该具有校准板与相机的不同角度。并且电路板到相机的距离不应太高,以便电路板覆盖大部分图像。(由于两个摄像头都需要完全可见的电路板,所以我使用预览来调整位置。这并不能真正回答您的问题,但我希望它仍然有所帮助。

您是否在 MATLAB 和 OpenCV 中使用相同的图像进行校准?另外,您是否在 MATLAB 中使用立体相机校准器应用程序?

如果您使用的是完全相同的校准图像,那么对您所看到的内容的可能解释是,MATLAB 中的棋盘检测器比 OpenCV 中的棋盘检测器更准确。

如果您使用不同的校准图像,那么我会尝试使用 undistort 函数在 OpenCV 中取消失真图像,而不是纠正它们。很有可能,未失真的图像看起来会非常扭曲和折叠。 再加上低重投影误差,表明您没有很好地估计镜头失真。 通常,当您的棋盘格大部分位于图像的中间并且您没有获得靠近边缘的任何点时,就会发生这种情况。这里的补救措施是在棋盘格靠近图像的边缘和角落的情况下获得更多图像。