我正在尝试通过OpenCV 3.4.0(C++,MS Windows)执行鱼眼镜头相机校准。

我用cv::fisheye::calibrate制作了K和D(相机矩阵和径向失真系数矩阵)。然后,我使用cv::fisheye::initUndistortRectifyMap生成X和Y坐标的 map 。
最后,我使用cv::remap通过initUndistortRectifyMap中的 map 取消了鱼眼镜头的图像失真。
一切看起来都不错,但是OpenCV只会扭曲鱼眼图像的中心部分。
边移到外面。
我想使整个图像变形。
我尝试手动更改K矩阵中的焦距,并获得未失真的边缘,但是它们变得非常非常模糊。
我在此任务中找到了一些结果。例如

https://www.youtube.com/watch?v=Ll8KCnCw4iU



https://www.youtube.com/watch?v=p1kCR1i2nF0

据您所知,这些结果与我的结果非常相似。
有人能解决这个问题吗?

最佳答案

在过去的两周中,我分析了很多论文。我想我找到了问题的根源。 OpenCV 3.4.0鱼眼不失真方法基于针孔相机模型。我们在相机的光轴和某些物体发出的光线之间有一个 Angular 。我们在到该对象的未失真点的方向与相机光轴之间也有一个 Angular 。如果鱼眼图像未正确失真,则这两个 Angular 将相等。我的鱼眼镜头相机的FOV是180度。这意味着距未失真图像中心和与未失真图像边缘相对应的点的距离等于无穷大。
换句话说,如果我们有一个鱼眼摄像机,其FOV约为180度,则鱼眼图像表面100%的失真(通过OpenCV)是不可能的。

10-07 16:29