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

时间:2016-02-03 22:41:33

标签: c++ opencv camera-calibration matlab-cvst stereo-3d

我一直试图让OpenCV摄像机校准工作几个月,但到目前为止我还没有成功。我正处于可以获得低重新投影误差(低于0.5像素)的位置,但是当我检查stereoRectify输出的图像时,它们显然没有正确纠正。相应的点不是水平对齐的。整流的显着效果是稍微旋转一个图像并缩放另一个图像。整流产生的视差图噪声很大而且不正确(使用StereoSGBM和StereoVar)。

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

MATLAB立体声校准可以在相同的视频上产生很多更好的效果,但遗憾的是MATLAB在我的情况下不能作为长期解决方案。 我不明白为什么OpenCV认为它找到一个好的立体声校正,当它显然不是。我错过了有关如何校准相机的内容吗?还有其他人遇到过这样的问题吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您是否在MATLAB和OpenCV中使用相同的图像进行校准?另外,你在MATLAB中使用Stereo Camera Calibrator app吗?

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

如果您使用的是不同的校准图像,那么我会尝试使用undistort功能在OpenCV中对图像进行不失真处理,而不是对其进行整理。很可能是未失真的图像看起来非常扭曲并折叠在自己身上。这与低重投影误差一起表明您没有很好地估计镜头失真。通常情况下,当您的棋盘大部分位于图像中间时,您没有得到靠近边缘的任何点。这里的补救措施是获得更多图像,棋盘位于图像的边缘和角落附近。