首页 技术 正文
技术 2022年11月15日
0 收藏 455 点赞 4,043 浏览 2716 个字

博客转载自:http://www.cnblogs.com/ironstark/p/5010771.html

1.点云的频率

今天在阅读分割有关的文献时,惊喜的发现,点云和图像一样,有可能也存在频率的概念。但这个概念并未在文献中出现也未被使用,谨在本博文中滥用一下“高频”一词。点云表达的是三维空间中的一种信息,这种信息本身并没有一一对应的函数值。故点云本身并没有在讲诉一种变化的信号。但在抽象意义上,点云必然是在表达某种信号的,虽然没有明确的时间关系,但应该会存在某种空间关系(例如LiDar点云)。我们可以人为的指定点云空间中的一个点(例如Scan的重心或LiDar的“源”),基于此点来讨论点云在各个方向上所谓的频率。

在传统的信号处理中,高频信号一般指信号变化快,低频信号一般指信号变化缓慢。在图像处理中,高低频的概念被引申至不同方向上图像灰度的变化,傅里叶变换可以用于提取图像的周期成分滤除布纹噪声。在点云处理中,定义:点云法线向量差为点云所表达的信号。换言之,如果某处点云曲率大,则点云表达的是一个变化的信号。如果点云曲率小,则其表达的是一个不变的信号。这和我们的直观感受也是相近的,地面曲率小,它表达的信息量也小;人的五官部分曲率大,其表达了整个Scan中最大的信息量。

2.基于点云频率的滤波方法

虽然点云频率之前并没有被讨论,但使用频率信息的思想已经被广泛的应用在了各个方面,最著名的莫过于DoN算法。DoN算法被作者归类于点云分割算法中,但我认为并不准确,本质上DoN只是一种前处理,应该算是一种比较先进的点云滤波算法。分割本质上还是由欧式分割算法完成的。DoN 是 Difference of Normal 的简写。算法的目的是在去除点云低频滤波,低频信息(例如建筑物墙面,地面)往往会对分割产生干扰,高频信息(例如建筑物窗框,路面障碍锥)往往尺度上很小,直接采用 基于临近信息 的滤波器会将此类信息合并至墙面或路面中。所以DoN算法利用了多尺度空间的思想,算法如下:

1.在小尺度上计算点云法线1

2.在大尺度上计算点云法线2

3.法线1-法线2

4.滤去3中值较小的点

5.欧式分割

显然,在小尺度上是可以对高频信息进行检测的,此算法可以很好的小尺度高频信息。其在大规模点云(如LiDar点云)中优势尤其明显。

3.PCL对该算法的实现

算法运行过程可用图表示为:

PCL—点云滤波(基于点云频率) 低层次点云处理

// Create a search tree, use KDTreee for non-organized data.  pcl::search::Search<PointXYZRGB>::Ptr tree;  if (cloud->isOrganized ())  {    tree.reset (new pcl::search::OrganizedNeighbor<PointXYZRGB> ());  }  else  {    tree.reset (new pcl::search::KdTree<PointXYZRGB> (false));  }  // Set the input pointcloud for the search tree  tree->setInputCloud (cloud);  //生成法线估计器(OMP是并行计算,忽略)  pcl::NormalEstimationOMP<PointXYZRGB, PointNormal> ne;  ne.setInputCloud (cloud);  ne.setSearchMethod (tree);  //设定法线方向(要做差,同向很重要)    ne.setViewPoint (std::numeric_limits<float>::max (),    std::numeric_limits<float>::max (), std::numeric_limits<float>::max ());  //计算小尺度法线  pcl::PointCloud<PointNormal>::Ptr normals_large_scale (new pcl::PointCloud<PointNormal>);  ne.setRadiusSearch (scale2);  ne.compute (*normals_large_scale);  //计算大尺度法线  pcl::PointCloud<PointNormal>::Ptr normals_large_scale (new pcl::PointCloud<PointNormal>);  ne.setRadiusSearch (scale2);  ne.compute (*normals_large_scale);  //生成DoN分割器  pcl::DifferenceOfNormalsEstimation<PointXYZRGB, PointNormal, PointNormal> don;  don.setInputCloud (cloud);  don.setNormalScaleLarge (normals_large_scale);  don.setNormalScaleSmall (normals_small_scale);  //计算法线差  PointCloud<PointNormal>::Ptr doncloud (new pcl::PointCloud<PointNormal>);  copyPointCloud<PointXYZRGB, PointNormal>(*cloud, *doncloud);  don.computeFeature (*doncloud);  //生成滤波条件:把法线差和阈值比    pcl::ConditionOr<PointNormal>::Ptr range_cond (    new pcl::ConditionOr<PointNormal> ()    );  range_cond->addComparison (pcl::FieldComparison<PointNormal>::ConstPtr (                               new pcl::FieldComparison<PointNormal> ("curvature", pcl::ComparisonOps::GT, threshold))                             );  //生成条件滤波器,输入滤波条件和点云  pcl::ConditionalRemoval<PointNormal> condrem (range_cond);  condrem.setInputCloud (doncloud);  //导出滤波结果  pcl::PointCloud<PointNormal>::Ptr doncloud_filtered (new pcl::PointCloud<PointNormal>);  condrem.filter (*doncloud_filtered);  //欧式聚类~~~(略)
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,077
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,552
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,401
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,176
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,813
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,896