【问题标题】:OpenCV Remap with maps of shape map1 (h,w,2) and shape map2 (h,w)OpenCV Remap 与 shape map1 (h,w,2) 和 shape map2 (h,w) 的映射
【发布时间】:2020-12-15 12:10:15
【问题描述】:

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

cv2.remap在这个过程中是否改变了img的数据类型?

【问题讨论】:

    标签: opencv image-processing computer-vision opencv3.0 camera-calibration


    【解决方案1】:

    是的,不幸的是,文档对此并不十分清楚。但是,如果您查看 cv2.remapcv2.computeMaps 这告诉你它们的真正含义。

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

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

    【讨论】:

    • 好的。好吧,我现在终于明白了。非常感谢。所有这一切的原因是为了提高重映射的速度。我想要做的是裁剪图像并裁剪地图,然后重新映射图像的一小部分。但是在 map1 中,我需要减去左侧裁剪的 x 像素数量和从顶部裁剪的 y 像素数量。我不确定在图像的 map2 部分是否有任何减法。现在我看到一种方法是将地图转换为 (CV_32FC1, CV_32FC1) 减去左侧和顶部的裁剪值,然后再转换回 (CV_16SC2, CV_16UC1)。
    • 是否可以只从 (CV_16SC2) 中减去裁剪值并保持 CV_16UC1 不变。我猜 CV_16UC1 会错的。
    • @Sadikov 使用cv2.computeMaps 然后在此中间结果上执行裁剪并转换回恕我直言是最安全的方法。正如你所提到的,如果你执行了减法,那么作为map2 提供的插值表不再是正确的。
    • 我想这就是我接下来要做的。谢谢。另外,您是否知道remap 是否会在某些时候在内部更改图像数据类型?
    • @Sadikov 是也不是。它们不会更改图像类型,但它们以每个像素为基础进行操作,这意味着实际像素值本身会单独转换为浮点精度类型,然后计算计算,然后再转换回整数类型.因此,实际输入图像本身永远不会被转换,但插值计算确实会在重新映射之前暂时提升单独变量中的像素值。我不确定这是否回答了您的问题,但我希望它回答了!
    猜你喜欢
    • 2022-07-06
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多