是否可以使用标准 openCV 校准鱼眼相机?

Is is possible to calibrate fish eye camera using standard openCV?

我尝试用 > 180 度的超广角镜头校准相机。我使用 OpenCV 3.2 和来自 opencv/samples/cpp/tutorial_code/calib3d/camera_calibration 的相机校准代码,结果我得到的图像类似于 this one from this post. I found numerous movies on youtube.com on which people show how they calibrate fisheye cameras, for example this video

我知道超广角镜头相机的校准可能很棘手。我还发现 openCV contrib

中还有另一个用于鱼眼相机校准的标准模型

是否可以使用标准 OpenCV 中的相机校准模型来校准这种广角相机,或者我应该使用其他模型,例如来自 openCV contrib 的模型?

鱼眼标定有具体的标定函数:见http://docs.opencv.org/trunk/db/d58/group__calib3d__fisheye.html

确保您在图像的边界中获得具有各种姿势和与相机的距离的图像,以便进行良好的校准。调整校准示例以使用鱼眼功能。

几周前我正在处理同样的问题,我发现标准模型不适用于我的鱼眼图像(>180 FOV)。话虽如此,我确实在 Github 上找到了一个拉取请求,它解决了这个问题 - https://github.com/opencv/opencv/pull/6801.

我最终放弃了标准模型,只使用了全向模型 - http://docs.opencv.org/trunk/dd/d12/tutorial_omnidir_calib_main.html 效果很好。

附带说明一下,在研究失真校正主题时,我遇到了一个常见的误解,即鱼眼镜头产生的鱼眼图像是 "distorted",实际上它们可能会失真,但生成的图像是只是一个投影。与其他投影一样,鱼眼是将 3D 世界映射到 2D 平面的众多方法之一。大多数相关文献都将其称为 "distortion",这无济于事。鱼眼镜头被特意设计成产生带有弯曲线条的图像,而这些线条在使用标准(即直线)镜头时应该是直的。 "distortion" 一词仅用于对标准(即直线)镜头产生负面影响的几何像差。

在我的例子中,尽管我正在研究失真校正,但我并没有最终校正任何失真,我只是简单地做了一个鱼眼透视投影 - 你可以在这里找到更多相关信息 http://paulbourke.net/dome/fish2/

此外,关于捕获棋盘图像,请遵循以下建议 - How to verify the correctness of calibration of a webcam?

我通过 Open CV 3.4.0 的 cv::fisheye 模块为 180 度 FOV 鱼眼相机解决了这个问题。 (C++,MS Windows)。

我使用 cv::fisheye::calibrate 来制作 K 和 D(相机矩阵和径向畸变系数矩阵)。然后我使用 cv::fisheye::initUndistortRectifyMap 生成 X 和 Y 坐标的地图。最后,我使用 cv::remap 通过 initUndistortRectifyMap 中的贴图消除鱼眼相机的图像失真。该解决方案有一些局限性(OpenCV 仅对鱼眼图像的中心部分进行反扭曲。边缘移到外面)结果您将获得 140-150 的 FOV。这个限制的详细解释我放在。如果140-150度FOV适合您,您可以不做任何修改使用此模块