滤除背景

我们获得的点云可能包含一部分背景的点云。要去除背景,只保留人体信息,最简单的方式是使用直通滤波器滤除较远点。这部分代码如下:1

2

3

4

5

6pcl::PassThrough<:pointxyz>pass; //设置滤波器对象

pass.setInputCloud(cloud); //设置输入点云

pass.setFilterFieldName("z"); //设置过滤时所需要点云类型的z字段

pass.setFilterLimits(0.0,1.0); //设置在过滤字段上的范围

//pass.setFilterLimitsNegative (true); //设置保留范围内的还是过滤掉范围内的

pass.filter(*cloud_filtered); //执行滤波,保存过滤结果在cloud_filtered

滤除背景也可以通过Kinect SDK实现,这部分可以参考SDK的“游戏者ID”。

移除离群点

激光扫描通常会产生密度不均匀的点云数据集。另外,测量中的误差会产生稀疏的离群点,使效果更糟。因此对每个点的邻域进行一个统计分析,并修剪掉那些不符合一定标准的点。1

2

3

4

5pcl::StatisticalOutlierRemoval<:pointxyz> sor;// 创建滤波器对象

sor.setInputCloud(cloud); //设置呆滤波的点云

sor.setMeanK(50); //设置在进行统计时考虑查询点邻近点数

sor.setStddevMulThresh(1.0); //设置判断是否为离群点的阈值

sor.filter(*cloud_filtered); //执行滤波处理保存内点到cloud_filtered

下采样

为什么要进行下采样?

Kinect直接得到的点云数据非常庞大,由于我们下一步要对其进行配准和拼接处理,如果不对点云进行适当精简,运算时间可能非常长。因此,要等效一个Point较少的点云,取代原始点云进行配准操作。

PCL实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即,三维立方体)内,用体素中所有点的重心来近似显示体素中其他点,这样该体素就内所有点就用一个重心点最终表示,对于所有体素处理后得到过滤后的点云。1

2

3

4pcl::VoxelGrid<:pointcloud2>sor; //创建滤波对象

sor.setInputCloud(cloud); //设置需要过滤的点云给滤波对象

sor.setLeafSize(0.01f,0.01f,0.01f); //设置滤波时创建的体素大小为1cm立方体

sor.filter(*cloud_filtered); //执行滤波处理,存储输出cloud_filtered

点云拼接

配准

什么是配准

配准是将一个点云找到与另一个点云相对应的部分,并得到两个点云之间的转换矩阵。

配准之后,我们就可以将一个点云转换到另一个点云所在的坐标系内。在同一个坐标系内的点云可以进行拼接,形成一个更大的点云。

PCL内置了许多配准算法,例如迭代最近点对(ICP)算法,正态分布变换算法,随机一致采样(ransac)算法,等等。实际使用中,往往需要根据点云的特征选取合适的算法。这里使用了ransac算法。

随机抽样一致性算法(RANSAC)

概述

RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。

RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并进行验证。

算法

RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。

模型对应的是空间中一个点云数据到另外一个点云数据的旋转以及平移。

第一步随机选取点云中的一个点对,利用其不变特征(两点距离,两点法向量夹角)作为哈希表的索引值搜索另一个点云中的一个对应点对,然后计算得到旋转及平移的参数值。

用得到的变换模型去测试其它点,如果某个点适用于估计的模型,认为它也是局内点。

用所有假设的局内点去重新估计模型,重新计算旋转及平移的参数。

和上一个模型进行比较:是否有更多的局内点和更小的错误率。

然后迭代上述过程,直到找到最好的模型,或达到迭代次数。

优势和缺点

RANSAC的优点是它能从包含大量局外点的数据集中估计出高精度的参数。

RANSAC的缺点是它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。RANSAC的另一个缺点是它要求设置跟问题相关的阀值。

如何提高配准的精确度

对于两个点云来说,提高精确度的方法是选取合适的算法、增加迭代次数、修改参数。

实际配准中,我们可能要连续配准多个点云。这样,在两个点云匹配中出现的误差可能被放大。尝试了以下几种思路:第n个点云与第n+1个点云配准,得到转换矩阵。将第n-1个转换矩阵乘以这个转换矩阵,得到第n个转换矩阵。第n+1个点云乘以第n个转换矩阵,得到它投影到第1个点云所在坐标系的新点云。

上一方法的改进策略:同时由第1个点云向后出发,第n个点云向前出发进行配准,最终重合。

第n个点云与第n+1个点云配准,得到转换矩阵,并将第n+1个点云乘以转换矩阵,将得到的新点云替换第n+1个点云。

第n个点云与第n+1个点云配准,得到转换矩阵,并将第n+1个点云乘以转换矩阵,将得到的新点云拼接上第n个点云,然后替换第n+1个点云。

最终选择了第二种方法,它可以达到较好的效果。

配准部分的代码,根据采取的算法不同有所变化,建议从官方文档参看这部分代码。

最终效果

实际使用中,很难做到短时间高精度地配准出点云,对于一些情况,可能要进行有针对性的优化。这是测试中配准效果较好的一个:

多帧点云数据拼接合并_PCL点云处理实践(二):点云的处理和拼接相关推荐

  1. 华云数据张华林:投身数字蓝海 绘就云上强国

    7月29日-30日,由无锡市人民政府指导,无锡市滨湖区人民政府.<麻省理工科技评论>中国主办,无锡山水城管理委员会.DeepTech 承办的新一届EmTech China 全球新兴科技峰会 ...

  2. 点云数据的每个点之间的平均距离计算(点云密度计算)(附open3d python代码)

    对于每个点,都计算了离它最近的点的距离, 由此可以得知这堆点云的所有点之间的平均距离.根据这个平均距离,可以用来估算一些其他算法的半径参数,距离参数, 比如法向量计算的领域距离参数,距离的距离阈值参数 ...

  3. 激光点云系列之一:详解激光雷达点云数据的处理过程

    交流群 | 进"传感器群/滑板底盘群"请加微信号:xsh041388 交流群 | 进"汽车基础软件群"请加微信号:Faye_chloe 备注信息:群名称 + 真 ...

  4. 利用PCL库从点云数据生成深度图像及关键点提取

    利用PCL库从点云数据生成生成深度图像及关键点提取 利用PCL库从点云数据生成深度图像及关键点提取 本想利用标准点云数据库分割成若干块,利用标准点云数据生成深度图像作为数据库用来验证算法,目前效果不是 ...

  5. 基于FME实现点云数据的过滤去噪和生成表面模型

    作者:LLT 近年来随着三维激光扫描技术的不断发展与更新,点云数据也越来越多地应用于各个领域.FME作为一款数据转换和变换软件,在点云处理方面也有许多独到之处.下面就给大家分享一些点云数据的处理技巧. ...

  6. 独角兽之名:解读华云数据背后智慧商业谋略

    华云数据最近有点火.没错,不仅让参股股东红豆集团借其势涨股,还上榜了科技部颁发的"独角兽"权威证书. 无疑,华云很聪明,在风口上抓住了机会;但其商业模式却更显智慧. 2017年的中 ...

  7. 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障

    简介:DataTrust(隐私增强计算产品)是基于阿里云底层多项基础安全能力,经过阿里云数据中台丰富的客户业务实践,构建的一款为企业数据安全流通的产品. 随着包括零售.制造.金融等多行业数字化转型加速 ...

  8. 重磅发布 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障

    简介: DataTrust(隐私增强计算产品)是基于阿里云底层多项基础安全能力,经过阿里云数据中台丰富的客户业务实践,构建的一款为企业数据安全流通的产品. 随着包括零售.制造.金融等多行业数字化转型加 ...

  9. 华云数据升级发布“信创云基座“ 用“全芯全栈”支持“信创强国”

    2021年6月10日,北京--2021年是我国"十四五"规划的开局之年,也是我国"加快数字发展 建设数字中国"的关键之年.值此历史交汇的关键点,云计算.大数据. ...

最新文章

  1. 有奖评选 | 2020年的AI技术公开课,你想听到哪些干货?
  2. jQuery修改数组$.map
  3. hdu2489 Minimal Ratio Tree
  4. centos yum 安装java_Linux Centos 使用 yum 安装java
  5. 《数据库SQL实战》从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。 注意对于重复的emp_no进行忽略。
  6. 云端资源,“掌”握手中 ——关于 阿里云 App你不知道的五件事
  7. (97)FPGA DCM与PMCD区别?
  8. c++ std::async的注意事项
  9. java获取公网ip_动态IP变固定IP,国内IP变海外IP,助力企业数据传输提高工作效率...
  10. OFFICE技术讲座:制表键(TAB)对段落布局的影响
  11. Python开胃菜(1):搭建开发环境
  12. java参数配置jconsole_jconsole 配置详解
  13. 一、SQL语句执行过程
  14. “No Problem”没问题,不客气的其他英语表达方式
  15. pandas DatetimeIndex indexing
  16. 软件测试中系统的功能测试,软件测试中的43个功能测试点(下)
  17. Cohort analysis
  18. Linux ls -l 名:命令详解
  19. Spring-第一篇-快速入门
  20. 彻底解决WPS右键没有新建文件的问题

热门文章

  1. [SQL Server系] -- 存储过程
  2. HDU1878-欧拉回路(入门题+并查集)
  3. 闲话 - 火车硬座座位分布图
  4. VMware虚拟机软件
  5. Java中关于自增自减
  6. php操作redis_PHP操作Redis的基本方法
  7. c语言 void**类型转换,void *和其他指针的转化
  8. ic 卡获取帐号apdu指令_非接触IC卡片APDU指令系统介绍..docx
  9. 服务器装系统用哪个好,服务器系统重装用哪个系统
  10. 2016专接本c语言真题_云南特岗教师考试真题(中学信息技术)9套(无答案)