我尝试用超广角镜头校准相机> 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?
答案 0 :(得分:4)
我最终放弃了标准模型,只使用了全方位模型 - 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
确保在图像的边框中获得具有各种姿势和相机距离的图像,以便进行良好校准。调整校准示例以使用鱼眼功能。