OpenCV中的鱼眼/广角镜头校准

11

我知道默认的OpenCV校准系统模拟针孔相机,但我正在使用一个使用极宽视场镜头(187度)的系统。是否有现有的方法在OpenCV中处理这种情况,或者只使用广角镜头进行操作?还是说我必须为我的系统重新编写所有的校准/去畸变代码?


你尝试过使用OpenCV的函数吗?它们模拟针孔相机,这意味着它们可以模拟针孔相机的畸变,而未经畸变处理的相机就是针孔相机。我相信OpenCV可以纠正径向和切向畸变,你还有其他类型的畸变需要纠正吗? - Hammer
我已经有了一些代码,它们似乎几乎可以工作,但其中一些假设并不准确。例如,我可以用一个187度的摄像头看到自己身后,因此计算2D->3D变换会更加困难,因为点可以在前面的180度区域内,并且完全正交于观察方向。 - Yeraze
4个回答

9
看起来没有很好的OpenCV方法可以实现这个功能。 我最终使用OCamLib来进行实际的校准,然后编写自己的“undistortPoints”函数(使用Scaramuzza的算法)将2D图像点矫正为3D单位向量(而不是2D点)。 不幸的是,这也破坏了OpenCV中的许多其他功能,因为大多数OpenCV图像处理函数都需要2D点和自己的针孔校准模型,所以我不得不重建代码的大部分内容。 我欢迎任何关于此的其他见解。

6
请问您能否分享您的代码,如果它已经起作用了? - nbubis
是的,这听起来非常有趣。不介意看看代码。感谢参考Scaramuzza的算法。 - Eduard Feicho

2
人们很少使用广角镜头,原因是当图像未经失真时,生成的图像非常不规则,边缘的质量非常差,需要将图像裁剪回到90度视场。那么问题来了,为什么不直接使用90度视场的镜头呢?而使用立体相机和图像矫正会使情况变得更糟。如果您真的需要广阔的视场,请使用多个摄像机或旋转摄像机。以下是一些示例:PointGrey Inc.

2
为了校准具有极宽视场角镜头的相机,您可以使用OpenCV Contrib中的全向摄像机模块。 需要注意的是,您必须重新构建带有OpenCV contribs的OpenCV才能使用它。

0

OpenCV鱼眼相机校准模块使用基于针孔相机模型的方法。在该模型中,相机的光学轴与来自相机前方某个物体的光线之间有一个角度。我们还有光学轴与对应于物体的无畸变图像上一点的方向之间的角度。 如果校准正确,这两个角度将相等。这意味着如果您的相机FOV约为180度,则无畸变图像中心到边缘的距离将等于无限远。 因此,OpenCV鱼眼纠正模块(cv::fisheye)仅对图像的中心部分进行畸变校正。关于这种限制的更详细说明我放在了这里。在我的实验结果中,无畸变图像中获得了140-150度FOV。如果140-150度的FOV适合您,您可以直接使用cv::fisheye。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接