OpenCV 只对鱼眼图像的中心部分进行不失真处理

OpenCV undistorts only a central part of fisheye image

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

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

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

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

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

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

可以实现,只是使用 projection 而不是尝试 undistort它。

这里有更多信息OpenCV fisheye calibration cuts too much of the resulting image

示例结果: