【问题标题】:Detecting arbitrary shapes检测任意形状
【发布时间】:2017-05-03 21:47:45
【问题描述】:

您好,

我们有一组点,它们代表 3d 物体和水平面的交点。我们想检测代表身体横截面的二维形状。可以有一种或多种这样的形状。我们找到了讨论如何使用霍夫变换对图像进行操作的文章,但是我们可能有成千上万个这样的点,因此转换为图像非常浪费。有没有更简单的方法来做到这一点?

谢谢

【问题讨论】:

  • 您是在谈论任何类型的 3D 形状,还是有一些应用程序或特定领域的限制?
  • 所以你想在二维多边形上进行模式识别?
  • @Andre,你好,我说的是任何 2d 形状。由于 3d 体的形状像树枝,它可能会接近椭圆
  • @Itjax,您好,我需要将一组点(都在同一平面上)划分为组。每个组代表一个二维形状(通常不是多边形),因此属于该组的点定义了这个二维形状的周长。
  • @Ojala。所以你知道3D身体的确切形状......平面的方向也是固定的吗?在这种情况下,它可能更接近于配准问题:找到将最多“椭圆体”放置在您的 3d 树状体上的转换(平移)。

标签: geometry computational-geometry


【解决方案1】:

在将 3D 模型转换为一组点时,您已经丢弃了查找交叉点形状所需的信息。遍历 3D 模型的边面连通图,按顺序查找边平面交点。

假设您拥有或可以构建 3d 模型地形(一定数量的顶点、顶点之间的边、由边限定的面):

  1. 遍历边缘列表,直到找到与测试平面相交的边缘,将其添加到列表中
  2. 选择一个共享此边的面
  3. 遍历该面的其他边以找到下一个交点,将其添加到列表中
  4. 对共享该边的另一面重复此操作,直到您回到起始边

您已经构建了与平面相交的边的有序列表 - 对每条边进行线性插值以按顺序找到形成相交形状的相交点是微不足道的。请注意,此过程假定面多边形是凸的,在您的情况下它们是凸的。 如果您的体积是凹的,您将有多个离散的相交形状,因此您需要重复此过程,直到检查完所有边缘。

有一些 java 代码可以做到这一点here,还有一个相当漂亮的测试应用程序here

控件:

  • 1-5改变测试量
  • q 和 w 改变查询平面的数量
  • a、s 和 d 更改查询平面的扫描速度
  • 左键单击并拖动以旋转视图
  • 右键单击并拖动以旋转查询平面

【讨论】:

    【解决方案2】:

    当平面与凹面的某些顶点相交时,接受答案中的算法/代码不适用于复杂的特殊情况。在这种情况下,贪婪地“遍历”边缘-面连接图可能会提前关闭一些多边形。

    发生的情况是,因为平面与顶点相交,所以在遍历图形时,下一条边有两种可能性,选择哪一种很重要。

    一种可能的解决方案是实现图遍历算法(例如深度优先搜索),并选择包含起始边的最长循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 2017-11-21
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多