起点是this image,我想通过一次调用cv.remap
使图像变形并转换为鸟瞰图。为此,我在numpy==1.15.0
Jupyter笔记本中使用opencv-python==3.4.2.17
和Python 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))
其中shape
是original 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
中生成的图像几乎完全是黑色的)。
我在做什么错?提前致谢!如有必要,我还可以提供整个笔记本电脑。