2016-12-17 47 views
2

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

回答

0

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

我发现的解决方案是创建一个地图M(triangleId,点名)与属于从A.接着该triangleId vertexIds相关三角形ID,我不三角在所有 - 由于B中的点顺序和含义与A中的相同,因此我可以将地图M应用于B以便以完全相同的方式对B进行三角测量,从而保持拓扑结构。之后,问题就会消失。这显然不能确保B按照Delaunay规则进行适当的三角剖分,但它解决了我的问题。

相关问题