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


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


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

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



评论

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

@Mohammad我使用Python + MatPlotLib进行研究并生成图形等。

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

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

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

#1 楼

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

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

我尝试解决的方法:

假设:


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

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


从源中选取3个点
搜索目标点,找到3个形状相同的点的集合
找到3个点的匹配,请检查它们定义的平面中的所有其他点,以查看它们是否接近。
如果找到所有点的多个匹配项,则选择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 = \ sqrt {(x_1-x_2)^ 2 +(y_1 -y_2)^ 2 +(z_1-z_2)^ 2} $
,但是平方根很慢。由于我们只是在比较相对距离,因此我认为我们可以删除sqrt并将“距离”视为平方和。如果目标中有2000个点,则这将是2000 * 2000距离计算,尽管许多计算都会因减法而取消资格,并且可以存储以前的计算结果,因此您只需要执行$ 2000 \ choose 2 $ = 1,999,000。

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

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

评论


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



$ \ begingroup $
@Developer:是的,这将需要大量的计算,尤其是如果您有数千个点。是的,对于2000点,如果找不到任何飞机,最终将需要进行2,658,673,998,000个计算。不过,大概您会发现飞机,这会减少时间,因为一旦找到足够的点,飞机便会停止。但是无论如何,我正在考虑这个问题,可能有一个更好的主意,我将更改答案。
$ \ endgroup $
– Endolith
11年11月27日在22:08



$ \ begingroup $
绝对正确。只是要补充一点,即使找到了合适的飞机,停车标准也无法适用,尽管可能存在更好的匹配,所以需要检查所有可能的飞机。我已经实现了这个想法,并且发现即使在Fortran的帮助下,得分超过500点,也将不可能拥有PC体验。
$ \ endgroup $
–开发人员
2011-11-27 23:00

#2 楼

我会在RANSAC旁边的替代解决方案上添加@ mirror2image描述,您可以考虑ICP算法(迭代最近点),请参见此处的描述!定义自己的成本函数,以及相对于3d浊点数据的目标平面的起始姿势。一些实用的方法是在迭代过程中在数据中引入一些随机噪声,以避免收敛到错误的最小值。我想这是您需要设计的启发式部分。

更新:

简化形式的步骤是:


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

重复步骤1-4。

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

评论


$ \ begingroup $
感谢您的链接和建议。这样有用的想法总是帮助我们作为新手研究人员更快地学习事物。我总是很欣赏更多的解释。
$ \ endgroup $
–开发人员
2011-11-28 11:16