使用cv.fisheye.initUndistortRectifyMap进行整流转换

时间:2018-07-31 16:06:12

标签: opencv image-processing homography fisheye

起点是this image,我想通过一次调用cv.remap使图像变形并转换为鸟瞰图。为此,我在numpy==1.15.0 Jupyter笔记本中使用opencv-python==3.4.2.17Python 3.7

首先,我确定固有的相机参数和失真系数,调用

rms, K, D, _, _ = cv.fisheye.calibrate(obj_p, img_p, shape[::-1], None, None,
    flags=(cv.fisheye.CALIB_RECOMPUTE_EXTRINSIC + cv.fisheye.CALIB_CHECK_COND + 
           cv.fisheye.CALIB_FIX_SKEW),
    criteria=(cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 1e-6))

其中shapeoriginal image的形状。然后我打电话

K_new = cv.fisheye.estimateNewCameraMatrixForUndistortRectify(
    K, D, shape[::-1], np.eye(3))

将相机矩阵调整为未失真的图像。使用通过调用

从这些值生成的映射来调用cv.remap
map_x, map_y = cv.fisheye.initUndistortRectifyMap(
    K, D, np.eye(3), K_new, shape[::-1], cv.CV_16SC2)

得出this image

第二,我使用未失真的图像在图像中找到四个点,可以在cv.getPerspectiveTransform中使用它们来获取H,以转换为鸟瞰图。在H中使用cv.warpPerspective在已经失真的图像上产生this image

最后,我想将两者结合起来,所以我只需要在first image上调用cv.remap一次即可到达last image。尝试调用

R = np.dot(np.linalg.inv(K), H)
R = np.dot(R, K)

K_new = cv.fisheye.estimateNewCameraMatrixForUndistortRectify(
    K, D, bird_shape, R)

map_x, map_y = cv.fisheye.initUndistortRectifyMap(
    K, D, R, K_new, (bird_shape[0]*15, bird_shape[1]*15) , cv.CV_16SC2)

,并在original image上的cv.remap中使用生成的映射生成this image(增加了生成的图像大小,因为bird_shape中生成的图像几乎完全是黑色的)。

我在做什么错?提前致谢!如有必要,我还可以提供整个笔记本电脑。

0 个答案:

没有答案