cvRemap替换cvWarpPerspective

时间:2012-08-09 07:37:59

标签: image-processing opencv emgucv

转化是我想要做的。

对于源图像中的每个图块,我知道每个角的坐标,并且我知道输出图像中每个对应角的坐标,因此我可以调用 cvWarpPerspective 来扭曲每个图块然后将四边形连接在一起以获得最终输出图像。

cvRemap 可以在一次转化中执行此操作吗?如果是,我如何从我传递给cvRemap函数的坐标构造地图(mapx和mapy)?我搜索了EmguCV文档,但找不到cvRemap示例。

The source image

The output image

1 个答案:

答案 0 :(得分:4)

我没有使用emgu的经验(实际上我对它的态度很低),但我可以解释一下重映射和warpPerspective。它可以帮助您在emgu中找到相应的函数。

重映射获取输入图片和坐标重定位图,并将其应用于输出。地图存储如下信息:取像素(1,4)并将其移动到(3,5)。未在地图中定义的像素将填充0或其他值,具体取决于额外参数。请注意,它还使用一些插值来获得平滑的结果。

warpPerspective采用几何透视变换,在内部计算变换的映射,然后调用remap()将其应用于输入。实际上,OpenCV中的许多功能都使用重映射,或者可以使用它。 warpAffine,镜头校正等构建自定义地图,然后调用重映射应用它们。

透视变换由3.3矩阵H定义。因此,输入图像中的每个坐标将根据H矩阵移位:

            [ h11 h12 h13 ]    [ x ]
[x' y' 1] = [ h21 h22 h23 ] *  [ y ]
            [ h31 h32 h33 ]    [ 1 ]

warpPerspective对目标图像中的每个点应用逆变换,以找出源图像中应该移入的像素的位置,并将该信息存储在地图中。

您可以在应用中使用该代码并制作自定义功能,但我不知道在C#中执行该功能有多容易。 C ++本来就是小菜一碟。

最后说明:我使用了术语 map ,尽管remap()函数中有两个map参数。更令人困惑的是,它们可能具有完全不同的含义。

  • 第一个有效组合是mapx包含x坐标的坐标变换,在宽度与高度的图像中,一个通道。 mapy是y维度的对应映射。坐标是浮点值,反映了从一个图像到另一个图像的坐标转换不会精确映射到整数值的事实。例如,像素(2,5)可以映射到(3.456,7.293)

  • 第二种可能性是在两个通道中为x和y存储mapx中的整数坐标,并在第二个参数mapy中保留插值权重表。生成第一种格式通常要容易得多,但第二种格式更快。要了解sencod格式,您应该阅读OpenCV源代码,因为它没有记录任何内容。