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

时间:2017-06-07 08:40:57

标签: c++ opencv image-processing camera camera-calibration

我尝试用超广角镜头校准相机> 180度。我使用来自opencv/samples/cpp/tutorial_code/calib3d/camera_calibration的OpenCV 3.2和相机校准代码,因此我从this one获得与this post相似的图像。我在youtube.com上发现了很多电影,人们展示了如何校准鱼眼相机,例如this video

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

中还有另一种用于鱼眼摄像机校准的标准模型

是否可以使用标准OpenCV的相机校准模型来校准这样的广角相机,还是应该使用其他模型,例如openCV contrib?

3 个答案:

答案 0 :(得分:4)

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

我最终放弃了标准模型,只使用了全方位模型 - http://docs.opencv.org/trunk/dd/d12/tutorial_omnidir_calib_main.html,它就像一个魅力。

正如旁注,在我研究失真校正的主题时,我遇到了一个常见的误解,即鱼眼镜头产生的鱼眼图像是“扭曲的”,实际上它们可能会被扭曲,但最终的图像只是一个投影。像其他投影一样的鱼眼是将3D世界映射到2D平面的众多方法之一。大多数相关文献将其称为“失真”并没有帮助。鱼眼镜片被有意设计成产生具有弯曲线条的图像,当这些线条与标准(即直线)镜片笔直时。 “失真”一词仅保留用于对标准(即直线)镜头产生负面影响的几何像差。

在我的情况下,即使我正在研究失真校正,我也没有最终纠正任何失真,我只是简单地做了一个鱼眼透视投影 - 你可以在这里找到更多信息http://paulbourke.net/dome/fish2/ < / p>

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

答案 1 :(得分:1)

我通过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。我放置HERE这个限制的详细解释。如果140-150度FOV适合您,您可以使用此模块而无需任何修改

答案 2 :(得分:0)

鱼眼校准有特定的校准功能:见http://docs.opencv.org/trunk/db/d58/group__calib3d__fisheye.html

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