如何使用 OpenCV 使裁剪后的鱼眼图像不失真

Posted

技术标签:

【中文标题】如何使用 OpenCV 使裁剪后的鱼眼图像不失真【英文标题】:How to undistort a cropped fisheye image using OpenCV 【发布时间】:2017-05-04 18:16:19 【问题描述】:

我正在尝试使用 OpenCV 使鱼眼图像不失真。我已经校准了相机,并且还使用以下代码获得了不错的未失真图像(我刚刚发布了相关部分):

img = cv2.imread('img.jpeg') #image path of pic to distort
h,w = img.shape[:2]

Knew = cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(K,D,(w,h),None)
Knew[(0,1), (0,1)] = .3* Knew[(0,1), (0,1)]

mapx, mapy = cv2.fisheye.initUndistortRectifyMap(K,D,None,Knew,(w,h),5)
img_undistorted = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)

cv2.imshow('undistorted', img_undistorted)
cv2.waitKey(0)
cv2.destroyAllWindows()

现在我必须像这样裁剪鱼眼图像:

这些照片仅用于演示目的。 我使用鱼眼镜头的映射功能来确定我在右侧裁剪的点。但是,如果我使用与上面相同的代码(以及相同的相机矩阵),输出是一个非常奇怪的扭曲图片。

我也考虑过先不失真然后裁剪,但是我无法准确计算出我必须以这种方式裁剪的点。所以我必须先裁剪图像。

那么我如何正确地消除不对称裁剪的鱼眼图像?

【问题讨论】:

【参考方案1】:

当您移动和裁剪图像时,鱼相机校准参数不适合新相机。

也许您可以尝试通过填充零值来使图像对称。 重点是让两张图片的中心点在同一位置。

参考:

http://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#fisheye-estimatenewcameramatrixforundistortrectify

http://answers.opencv.org/question/64614/fisheyeundistortimage-doesnt-work-what-wrong-with-my-code/

【讨论】:

所以你的意思是我应该裁剪图像但是用黑色像素“填充”裁剪区域? 这是我会尝试的。 :(这是个坏消息。 好的,经过一些测试后,我意识到我的校准参数不太正确,然后更正它们然后添加填充对我有用。

以上是关于如何使用 OpenCV 使裁剪后的鱼眼图像不失真的主要内容,如果未能解决你的问题,请参考以下文章

如何找到未失真的鱼眼图像和正常图像之间的差异?

在 OpenCV (Python) 中使用校正失真裁剪图像

鱼眼失真校正

如何通过openCV模拟鱼眼镜头效果?

用于不失真图像的 TensorFlow 函数

鱼眼校准 OpenCV Python