我有一个180度的鱼眼镜头,我希望获得尽可能宽的视野的不失真图像。最终,我希望能够使用它通过鱼眼镜头创建180度自上而下的图像。为此,我想先使图像失真,同时保留尽可能多的图像数据。
我使用opencv fisheye.calibrate在python中使用了从不同角度拍摄的棋盘图像,并且正确地使鱼眼图像不失真,给了我不错的结果。但是,由于所得图像如何使图像不失真,因此其视野比鱼眼图像差得多。
鱼眼镜头图像:
缺少图像失真的视野:
当前代码:
DIM=(960, 540)
K=np.array([[263.1021173128426, 0.0, 477.98780306608234], [0.0, 261.30612719984185, 300.714230825097], [0.0, 0.0, 1.0]])
D=np.array([[-0.0007727739728155351], [-0.10019345132548932], [0.10790597488851726], [-0.040655761660861996]])
def undistort(img):
h,w = img.shape[:2]
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, DIM, cv2.CV_16SC2)
return cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
据我了解,如果不将输出拉伸为不希望的形状(例如in this image),就无法增加不失真输出的视场。但是,我看到人们能够从不同的角度创建多张未失真的图像。例如,给定上面的原始鱼眼图像,我希望能够从不同的角度(例如this和this)创建图像,然后可以将它们缝合在一起以获得更大的视野。是否可以通过调节opencv不失真函数的校准参数来实现这一目标?
我认为这是有可能的,因为我在其他情况下(例如here (using java and boofCV))已经看到了它。
对于获得更大视野的替代方法的任何建议也将不胜感激。