一种平面提取的点云简化算法

1.本算法使用了PCL点云库,因此运行此代码需要安装PCL (http://pointclouds.org/)

其中平面区域的简化效率时70%,其它区域的简化效率时30%.

//downSample
#include <pcl/ModelCoefficients.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>

int
main (int argc, char** argv)
{
  srand(time(0));
  // Read in the cloud data
  pcl::PCDReader reader;
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>), cloud_f (new pcl::PointCloud<pcl::PointXYZ>);
  reader.read ("table_scene_lms400.pcd", *cloud_filtered);
  std::cout << "PointCloud has: " << cloud_filtered->points.size () << " data points." << std::endl; //*

  //输出
  ofstream fout("plane.txt");

  // Create the segmentation object for the planar model and set all the parameters
  pcl::SACSegmentation<pcl::PointXYZ> seg;
  pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane (new pcl::PointCloud<pcl::PointXYZ> ());
  pcl::PCDWriter writer;
  seg.setOptimizeCoefficients (true);
  seg.setModelType (pcl::SACMODEL_PLANE);
  seg.setMethodType (pcl::SAC_RANSAC);
  seg.setMaxIterations (100);
  seg.setDistanceThreshold (0.02);    //此处可以自己修改,一般保持默认即可

  int i=0, nr_points = (int) cloud_filtered->points.size ();
  while (cloud_filtered->points.size () > 0.3 * nr_points)    //此处的0.3可以修改,一般保持默认即可
  {
    // Segment the largest planar component from the remaining cloud
    seg.setInputCloud (cloud_filtered);
    seg.segment (*inliers, *coefficients);
    if (inliers->indices.size () == 0)
    {
      std::cout << "Could not estimate a planar model for the given dataset." << std::endl;
      break;
    }

    // Extract the planar inliers from the input cloud
    pcl::ExtractIndices<pcl::PointXYZ> extract;
    extract.setInputCloud (cloud_filtered);
    extract.setIndices (inliers);
    extract.setNegative (false);

    // Get the points associated with the planar surface
    extract.filter (*cloud_plane);
    std::cout << "PointCloud representing the planar component: " << cloud_plane->points.size () << " data points." << std::endl;
    for (int i = 0; i <cloud_plane->points.size (); i++)
    {
        if (rand() %100 < 30)            //平面简化率为70%
        {
            fout<<cloud_plane->points[i].x<<" "<<cloud_plane->points[i].y<<" "<<cloud_plane->points[i].z<<endl;
        }
    }

    // Remove the planar inliers, extract the rest
    extract.setNegative (true);
    extract.filter (*cloud_f);
    *cloud_filtered = *cloud_f;
  }
  for (int i = 0; i <cloud_filtered->points.size (); i++)
  {
      if (rand() %100 < 70)            //简化率为30%
      {
      fout<<cloud_filtered->points[i].x<<" "<<cloud_filtered->points[i].y<<" "<<cloud_filtered->points[i].z<<endl;
       }
  }

  return (0);
}

2.简化前后对比

3.总结说明

分别对比三组实验数据:

第一组:桌面和地面简化率较高,其他的对象简化率地

第二组:人简化率地而平面板和地面简化率较高

第三组:墙面上的镶嵌物体得到了很好保留的同时,墙面和地面得到了和好的简化

4.实验第一组数据(其它两组数据为实验室数据不能提供)

http://pan.baidu.com/s/1i3kVW37 或

https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_mug_stereo_textured.pcd

时间: 2024-10-11 23:11:24

一种平面提取的点云简化算法的相关文章

计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //answer 0)    调用前的预处理:对所有点排序,以x为第一关键词y为第二关键字 , 从小到大; 1)    将所有点按x坐标分成左右两部分; /*      分析当前集合[left,right]中的最近点对,有两种可能: 1. 当前集合中的最近点对,点对的两点同属于集合[left,mid]或同属

一种通用的网页相似度检测算法

如果我们需要在海量的结构未知的网页库中找到和指定的网页相似度比较高的一些网页,我们该怎么办呢?本文提出的"一种通用的网页相似度检测算法"就是专门解决这个问题. 算法如下: 1.提取网页文本.这个提取步骤不要求精确,也没办法精确,因为你面对的是未知结构的网页,所以只需要提取去掉标签之后的文本即可. 2.对提取的文本进行分词.我们使用开源的中文分词组件word分词. 3.为每一个网页建立一个词向量,向量的维度就是两个网页的不重复词的并集,每一个维度的权重就是词频TF,我们这里忽略IDF也不

如何写一篇论文,&lt;一种低耗能的数据融合隐私保护算法ESPART&gt; (计算机学报2011-5,王安琪)

这是我在研究生阶段花了一个月的时间搞出的一篇论文,纯构思和写论文花了才一个月,发稿加改稿.等发表的时间可远不止,记得2010年11月开始要写了,2010年12月写完,2010年底投的稿,2011年初数次改稿,终于5月份出版. 2010年11月份,导师说关于无线传感器网络有很多可以研究的课题,其中的数据融合隐私保护便是以个方向,让我好好研究.自此我便埋头在论文的工作上了,之前的研究生生活就是在图书馆里泡着,看各种看得懂的看不懂的技术.社会科学书籍,现在回想起来,之前的看书生活对这篇论文的创作也是有

APP搜索附近功能的一种解决方案-基于百度LBS云服务

为了在APP中根据定位实现搜索附近(POI)的功能,采用百度LBS云服务,将所有POI数据上传后,可以实现该功能. LBS数据管理地址:在这里标记信息后(支持批量上传)即可开始使用搜索功能. http://lbsyun.baidu.com/datamanager/datamanage 搜索附近接口地址: http://api.map.baidu.com/geosearch/v3/nearby 请求方式: GET 参数: { ak:'540b088ff0f926b7d0b6d5a641******

【shell】两种字符串提取场景的实现

shell虽然比batch顺眼点儿,但还是老话,入门容易,精通难. 1.场景一是这样的,现有字符串的内容 name: tiger; age:18; location:china; 需求:提取每个属性的值,如age的值为18. 定义了一个函数如下: 1 function getValueOf(){ 2 val=$(cat $1 | grep -oP "(?<=$2)[^;]+" | sed "s/,//g" | sed 's/ //g'| tr -cd &quo

高效真实的云渲染算法 【转】

原文链接 : http://www.cnblogs.com/effulgent/archive/2008/10/06/1305029.html 原文: Realistic and Fast Cloud Rendering NinianeWang MicrosoftCorporation(nowatGoogleInc.) [email protected] November11,2003 最近在网上看到很多云渲染的效果图,但很多人吝于向人分享经验知识,我不是很赞同这种想法,本来就是属于别人的知识,

机器学习:保序回归(IsotonicRegression):一种可以使资源利用率最大化的算法

1.数学定义 保序回归是回归算法的一种,基本思想是:给定一个有限的实数集合,训练一个模型来最小化下列方程: 并且满足下列约束条件: 2.算法过程说明 从该序列的首元素往后观察,一旦出现乱序现象停止该轮观察,从该乱序元素开始逐个吸收元素组成一个序列,直到该序列所有元素的平均值小于或等于下一个待吸收的元素. 举例: 原始序列:<9, 10, 14> 结果序列:<9, 10, 14> 分析:从9往后观察,到最后的元素14都未发现乱序情况,不用处理. 原始序列:<9, 14, 10&

点云拼接算法

1.粗配准拼接 #include <pcl/common/transforms.h> #include <pcl/console/parse.h> #include <pcl/console/time.h> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/sample_consensus/method_types.h> #include <

Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)

概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList. 除此之外,Java对于数据集合的遍历,也提供了几种不同的方式.开发人员必须要清楚的明白每一种遍历方式的特点.适用场合.以及在不同底层实现上的表现.下面就详细分析一下这一块内容. 数据元素是怎样在内存中存放的? 数据元素在内存中,主要有2种存储方式: 1.顺序存储,Random Access(Di