OpenCV Remap 与形状 map1 (h,w,2) 和形状 map2 (h,w) 的映射

OpenCV Remap with maps of shape map1 (h,w,2) and shape map2 (h,w)

map1 的形状为 (h,w,2)map2 的形状为 (h,w) 时,cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR) 会做什么。 这些地图作为 cv2.fisheye.initUndistortRectifyMap 的输出,但文档不是很清楚。如果我为 numpy.array([],dtype=np.int16) 更改 map2 变量,它仍然会给我一个看起来接近于未省略 map2 的输出,但存在差异。

在此过程中,cv2.remap是否更改了img的数据类型?

是的,很遗憾,文档对此不是很清楚。但是,如果您看一下 cv2.remapcv2.computeMaps 这会告诉您它们的实际含义。

总之,cv2.fisheye.initUndistortRectifyMap 的输出提供了两个图,其中第一个图是双通道矩阵,其中第一个通道是 x 坐标,第二个通道是 y 重新映射的坐标。现在不同的是,这是 fixed-point 精度的结果,而不是典型的 floating-point 精度矩阵。 Fixed-point 主要用于计算重映射图像时的计算加速。第二张图是 table 插值系数,因此当您将其与第一张图配合使用时,与使用普通 floating-point 精度矩阵相比,它提供的结果几乎相同,但节省了大量计算。

通过省略第二张地图,您仍然可以获得不错的结果,但是第二张地图为空会导致精度损失,因为您没有提供插值 table 来生成如果您创建的内容使用了 floating-point 精度地图。这就是为什么您正在查看质量稍差的图像。