【问题标题】:Matching results of Delaunay triangulation in OpenCVOpenCV中Delaunay三角剖分的匹配结果
【发布时间】:2017-05-03 09:34:13
【问题描述】:

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

【问题讨论】:

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

标签: opencv triangulation delaunay


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2013-05-12
  • 2012-03-04
  • 2015-01-07
  • 2019-04-18
  • 2019-09-28
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多