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

Matching results of Delaunay triangulation in OpenCV

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

我上面问的问题根本没有答案,因为不能保证两个相似的集合(AB)点数相同、含义相同、顺序相同的点,经过Delaunay三角剖分处理后,具有相同的拓扑结构。换句话说,如果 3 个点 A_0 到 A_2 在 A 中构成一个三角形,点 B_0 到 B_2 不一定必须在 B 中构成一个三角形(它们可以属于两个或多个不同的三角形)。

我找到的解决方案是创建一个映射 M(triangleId, pointIds) 将来自 A 的三角形 ID 与属于来自 A 的那个 triangleId。接下来,我根本不对 B 进行三角剖分 - 因为 B 中的点顺序和含义与 A 中的相同,我也可以将映射 M 应用于 B 以及以完全相同的方式对 B 进行三角剖分,从而保持拓扑结构。之后,问题就消失了。这显然不能确保根据 Delaunay 规则对 B 进行正确的三角剖分,但是它解决了我的问题。