OpenCV stereo_calib 的好结果是啥?

Posted

技术标签:

【中文标题】OpenCV stereo_calib 的好结果是啥?【英文标题】:What is a good result from OpenCV stereo_calib?OpenCV stereo_calib 的好结果是什么? 【发布时间】:2019-11-12 20:56:06 【问题描述】:

我下载并构建了 OpenCV 4.1.1(使用 install-opencv.sh)然后尝试在我的相机上使用 stereo_calib,但结果一直很差;我得到 0.6 的 RMS 误差。博文Building OpenCV Stereo Vision - Calibration 说:

校准完成后,输出和RMS误差。我得到了一个 RMS 0.3 这对于 VGA 相机来说非常好,但可能会更好。如果 RMS 高于 0.5,我建议您重复该过程。

为了演示一个很好的示例,我使用了samples/data - stereo_calib.xml 中提供的示例数据及其列出的图像。 stereo_calib 的结果是:

..........................13 pairs have been successfully detected.
Running stereo calibration ...
done with RMS error=0.635856
average epipolar err = 0.443478

这似乎与我从数据中得到的大致相同。即使 RMS 误差高于 0.5,这是一个合理的结果吗?那么平均极线误差呢?

我使用结果在第一个示例图像上运行 stereo_match:

stereo_match -i=intrinsics.yml -e=extrinsics.yml -o=disparity.png -p=point_cloud.txt --max-disparity=16 --blocksize=15 left01.jpg right01.jpg

由此产生的差异看起来不太好:

但在CloudCompare 中查看 point_cloud.txt 似乎确实显示了一个平面对象(棋盘),尽管效果很差。这工作正常吗?或者它是一个坏例子?

【问题讨论】:

【参考方案1】:

视差是来自立体相机对的两个图像中对应点之间的距离(以像素为单位)(与距离成反比)。快速手动估计显示最大差异(在原始未校正图像中)超过 130(棋盘右上角)。

您需要有足够大的视差搜索范围才能获得不错的视差。 max-disparity 的值必须高得多,至少与最大预期差异一样大。

校准中的高 RMS 误差通常表示校准不佳,但低 RMS 误差并不一定意味着校准良好。如果你想快速检查你的立体校准,为了可视化,你可以纠正输入图像,然后在两个图像上画一些水平线。如果标定好,对于一个图像中的任意点,在同一水平线上(相同的y坐标,x坐标的差异就是视差)找到另一幅图像中的对应点,如果可见的话。

【讨论】:

以上是关于OpenCV stereo_calib 的好结果是啥?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3.0 中的人脸地标提取。任何人都可以建议任何可以让我提取面部地标的好的开源库吗?

什么是投票结果栏的好技术?

cvCalcPGH 与 cvFindContours 的使用

将“uname -a”的结果发送到流的好方法?

使用 OpenCV 进行立体视觉

OpenCV vs Dlib 人脸检测比较分析