registration - 具有低(且无法识别)特征的点云注册
问题描述
- 目标
被扫描的物体由两个主要部分组成:锥形结构,没有基础;并且,在第一部分的中间,一个圆柱形结构。我们将第一部分称为“主体”,第二部分称为“管道”。管道的直径是已知的(或非常准确的估计)。身体的极端和管道中心之间的距离是未知的。最先进的结构光激光扫描仪组装在目标物体周围的圆形轨迹上。几乎不知道“镜头”之间的扫描仪姿势和移动角度。
基于圆形轨迹,我们从目标进行了 N 次捕获。由此,我们可以推断出每次拍摄之间的移动角度等于 360/N。捕获后,我们需要将这 N 个点云合并为一个唯一(且完整)的点云,它代表完整的对象。像本教程这样的东西。
- 已经尝试过的
在我们的捕获中,我们有一个非常统一的对象。这个特性给我们带来了一个问题,因为在点云中检测到的相关点与云上不同位置的许多其他点非常相似。但只有一个是正确的对应关系。正因为如此,我们有很多错误的对应关系,这使得变换计算失败。
我们使用 PointCloud Library (PCL) 实现的算法进行了大量实验。更改关键点检测器(ISS、随机采样、Harris 等)、描述符(基于 SHOTRGB 等颜色、法线和/或 FPFH 等几何形状)、线性求解技术(SVD、MLS 等)上的参数。我们无法取得相关的结果。
有人遇到过类似的问题吗?
如何改进我的描述模式?
我可以使用另一种针对高均匀数据集的方法吗?
欢迎任何贡献。
解决方案
如果 N 足够大(它在你的控制之下吗?),光流应该是找到对应关系的好候选。
您提到的基于特征的关键点检测器是一种查找点之间对应关系的方法(您可以在两幅图像中找到关键点,然后使用特征匹配它们)。
OpticalFlow 是每个点移动位置的两个图像之间的映射。因此,这为您提供了另一种查找点对应关系的方法。这种方法假设两个图像足够相似(=你的 N 足够大)利用这种相似性。
通过比较可以更好地理解这一点:基于特征的方法分别考虑每个图像,并尝试单独匹配点(在特征空间中)。OpticalFlow 考虑两个图像以找到它们之间的“平滑”转换/映射。基于特征的方法是“标准”方法,因为它具有更高的鲁棒性和不变性。
在您的特定情况下,可能可以使用 OpticalFlow 方法。
OpenCV 有一个OpticalFlow的实现并提供了一个教程。如果我们看这个例子:
calcOpticalFlowPyrLK(old_gray, frame_gray, p0, p1, ...);
给定两张图像(old_gray 和 frame_gray)和第一张图像(old_gray)中的一组点(p0),它计算这些点(p1)在第二张图像(frame_gray)中的位置。换句话说,点集p0和p1是两幅图像之间的对应关系。您可以尝试任何关键点检测方法来选择您的 p0 点集。
或者,您可以使用calcOpticalFlowFarneback来获得密集的对应关系。
附加材料: Wiki,Coursera 的短视频课程。
推荐阅读
- ios - 如何从 CVPixelBuffer 创建 CGImage?
- r - 在闪亮的数据库中保存多个用户数据
- python - 使用带有列的列表列表切片熊猫数据框
- python - 无法登录和注册到 Django 仪表板
- python - 在 Python 中创建字典
- deep-learning - 如何在我的 kaggle notebook 中激活 GPU?它使用 100% 的 CPU 和 0% 的 GPU。我的深度学习项目需要 GPU 加速器
- python - 存储大量不同长度的浮点数列表,以便根据元数据快速检索
- ios - 运行 Pod install 后出现编译错误
- python - 如何在不引用列名的情况下删除第一列包含特定字符的所有行?
- python - Tensorflow 2.2.0 InvalidArgumentError:不兼容的形状:[98,2] vs. [32,2]