在OpenCV中匹配Delaunay三角测量的结果

时间:2016-12-17 22:56:13

标签: opencv triangulation delaunay

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

1 个答案:

答案 0 :(得分:0)

我上面提到的问题根本没有答案,因为无法保证两个相似的集合( A B )具有相同的数字,含义和点数顺序在使用Delaunay三角剖分处理每个拓扑后,它们将具有相同的拓扑。换句话说,如果3点A_0到A_2在A中形成三角形,则点B_0到B_2不必在B中形成三角形(它们可以属于两个或更多个不同的三角形)。

我找到的解决方案是创建一个地图 M(triangleId,pointIds),它将 A 中的三角形id与来自A的那个triangleId的vertexIds相关联。接下来,我根本不要对 B 进行三角测量 - 因为 B 中的点顺序和含义与A中的相同,我可以应用地图 M to B以完全相同的方式对B进行三角测量,保持拓扑结构。在那之后,问题就会消失。这显然不能确保B根据Delaunay规则进行适当的三角测量,但它解决了我的问题。