【问题标题】:Fisheye/Wide-Angle lens Calibration in OpenCVOpenCV中的鱼眼/广角镜头校准
【发布时间】:2012-10-12 09:15:24
【问题描述】:

我知道默认的 OpenCV 校准系统为针孔相机建模,但我正在使用一个使用极宽 FOV 镜头(187 度)的系统。如果在 OpenCV 中有任何现有的方法可以做到这一点,或者只使用广角镜头?还是我必须为我的系统重写所有校准/不失真?

【问题讨论】:

  • 你试过opencv的功能吗?他们对针孔相机进行建模这一事实意味着他们对针孔相机的失真进行建模,未失真的相机就是针孔相机。我相信opencv可以纠正径向和切向失真,你还有其他类型的失真需要纠正吗?
  • 我有,它们似乎几乎可以工作,但所做的一些假设并不准确。例如,我可以用 187 度的摄像头真正看到自己身后,因此计算 2D->3D 变换变得更加困难,因为点可以在前面的 180 度区域内,并且与观察方向完全正交。

标签: opencv camera-calibration distortion calibration


【解决方案1】:

似乎没有好的 OpenCV 方法可以做到这一点。

我最终使用 OCamLib 进行实际校准,然后编写自己的“undistortPoints”函数(使用 Scaramuzza 算法)将 2D 图像点不失真为 3D 单位向量(而不是 2D 点)。不幸的是,这也破坏了 OpenCV 中的许多其他内容,因为大多数 OpenCV 图像处理函数都需要 2D 点和它们自己的针孔校准模型,因此我不得不为此重建代码的重要部分。

我欢迎任何其他对此的见解。

【讨论】:

  • 如果您可以使用,您介意发布/分享您的代码吗?
  • 是的,这听起来很有趣。也不介意看代码。感谢引用 Scaramuzza 的算法。
【解决方案2】:

人们不经常使用广角镜头有一个很好的理由 - 当图像不失真时,生成的图像非常不矩形,并且边缘的质量非常糟糕,需要将图像裁剪回… 90 度 FOV。所以问题是,为什么不首先使用 90 度 FOV 镜头呢?立体相机和图像校正使情况变得更糟。

如果您确实需要宽 FOV,请使用多个摄像头或旋转摄像头。以下是一些示例:PointGrey Inc.

【讨论】:

    【解决方案3】:

    为了校准具有极宽 FOV 镜头的相机,您可以使用 Omnidirectional Camera module 和 OpenCV Contrib。 请务必注意,您必须使用 OpenCV 贡献重新构建您的 OpenCV 才能使用它。

    【讨论】:

      【解决方案4】:

      OpenCV 鱼眼相机标定模块采用基于针孔相机模型的方法。在这个模型中,我们在相机的光轴和来自相机前面的某个物体的光线之间有一个角度。我们在光轴和方向之间也有一个角度来指向未失真的图像(对应于对象)。 如果校准正确,这两个角度将相等。这意味着如果您的相机的FOV约为180度,则从未失真图像的中心到未失真图像边缘的距离将等于无穷大。 因此,OpenCV 鱼眼校正模块 (cv::fisheye) 仅对图像的中心部分进行不失真。我放置了HERE 对此限制的更详细解释。在我自己的结果中,我得到了 140-150 度 FOV 的未失真图像。如果 FOV 140-150 度左右适合你,你可以直接使用 cv::fisheye 不做任何修改

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 1970-01-01
        • 2018-04-15
        • 2013-12-05
        • 1970-01-01
        • 2018-11-24
        • 2018-06-05
        • 2017-04-27
        • 1970-01-01
        相关资源
        最近更新 更多