我正在尝试在3d pointcloud上自动检测旋转轴。
换句话说,如果我拿了一个小的3D点云,选择一个单一的旋转轴,并以不同的旋转角度制作几个点的副本,那么我得到一个更大的点云。
我算法的输入是较大的pointcloud,所需的输出是单轴对称。最后,我将计算彼此旋转的点之间的对应关系。
较大的pointcloud的大小约为100K点,旋转副本的数量未知。
在我的情况下,旋转角度具有恒定的增量,但不一定跨越360度。例如,我可能有0,20,40,60。或者我可能有0,90,180,270。但我不会有0,13,78,212(或者如果我这样做,我不在乎检测它。)
这似乎是一个计算机视觉问题,但我无法弄清楚如何精确找到轴。输入通常非常干净,接近浮动精度。
我没有旋转/复制的原始较小的pointcloud来制作更大的pointcloud。我知道数据是合成的,噪音很小(通常是另一个程序的输出)。
我们无法轻易计算出较小云中可能的点数,因为不幸的是,沿着轴线,点不会重复。如果我们知道轴上有哪些点,那么我们就可以提出可能的因素,但是我们已经解决了这个问题。
-
感谢大家的建议。看起来我的最终算法将尝试使用k-nn度量来提出匹配点的集合。每个集团都会给出一个轴。然后,我可以使用RANSAC将轴拟合到所有集团的结果中。
答案 0 :(得分:2)
嗯,以下方法可能有用,但这取决于您的数据的具体情况。它基于这样的假设:相邻位置之间的间隙足够大(20度可能很好),小点云接近表面(最后一个可以克服)。我建议使用局部特征匹配(计算机视觉中的流行技术)。
首先,对于大型云的每个点,您应该计算局部描述符(如图像的SIFT或SURF)。最常用的点云是旋转图像:
Johnson,A。,& Hebert,M。(1999)。使用旋转图像在杂乱的3D场景中进行有效的物体识别。 IEEE Transactions on Pattern Analysis and Machine Intelligence,21(5),433-449。 Citeseer。取自http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.23.8816&rep=rep1&type=pdf。
此处使用高级修改:
Endres,F.,Plagemann,C.,Stachniss,C。,& Burgard,W。(2009)。使用Latent Dirichlet分配从范围数据中无监督地发现对象类。在机器人学:科学与系统。美国西雅图。
如果计算难度很大,请问我如何减少维数而不会在判别力方面失去很多,我已经做过一次。
然后你应该匹配描述符,即在高维空间中找到每个描述符的最近邻居。如果小云旋转了3次,那么应该有3个好的最近邻居。但是,由于云自相交,匹配可能包含噪声。您仍然需要找到适合大量匹配的轴(尽管不是全部匹配)。在这里你可以使用像RANSAC这样的强大拟合(你应该做一些数学来定义轴位置的可能性w.r.t.找到的匹配)。请注意,它与其他人建议的方法不同。根据描述符而不是原始点,你应该只适合一行而不是平面族(RANSAC可能无法适应具有4-5个正确点和100K异常值的平面)。
另请注意:
如果你的小扫描不接近表面,你应该想出一个不同的旋转不变描述符,而不是旋转图像。
为了计算法线并进行检索,您可以查看此库:http://graphics.cs.msu.ru/en/science/research/3dpoint/lidark(即将发布主要版本)。
答案 1 :(得分:2)
以下假定有3个或更多副本。考虑大点云的凸包。找到两个平行的面。旋转轴将垂直于这些。如果您找到多对,只需测试每个方向。
显然,如果根据轴的最极端点在轴上是正确的,这不起作用,但是在一般情况下,这是非常罕见的。
答案 2 :(得分:1)
选择任意一点,并找到与其等距的两个其他点。这应该采用O(n ^ 2)最坏情况,但启发式可以大大减少这种情况。这三个点唯一地确定一个圆。如果距离第一个或第三个点的距离相同的第四个点,则会大大增加您对圆圈的信心。
圆的中心是轴上的一个点,圆的法线向量是轴的方向向量。
给定轴,您可以确定旋转之间的角度,并使用其他一些点检查您的猜测。如果错了,请选择另一个点并重新开始。
编辑:顺便说一句,显然这是非确定性的,但如果你的点数据像你说的一样干净并且你使用了良好的启发式,那么它应该是非常准确的。
答案 3 :(得分:0)
1)如果找到较大的pointcloud的质心C,则ISTM为原始旋转轴 必须通过这一点。
没关系:我没有看到旋转可能不会跨越整个圆圈的要求。对于你的20,40,60例子,质心不在旋转轴上。
也许以下参考会有所帮助?
“用部分采样重建旋转表面” http://portal.acm.org/citation.cfm?id=980064
答案 4 :(得分:0)
一些要点:)
我的意思是刚体的旋转轴与身体的任何单个粒子的旋转轴相同。我们无需关心所有其他问题。
答案 5 :(得分:0)
看看立体视觉中使用的技术来计算两个图像之间的单应性 - 你的点云集合的问题似乎与同一对象/场景的多个图像中的匹配点类似。似乎您可以应用RANSAC算法来计算点云集之间的转换。
答案 6 :(得分:0)
一个疯狂的想法......
如果相同的点绕同一轴旋转数次,则所有点都将位于同一平面内。根据您的数据集,可以使用ransac方法检测此平面。
旋转轴将垂直于此平面,一旦确定了方向,就应该相对容易确定轴的位置。
答案 7 :(得分:0)
您应该考虑两件事:
现在,如果(旋转> span)解决方案更简单,因为您必须查找子模式并根据其出现情况,尝试匹配更大的模式。
如果(旋转< span),你将不得不超越边缘效应,因为在区域内(在第一次旋转之后,在最后一次旋转之前),你仍然会有一个对称的点云,角度为对称性=跨度角;如上例所述。
如果您不知道自己属于哪个类别,可以安全地假设在第二个类别中。
如前所述,RANSAC是模式匹配的最佳方式,因为它花费的时间更少,并且得到了不错的结果。 您剩下的唯一问题是初始化期间迷你点云的跨度估计角度。这种估计很难做出。因此,如果你有足够的计算能力/时间,我建议迭代1度。从适度的5度开始到45度。随着结果开始收敛,增加角度精度。
答案 8 :(得分:0)
由于原始点云很小,最简单的解决方案可能是RANSAC:
正确估计的概率是1 /((n-1)(n-2)),其中n是原始云中的点数。由于每个测试都可以非常快速地完成,因此这可能是一种有用的方法。