利用PCL点云下采样实现数据体素化

PCL

PCL(Point Cloud Library) 库集成了针对大体量级别的空间点数据处理所需要的算法和操作,降低了处理相关需求的复杂度,对快速建立点云数据文档和渲染有着很好的作用。

体素化Voxelization

体素化是通过用空间均匀大小的体素网格(voxel grid)来模拟模型或者点云的几何形态的过程,实现模型体素化的方式有很多,比如基于八叉树的三模网格模型体素化,基于GPU并利用渲染管线中fragment shader部分实现的栅格化插值。本章主要讨论用PCL的下采样方式来实现模型点云的体素化,并且实现可视化。

算法

  1. 读入点云数据。
  2. 获取AABB盒子。
  3. 对点云数据进行下采样过滤。(实现体素化)
  4. 渲染可视化。

【建立结构体】

typedef struct point_XYZ{double point_X;double point_Y;double point_Z;double point_R;
};

【读入点云数据】

 //point cloudspcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_txt(new pcl::PointCloud<pcl::PointXYZ>());pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filter(new pcl::PointCloud<pcl::PointXYZ>());FILE *file;int point_Sum; point_XYZ point;vector<point_XYZ> vec_Point;file = fopen(argv[1], "r");if(file){while(fscanf(file, "%lf %lf %lf", &point.point_X, &point.point_Y, &point.point_Z) != EOF){vec_Point.push_back(point);}}else{cout << "Could not load data from " << argv[1] <<" file..." <<endl;return 0;}fclose(file);point_Sum = vec_Point.size();for(size_t i = 0; i< cloud -> points.size(); ++i){cloud -> points[i].x = vec_Point[i].point_X;cloud -> points[i].y = vec_Point[i].point_Y;cloud -> points[i].z = vec_Point[i].point_Z;}

或者直接从PCD文件中读入点云信息

 if(pcl::io::loadPCDFile(pcdName, *cloud) == -1){cout << "Could not open the file: " << pcdName << "..." <<endl;return -1;}

【获取AABB】

 pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;feature_extractor.setInputCloud(cloud);feature_extractor.compute();pcl::PointXYZ min_point_AABB;pcl::PointXYZ max_point_AABB;feature_extractor.getAABB(min_point_AABB, max_point_AABB);

【下采样体素化】

 //VoxelGrid filtering ***PCL***pcl::VoxelGrid<pcl::PointXYZ> fil;fil.setInputCloud(cloud);fil.setLeafSize(atof(argv[2]), atof(argv[2]), atof(argv[2]));fil.filter(*cloud_filter);int filterPointSize = cloud_filter -> points.size();

下采样的过程就是把点云放到规定大小的单位体素盒中去,如果一个局部的点群都落在了一个单位体素盒子里,那么这个盒子中所有的点都会用一个重心点来表示。通过这个过程,点云数据会大大被过滤,但是模型的体态还保持着完整性。

如果不用PCL库也可以实现,下面的核心带面可供参考:

 int ijk0 = static_cast<int> (ceil(vec_Point[i].point_X * inverse_voxel_size.index_X) - (bound_min.point_X * inverse_voxel_size.index_X));int ijk1 = static_cast<int> (floor(vec_Point[i].point_Y * inverse_voxel_size.index_Y) - (bound_min.point_Y * inverse_voxel_size.index_Y));int ijk2 = static_cast<int> (floor(vec_Point[i].point_Z * inverse_voxel_size.index_Z) - (bound_min.point_Z * inverse_voxel_size.index_Z));

如上求出每个点对应的x,y,z后,就可以对每个单位体素求其中点的重心点,并且把重心点插入到每个单位体素中。

【可视化渲染】

 pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer("Voxelization"));viewer -> setBackgroundColor(0,0,0);//Add AABB boxviewer -> addCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z,1.0, 1.0, 1.0, "AABB");viewer -> setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "AABB");

两种体素化渲染方式:

  1. Solid cube
 for(int i=0; i<filterPointSize; i++){double x = cloud_filter->points[i].x;double y = cloud_filter->points[i].y;double z = cloud_filter->points[i].z;Eigen::Vector3f center(floor(x / voxelSize)*voxelSize + voxelSize/2, floor(y / voxelSize)*voxelSize + voxelSize/2, floor(z / voxelSize)*voxelSize + voxelSize/2);Eigen::Quaternionf rotation(1,0,0,0);string cube = "AABB"+to_string(i);viewer -> addCube(center,rotation,voxelSize, voxelSize, voxelSize, cube);}
  1. Wireframe cube
 //rendering by z axispcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> v_color(cloud,"z"); viewer -> addPointCloud<pcl::PointXYZ>(cloud, v_color, "vertices color");for(int i=0; i<filterPointSize; i++){double x = cloud_filter->points[i].x;double y = cloud_filter->points[i].y;double z = cloud_filter->points[i].z;Eigen::Vector3f center(floor(x / voxelSize)*voxelSize + voxelSize/2, floor(y / voxelSize)*voxelSize + voxelSize/2, floor(z / voxelSize)*voxelSize + voxelSize/2);Eigen::Quaternionf rotation(1,0,0,0);string cube = "AABB"+to_string(i);viewer -> addCube(center,rotation,voxelSize, voxelSize, voxelSize, cube);//shape renderingviewer -> setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, cube);}

【示例图】




利用PCL点云下采样实现数据体素化相关推荐

  1. 电视台成阿里云下一个大数据重塑目标

    本文讲的是电视台成阿里云下一个大数据重塑目标,[IT168专稿]继空调之后,电视台成为阿里云计算的下一个大数据重塑目标.3月20日下午,阿里云宣布联手新奥特.华通云数据,打造中国最大的全媒体云计算平台 ...

  2. python使用imbalanced-learn的ClusterCentroids方法进行下采样处理数据不平衡问题

    python使用imbalanced-learn的ClusterCentroids方法进行下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜 ...

  3. python使用imbalanced-learn的AllKNN方法进行下采样处理数据不平衡问题

    python使用imbalanced-learn的AllKNN方法进行下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜(class ske ...

  4. python使用imbalanced-learn的NearMiss方法进行下采样处理数据不平衡问题

    python使用imbalanced-learn的NearMiss方法进行下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜(class s ...

  5. python使用imbalanced-learn的TomekLinks方法进行下采样处理数据不平衡问题

    python使用imbalanced-learn的TomekLinks方法进行下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜(class ...

  6. python使用imbalanced-learn的OneSidedSelection方法进行下采样处理数据不平衡问题

    python使用imbalanced-learn的OneSidedSelection方法进行下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏 ...

  7. python使用imbalanced-learn的SMOTEENN方法同时进行上采样和下采样处理数据不平衡问题

    python使用imbalanced-learn的SMOTEENN方法同时进行上采样和下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜(c ...

  8. python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题

    python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜 ...

  9. python使用imbalanced-learn的NeighbourhoodCleaningRule方法进行下采样处理数据不平衡问题

    python使用imbalanced-learn的NeighbourhoodCleaningRule方法进行下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalanc ...

最新文章

  1. Visual Studio UML Use Case Diagram(2)
  2. 使用sendfile()让数据传输得到最优化,TCP_CORK、TCP_DEFER_ACCEPT和TCP_QUICKACK优化网络...
  3. 怎么读取h5文件内容_【Python编程特训连载72】读取two.txt文件,模拟输出“两会”内容 答案公布...
  4. 使用git checkout命令切换到指定的commit
  5. 新版本微信导致的ios表单bug
  6. 微软推出全新的Windows 10系统图标
  7. JavaOne正在重建动力
  8. 图解算法学习笔记(五):散列表
  9. 如果你需要万圣节的图片素材来点缀你的节日活动,看这里就对了
  10. React 小案例 路由跳转
  11. DXUT框架剖析(14)
  12. 当游戏遇到区块链之链游经济系统思考
  13. 【Android智能硬件开发】【010】安卓读写串口
  14. soui 设置边框_UI神器-SOUI
  15. calico更换ip地址池-k8s
  16. golang设计模式——结构模式
  17. 模拟夜间灯光-科目三-灯光口令(9选5)
  18. java图片叠加_[原创]JAVA中图片上叠加文字的方法
  19. 基于excel的数据分析
  20. python 读取gif_如何使用opencv(python)从url读取gif

热门文章

  1. DQUERY - D-query 普通莫队
  2. 计算机进制中负数对应的二进制,十进制负数转换为二进制、八进制、十六进制的知识分享...
  3. PHP通常用哪种web服务器,常见的几种WEB服务器配置方案分享
  4. “水果”:哪种水果最有营养
  5. 关于学生课堂行为识别算法
  6. 一次关于读写锁的探索
  7. 一个图书编辑在南美逛书展(上)
  8. 人生就是一场猝不及防
  9. php mpdf 设置字体,php - 将字体添加到mPDF - 堆栈内存溢出
  10. WIN10系统禁用shift键更换输入法