点云中的配置文件匹配


14

点云被使用统一的随机函数生成(x,y,z)。如下图所示,正在研究一个平面相交平面(轮廓),该平面与目标轮廓(即在左下角给出的)最佳(即使不是精确的)相匹配。所以问题是:

1-如何target 2D point map通过point cloud考虑以下注意事项/条件找到给定的匹配?
2-那么什么是坐标/方向/相似度等?

注1:感兴趣的轮廓可以沿轴旋转任何位置,也可以具有不同的形状,例如三角形,矩形,四边形等,具体取决于其位置和方向。在下面的演示中,仅显示了一个简单的矩形。

注2:可以将公差值视为点到轮廓的距离。为了在下图中证明这一点,假设公差是0.01最小尺寸的(~1)乘积tol=0.01。因此,如果我们删除其余部分并将所有剩余点投影在要研究的轮廓平面上,那么我们将能够检查其与目标轮廓的相似性。

注意3:可以在“ 点模式识别”中找到一个相关主题。

在此处输入图片说明


@Developer Off主题,但是您使用什么软件生成这些图?
Spacey

1
@Mohammad我用Python+ MatPlotLib做我的研究和生成图表等
开发者

@Developer Fantastic-它是通过​​Python实现的,但是“ Python shell ala Matlab”是什么意思呢?
Spacey

点云如何存储?作为每个点中心的一组坐标还是在点周围的坐标中具有非零值的体积数据集?
endlith 2011年

@endolith所有点的坐标关联为P:{x,y,z}。它们确实是无量纲的要点。但是,通过一些近似,可以将它们离散化为3D阵列的一像素尺寸。它们还可以在坐标上合并其他属性(例如权重等)。
开发人员

Answers:


4

这总是需要大量的计算,尤其是当您要处理多达2000点时。我敢肯定,已经有针对这种模式匹配的高度优化的解决方案,但是您必须弄清楚它的名称才能找到它们。

由于您是在谈论点云(稀疏数据)而不是图像,因此我的互相关方法并没有真正应用(在计算上甚至会更差)。像RANSAC这样的东西可能很快找到了匹配,但我对此并不了解。

我试图解决的问题:

假设:

  • 您想找到最佳匹配,而不仅仅是宽松或“可能正确”的匹配
  • 由于测量或计算中的噪声,匹配会产生少量错误
  • 源点共面
  • 所有源点必须存在于目标中(= 任何不匹配的点对于整个配置文件都是不匹配的)

因此,您应该能够通过取消资格和减少计算时间来采取许多捷径。简而言之:

  1. 从源头上选三点
  2. 搜索目标点,找到3个形状相同的点集
  3. 当找到3分的匹配点时,请检查他们定义的平面中的所有其他点,以查看它们是否接近
  4. 如果发现所有点不止一个匹配,则选择3D距离误差总和最小的一个

更详细:

pick a point from the source for testing s1 = (x1, y1)
Find nearest point in source s2 = (x2, y2)
d12 = (x1-x2)^2 + (y1-y2)^2
Find second nearest point in source s3 = (x3, y3)
d13 = (x1-x3)^2 + (y1-y3)^2
d23 = (x2-x3)^2 + (y2-y3)^2

for all (x,y,z) test points t1 in target:
    # imagine s1 and t1 are coincident
    for all other points t2 in target:
        if distance from test point > d12:    
            break out of loop and try another t2 point
        if distance ≈ d12:
            # imagine source is now rotated so that s1 and s2 are collinear with t1 and t2
            for all other points t3 in target:
                if distance from t1 > d13 or from t2 > d23:
                    break and try another t3
                if distance from t1 ≈ d13 and from t2 ≈ d23:
                    # Now you've found matching triangles in source and target
                    # align source so that s1, s2, s3 are coplanar with t1, t2, t3
                    project all source points onto this target plane 
                    for all other points in source:
                        find nearest point in target
                        measure distance from source point to target point
                        if it's not within a threshold:
                            break and try a new t3
                        else:
                            sum errors of all matched points for this configuration (defined by t1, t2, t3)

对于所有其他点,平方误差最小的配置是最佳匹配

由于我们正在处理3个最近的相邻测试点,因此可以通过检查匹配的目标点是否在某个半径内来简化匹配的目标点。例如,如果从(0,0)搜索半径1,我们可以基于x1-x2取消(2,0)的资格,而无需计算实际的欧几里得距离,从而将其加快一点。假定减法比乘法快。也有基于更多任意固定半径的优化搜索

function is_closer_than(x1, y1, z1, x2, y2, z2, distance):
    if abs(x1 - x2) or abs(y1 - y2) or abs(z1 - z2) > distance:
        return False
    return (x1 - x2)^2 + (y1 - y2)^2 + (z1 - z2)^2 > distance^2 # sqrt is slow

3D欧式距离d=X1个-X22+ÿ1个-ÿ22+ž1个-ž22 但是平方根很慢。因为我们只是在比较相对距离,所以我认为我们可以降低sqrt并将“距离”视为平方和。

最小的计算时间将是如果找不到2点匹配。 如果目标中有2000个点,则这将是2000 * 2000距离计算,尽管许多将被减法取消资格,并且可以存储先前计算结果,因此您只需要20002 = 1,999,000。

实际上,由于无论如何您都需要计算所有这些值,无论是否找到匹配项,并且由于您只关心最近的邻居,所以如果您有内存,最好使用优化算法预先计算这些值。诸如DelaunayPitteway三角剖分之类的东西,其中目标中的每个点都与其最近的邻居相连。将其存储在表中,然后在尝试将源三角形拟合到目标三角形之一时在每个点上查找它们。

涉及到很多计算,但是它应该相对较快,因为它只对稀疏的数据进行运算,而不是像体积数据的互相关那样将大量无意义的零相乘。如果您首先找到点的中心并将其存储为一组坐标,则这种相同的想法也适用于2D情况。


1
答案的第一部分实际上是一种蛮力方法,该方法通过点云在所有可能的平面周围寻找附近的点(相对于阈值进行计数)。它的计算量非常大,例如,仅需2000个点,就需要进行2,662,668,000,000 (公式)个距离的计算!
开发人员

@Developer:是的,这将需要大量的计算,尤其是如果您有数千个点。是的,如果没有找到任何飞机,就可以获得2000点,最终将进行2,658,673,998,000个计算。但是,大概可以找到飞机,这将减少时间,因为一旦找到足够的点,飞机便会停止。但是无论如何,我正在考虑这个问题,并且可能有一个更好的主意,我将更改答案。
endlith 2011年

1
您绝对完全正确。只是要补充一点,即使找到了合适的飞机,停车标准也无法适用,尽管可能存在更好的匹配,所以需要检查所有可能的飞机。我已经实现了这个想法,并且发现即使有了Fortran高于500点的数字,也将不可能拥有PC的使用经验。
开发人员

2

我会在RANSAC旁边的替代解决方案上添加@ mirror2image描述,您可以考虑ICP算法(迭代最近点),在这里可以找到描述!

我认为使用此ICP的下一个挑战是定义自己的成本函数,以及相对于3d浊点数据的目标平面的起始姿势。一些实用的方法是在迭代过程中在数据中引入一些随机噪声,以避免收敛到错误的最小值。我想这是您需要设计的启发式部分。

更新:

简化形式的步骤是:

  1. 找到每个输入点的最近点。
  2. 计算从输入到目标的变换,然后使用该变换移动输入点。
  3. 计算相似度函数(例如,每个输入点wrt到其对应的配对目标点的距离)。
  4. 检查停止条件。

重复步骤1-4。

有可用的库,您可以在这里考虑!(我还没有尝试过),注册部分有一个部分(包括其他方法)。


感谢您的链接和建议。这样有用的想法总是帮助我们作为新手研究人员更快地学习事物。我总是很欣赏更多的解释。
开发人员
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.