3d - 从点云检测旋转轴

标签 3d geometry computer-vision computational-geometry

我正在尝试自动检测 3d 点云上的旋转轴。

换句话说,如果我取一个小的 3d 点云,选择一个旋转轴,并以不同的旋转角度制作多个点的副本,那么我会得到一个更大的点云。

我的算法的输入是较大的点云,所需的输出是单对称轴。最终我将计算彼此旋转的点之间的对应关系。

较大点云的大小约为 100K 点,旋转副本的数量未知。

在我的情况下,旋转角度具有恒定的增量,但不一定跨越 360 度。例如,我可能有 0、20、40、60。或者我可能有 0、90、180、270。但我不会有 0、13、78、212(或者如果我有,我不在乎来检测)。

这似乎是一个计算机视觉问题,但我无法弄清楚如何精确地找到轴。输入通常会非常干净,接近浮点精度。

我没有旋转/复制以制作更大点云的原始较小点云。我知道数据是合成的,噪音很小(通常是另一个程序的输出)。

不幸的是,我们无法轻松计算较小云中可能的点数,因为沿着轴,这些点没有重复。如果我们知道哪些点沿着轴,那么我们就可以想出可能的因素,但是我们已经解决了问题。

——

谢谢大家的建议。看起来我的最终算法将尝试使用 k-nn 度量提出匹配点的集团。每个派系都会给出一个轴。然后我可以使用 RANSAC 将轴拟合到所有派系的结果。

最佳答案

好吧,以下方法可能有用,但这取决于您的数据的具体情况。它基于这样的假设:相邻位置之间的间隙足够大(20 度可能很好)并且小点云近似于一个表面(最后一个可以克服)。我建议使用局部特征匹配(计算机视觉中的流行技术)。

首先,对于大云的每个点,您应该计算本地描述符(如图像的 SIFT 或 SURF)。点云最流行的一种是旋转图像:

Johnson, A., & Hebert, M. (1999)。使用自旋图像在杂乱的 3d 场景中进行有效的对象识别。 IEEE 模式分析和机器智能汇刊,21(5),433–449。引用者。取自 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 年)。使用潜在狄利克雷分配从范围数据中无监督地发现对象类。机器人学:科学与系统。美国西雅图。

如果计算起来很困难,请问我如何在不损失大量判别能力的情况下降低维度,我已经这样做过一次。

然后你应该匹配描述符,即在它们的高维空间中为每个描述符找到最近的邻居。如果小云已经旋转了 3 次,那么应该有 3 个好的最近邻居。然而,由于云自相交,匹配可能会包含噪声。您仍然需要找到适合大量匹配项(尽管不是全部)的轴。在这里,您可以使用一些稳健的拟合,例如 RANSAC(您应该做一些数学运算来定义轴位置 w.r.t. 找到的匹配项的可能性)。请注意,它与其他人建议的方法不同。根据描述符,您应该只拟合一条线而不是平面族,而不是原始点(RANSAC 可能无法拟合具有 4-5 个正确点和 100K 异常值的平面)。

另请注意:

如果您有不近似表面的小扫描,您应该想出不同的旋转不变描述符,而不是旋转图像。

为了计算法线并进行检索,您可以查看这个库:http://graphics.cs.msu.ru/en/science/research/3dpoint/lidark (一个主要版本即将推出)。

关于3d - 从点云检测旋转轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2639579/

相关文章:

algorithm - 基本空间雕刻算法

c# - 3D 点线上的 3D 垂直点

r - R中圆上等距n个点的坐标?

django - 如何使用 View 从 PostGIS 中提取几何图形,然后使用 Django 将其添加到模板中的传单 map

matlab - 是否需要转换为LIBSVM格式

html - 制作一个圆边的 3D 按钮

matlab - 在 Matlab 中使用互相关进行 3D 模板匹配

c++ - 在 openGL + SDL 2.0 中绘制四面体

c++ - 解释 ARM Neon 图像采样

python - 如何使用opencv构建人脸检测程序并启动计时器来记录人脸停留在屏幕上的时间?