下面是我要做的转换。

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

cvRemap 可以一次转换吗?如果是,如何从传递给cvRemap函数的坐标构造 map (mapx和mapy)?我已经搜索了EmguCV文档,但是找不到cvRemap示例。

最佳答案

我没有使用emgu的经验(实际上我对此没有什么尊重),但是我可以解释一下remap和warpPerspective。它可以帮助您在emgu中找到相应的功能。

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

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

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

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

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

您可以使用该代码并在您的应用程序中创建自定义函数,但是我不知道在C#中实现起来很容易。 C++简直就是小菜一碟。

最后说明:尽管remap()函数中有两个map参数,但我使用了map一词。更令人困惑的是,它们可能具有完全不同的含义。
  • 第一个有效的组合是mapx包含x坐标的坐标转换,在一个宽度乘高度的图像中,一个通道。 mapy是y维度的对应 map 。坐标是浮点值,反射(reflect)了以下事实:坐标从一幅图像转换为另一幅图像并不能精确地映射为整数值。举例来说,像素(2,5)可以映射到(3.456,7.293)
  • 第二种可能性是将x和y的整数坐标存储在mapx中的两个通道中,并在第二个参数mapy中保留插值权重表。通常,生成第一种格式要容易得多,但是第二种格式处理起来更快。要了解sencod格式,您应该阅读OpenCV来源,因为没有任何记录。
  • 10-04 11:56