【问题标题】:How to build a grid from scattered points in OpenCV?如何从 OpenCV 中的散点构建网格?
【发布时间】:2011-07-27 10:02:57
【问题描述】:

我需要的是在 OpenCV 中构建一个强度网格(图像),我可以从中提取一些轮廓。我已经用完整的数据网格解决了这个问题,但我的问题是地图上只有一些零散的点可用,我必须自己构建这个网格。 根据我从不同来源阅读的内容,要走的路是在散点上使用 Delaunay 三角剖分。我已经在 OpenCV 中找到了一些构建这些三角形的函数,但是我找不到如何使用这些数据来构建我需要的数据网格的方法。 如果 OpenCV 中还有其他更多帮助功能或使用我当前进度的方法,如果您能指出正确的方向,我将不胜感激。 谢谢你。

【问题讨论】:

  • 自从我发布这个问题以来,我已经阅读了很多网格算法,发现有使用 Delaunay 三角剖分或 Voronoi 细分的解决方案。我的最终解决方案是使用完全在 OpenCV 之外的东西来网格化散点。有一些开源网格库,但如果有人感兴趣,我使用的是“冲浪”。在我拥有网格 OpenCV 之后,它在我的其余任务中发挥了作用。

标签: c++ datagrid random opencv points


【解决方案1】:

因此,您可以使用 delaunay 三角剖分法为您提供插值点以填充其间的空图像点。这基本上是使用 delaunay 渲染稀疏高度场时发生的情况。阅读重心坐标可能会有所帮助(因为这些坐标是您用于执行插值的坐标)。我刚查了一下,维基百科实际上有一个关于非结构化网格插值的部分,基本上回答了如何将三角剖分应用于插值网格。

http://en.wikipedia.org/wiki/Barycentric_coordinate_system_(mathematics)#Interpolation_on_a_triangular_unstructured_grid

不幸的是,我对 OpenCV 不够熟悉,无法告诉您其中是否有捷径,但希望这可以让您找到正确的搜索词以达到您想要的最终状态。粗略猜测一下,既然 GPU 最初就是为执行此精确操作而设计的,那么应该可以在一个人身上快速完成此操作。

【讨论】:

  • OpenGL 有一个三角测量器,很简单,看这里:flipcode.com/archives/Polygon_Tessellation_In_OpenGL.shtml
  • 这是一个可行的解决方案,但由于散点没有覆盖孔网格,因此由德劳内三角形构建的多边形将覆盖部分网格,因此受到限制。这部分可以进行插值,但其余的网格需要进行插值。还有一部分您必须知道所需网格的每个点位于哪个三角形中,这也需要一些时间。
【解决方案2】:

除了 Delaunay,我认为您还需要 Voronoi 图:

您可以使用 OpenCV dilate 从网格的每个点开始生成它,并为每个强度(或 dilate step)使用不同的颜色。

【讨论】:

  • 所以,Delaunay 三角剖分和 Voronoi 图是彼此的对偶。使用扩张来获得 Voronoi 是可行的,但也是愚蠢和不精确的。如果你取每个德劳内三角形的三个点形成的圆的中心并将它们连接到它们的邻居,你就会得到 Voronoi 图。
  • @McBeth:我知道循环技术,但我不认为使用扩张是“愚蠢的”或不精确的。它速度较慢,但​​同时它应用了参数填充(这对 OP 似乎很有用)。至于正确性,取决于图像的分辨率,而不是技术。
  • OpenCV 显然有这两个库函数,不是吗?
  • 有一些网格化方法使用了 Voronoi 细分,例如在兴趣点周围取一个区域并计算一个平均值,同时考虑该区域中 Voronoi 刻面的面积。但对于点多且需要大网格的情况,这是一个缓慢的解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多