OpenCV中Delaunay三角剖分的匹配结果

3
我有两组点,分别为A和B,大小相同。我使用OpenCV的Subdiv2D类对每组点进行Delaunay三角剖分。每组点代表每个人脸的面部特征,我试图在A组中的每个三角形内采样纹理,并将其扭曲到B组对应的三角形中。实际上,这将给我一种将一种面部表情变形成另一种效果(仅通过扭曲纹理)。不幸的是,当我为A组和B组分别调用getTriangleList方法时,A_i三角形不对应于B_i三角形。换句话说,三角形顺序与将点添加到每个集合中的顺序不同。我实际上进行了非常简单的测试,将B组创建为A组的副本,并向B组中每个点的x坐标添加一个常量值,有效地将B组中的每个点向右移动。经过三角剖分后,顺序再次被打乱了。有没有办法跟踪哪个三角形是哪个?如果没有,我将无法正确地从一个形状扭曲到另一个形状(除非有其他方法)。

我这里也有同样的问题。你找到的解决方案是为一个图像找到三角形的索引,并将其用于另一个工作映射,大多数情况下可以完美地映射三角形。然而,在某些情况下,映射并不完美,有一个或几个三角形根本没有被映射。因此,这个解决方案并不完美。有没有更好的解决方案?这并不容易,因为使用 Voronoi 图创建三角形使得如果图像 1 中的点与周围其他点在图像 2 中的比例不同,则映射变得复杂。谢谢您的帮助 :) - Gabriel Beauchemin-Dauphinais
1个回答

0
我上面提出的问题根本没有答案,因为不能保证两个相似的集合(AB)具有相同数量、意义和顺序的点在进行 Delaunay 三角剖分后拥有相同的拓扑结构。换句话说,如果 A 中的三个点 A_0 到 A_2 形成一个三角形,则 B 中的点 B_0 到 B_2 不一定要形成一个三角形(它们可以属于两个或更多不同的三角形)。
我找到的解决方法是创建一个映射 M(三角形ID,点ID),将 A 中的三角形 ID 与属于该三角形 ID 的顶点 ID 相关联。接下来,我完全不对 B 进行三角剖分——因为 B 中的点顺序和含义与 A 中的相同,我也可以将映射 M 应用于 B,以完全相同的方式对 B 进行三角剖分,从而保持拓扑结构。之后,这个问题就迎刃而解了。这当然不能保证 B 将按照 Delaunay 规则正确地被三角剖分,但它解决了我的问题。

一个例子:https://pysource.com/2019/05/09/select-and-warp-triangles-face-swapping-opencv-with-python-part-4/ - Furkan Guvenc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接