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

问题描述 投票:2回答:1

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

opencv triangulation delaunay
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.