c++ - OpenCV stereo_calib 的好结果是什么?
问题描述
我下载并构建了 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似乎确实显示了一个平面对象(棋盘),尽管效果很差。这工作正常吗?或者这是一个坏例子?
解决方案
视差是来自立体相机对的两个图像中对应点之间的距离(以像素为单位)(与距离成反比)。快速手动估计显示最大差异(在原始未校正图像中)超过 130(棋盘的右上角)。
您需要有足够大的视差搜索范围才能获得不错的视差。的值max-disparity
必须高得多,至少与最大预期差异一样大。
校准中的高 RMS 误差通常表示校准不好,但低 RMS 误差并不一定意味着校准良好。如果您想快速检查您的立体校准,为了可视化,您可以校正输入图像,然后在两个图像上绘制一些水平线。如果校准良好,对于一幅图像中的任何点,如果可见,则在同一水平线上找到另一幅图像中的对应点(相同的y坐标,x坐标的差异就是视差)。
推荐阅读
- c# - 如何使用 Selenium Webdriver C# 替换 innerHTML 代码?
- wordpress - Woocommerce 帐户页面短代码
- python - 我可以编写更有效的代码来在 Python 中获取对角线总和吗?
- pandas - 如何将数据从两列传递到弹出标签,以用于使用 folium 制作的等值线图的标记?
- go - 如何使用 Google Drive Api 和服务帐户获取已加星标的文件?
- ruby-on-rails - 如何按完整地址进行地理编码,或者,如果完整地址失败,仅邮政编码?
- angular - 基于角色的视图的 Angular 8 指令
- python - 如何删除 Pylint 生成的红色错误文本?
- javascript - Vue.js:v-for over object 导致键的顺序错误
- c++ - 将所有值的引用从映射中获取到 C++ 中的向量