我知道默认的 OpenCV 校准系统为针孔相机建模,但我正在使用一个使用极宽 FOV 镜头(187 度)的系统。如果在 OpenCV 中有任何现有的方法可以做到这一点,或者只使用广角镜头?或者我是否必须为我的系统重写所有校准/不失真?
4 回答
似乎没有好的 OpenCV 方法可以做到这一点。
我最终使用 OCamLib 进行实际校准,然后编写我自己的“undistortPoints”函数(使用 Scaramuzza 的算法)将 2D 图像点不失真为 3D 单位向量(而不是 2D 点)。不幸的是,这也破坏了 OpenCV 中的许多其他内容,因为大多数 OpenCV 图像处理函数都需要 2D 点和它们自己的针孔校准模型,因此我不得不为此重建代码的重要部分。
我欢迎对此有任何其他见解。
人们不经常使用广角镜头有一个很好的理由——当图像不失真时,生成的图像是高度非矩形的,并且边缘的质量非常糟糕,以至于需要将图像裁剪回...... 90 度视场。所以问题是,为什么不首先使用 90 度 FOV 镜头呢?立体摄像头和图像校正使情况变得更糟。
如果您确实需要宽 FOV,请使用多个相机或旋转相机。以下是一些示例:PointGrey Inc.
OpenCV 鱼眼相机标定模块采用基于针孔相机模型的方法。在这个模型中,我们在相机的光轴和来自相机前面的某个物体的光线之间有一个角度。我们在光轴和方向之间也有一个角度来指向未失真的图像(对应于对象)。如果校准正确,这两个角度将相等。这意味着如果您的相机的FOV约为180度,则从未失真图像的中心到未失真图像边缘的距离将等于无穷大。因此,OpenCV 鱼眼校正模块 (cv::fisheye) 仅对图像的中心部分进行不失真。我在此处放置的此限制的更详细说明.在我自己的结果中,我在未失真的图像中获得了 140-150 度的 FOV。如果 FOV 大约 140-150 度适合您,您可以使用 cv::fisheye 无需任何修改