ken*_*yzx 1 opencv image-processing emgucv
下面的转换是我想要做的。
对于源图像中的每个图块,我知道每个角的坐标,并且我知道输出图像中每个对应角的坐标,因此我可以调用cvWarpPerspective来扭曲每个图块,然后将四边形连接在一起以获得最终的输出图像。
cvRemap可以在一次转换中完成此操作吗?如果是,如何从传递给 cvRemap 函数的坐标构建地图(mapx 和 mapy)?我搜索了 EmguCV 文档,但找不到 cvRemap 示例。


我没有使用 emgu 的经验(实际上我对它不太尊重),但我可以解释一下 remap 和 warpPerspective。它可以帮助您找到emgu中相应的函数。
重映射采用输入图片和坐标重定位图,并将其应用于输出。地图存储这样的信息:获取像素 (1, 4) 并将其移动到 (3, 5)。地图中未定义的像素将填充 0 或其他值,具体取决于额外的参数。请注意,它还使用一些插值来获得平滑的结果。
warpPerspective 进行几何透视变换,在内部计算变换的贴图,然后调用 remap() 将其应用到输入。其实OpenCV中很多函数都使用了remap,或者说可以使用它。warpAffine、镜头校正等构建自定义贴图,然后调用 remap 来应用它们。
透视变换由 3.3 矩阵 H 定义。因此,输入图像中的每个坐标将根据 H 矩阵进行移位:
[ h11 h12 h13 ] [ x ]
[x' y' 1] = [ h21 h22 h23 ] * [ y ]
[ h31 h32 h33 ] [ 1 ]
Run Code Online (Sandbox Code Playgroud)
warpPerspective 对目标图像中的每个点应用逆变换,以找出源图像中应移入的像素的位置,并将该信息存储在地图中。
您可以使用该代码并在您的应用程序中创建自定义函数,但我不知道在 C# 中执行此操作有多容易。C++ 本来就是小菜一碟。
最后注意:尽管 remap() 函数中有两个 map 参数,但我使用了术语map 。更令人困惑的是,它们可能具有完全不同的含义。
第一个有效组合是 mapx 包含 x 坐标的坐标变换,在宽高图像中,一个通道。mapy 是 y 维度对应的映射。坐标是浮点值,反映了从一个图像到另一图像的坐标变换并不精确映射到整数值的事实。例如,像素 (2, 5) 可以映射到 (3.456, 7.293)
第二种可能性是将两个通道中 x 和 y 的整数坐标存储在 mapx 中,并在第二个参数 mapy 中保留插值权重表。生成第一种格式通常要容易得多,但第二种格式的处理速度更快。要了解 sencod 格式,您应该阅读 OpenCV 源代码,因为它没有任何文档记录。
| 归档时间: |
|
| 查看次数: |
2895 次 |
| 最近记录: |