根据上一篇博客介绍的超体素分割原理,在PCL中该功能以将其实现,并将其进行可视化。但是存在如下问题:(1)其将所有的块同时显示,对于很多其他应用,比如后续处理需要对每一块点单独进行操作,那么就需要将每个块点云单独抽取出来处理;(2)基于超体素分割,分割得到的点云块数据是远少于原始点的数据,其中与初始体素大小密切相关,初始体素体积越小,损失会小一点。这有点类似降采样,但实际一些分类中,是要保证在超体素处理前后,其总的点数是要保持不变的,因此这些没有化成超体素的点也需要单独抽取出,进行后续处理;(3)块与体素之间拓扑关系的构建。在一些若干处理中,如分类中,点之间的上下文信息与点之间的关系距离密切相关,而有些文献,如《An efficient global energy optimization approach for robust 3D plane segmentation of point clouds》中使用体素中心(或体素所有坐标的平均值)来表示体素,中心坐标一般位于体素中心位置,其与相邻体素之间的距离较远,在条件随机场中,根据距离计算而言,实际相邻的2个体素本身属于同一物体,但实际中可能由于距离太远而被错划分成不同地物。因此体素间相邻关系如何有效构建,也是值得研究的。

针对问题(1),即单独将分出的点云簇分开,代码如下:(PCL1.8

#include <pcl/console/parse.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/segmentation/supervoxel_clustering.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include<iostream>
//VTK include needed for drawing graph lines
#include <vtkPolyLine.h>
#include"IO.h"using namespace pcl;
using namespace std;typedef PointXYZ PointT;
typedef PointXYZL PointTL;int main()
{IO IOExample;//--------------------加载点云--------------------------PointCloud<PointT>::Ptr cloud(new PointCloud<PointT>);char *inputpath = "..//测试数据//desk.txt";vector<pcl::PointXYZ> allpoints;allpoints = IOExample.ReadPointXYZIntoVector(inputpath);cloud->width = allpoints.size();cloud->height = 1;cloud->is_dense = false;cloud->resize(cloud->width*cloud->height);for (int i = 0; i < allpoints.size(); i++){cloud->points[i].x = allpoints[i].x;cloud->points[i].y = allpoints[i].y;cloud->points[i].z = allpoints[i].z;}//------------------构建超体素--------------------------float voxel_resultion = 0.005f;float seed_resultion = 0.15f;float color_importance = 0.0f;float spatial_importance = 0.4f;float normal_importance = 5.0f;SupervoxelClustering<PointT> super(voxel_resultion, seed_resultion);super.setInputCloud(cloud);super.setNormalImportance(normal_importance);super.setColorImportance(color_importance);super.setSpatialImportance(spatial_importance);std::map<uint32_t, Supervoxel<PointT>::Ptr >supervoxl_clustering;super.extract(supervoxl_clustering);cout << "supervoxel number is " << supervoxl_clustering.size() << endl;ofstream outfile("..//测试数据//supervoxel_缺点.txt", ios::out);srand((int)time(0));for (auto label_itr = supervoxl_clustering.cbegin(); label_itr != supervoxl_clustering.cend(); label_itr++){double r = rand() % 255;double g = rand() % 255;double b = rand() % 255;int super_label = label_itr->first;Supervoxel<PointT>::Ptr super_cloud = supervoxl_clustering.at(super_label);for (int j = 0; j < super_cloud->voxels_->points.size(); j++){outfile << fixed << setprecision(3) << super_cloud->voxels_->points[j].x << "\t" << super_cloud->voxels_->points[j].y << "\t" << super_cloud->voxels_->points[j].z <<"\t" << fixed << setprecision(0) << r << "\t" << g << "\t" << b << endl;}}outfile.close();return 0;
}

 

可以发现,其实有相当部分的点没有划分到超体素中

(2)第二个问题,PCL中其实是有将没有划分到体素中的点进行单独保存的情况,只是很少有博主对其仔细进行研究。将所有点进行保存,其代码如下:

#include <pcl/console/parse.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/segmentation/supervoxel_clustering.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include<iostream>
//VTK include needed for drawing graph lines
#include <vtkPolyLine.h>
#include"IO.h"using namespace pcl;
using namespace std;typedef PointXYZ PointT;
typedef PointXYZL PointTL;void main()
{IO IOExample;//--------------------加载点云--------------------------PointCloud<PointT>::Ptr cloud(new PointCloud<PointT>);char strpath[] = "..//测试数据//desk.txt";char* path = strpath;vector<pcl::PointXYZ> allpoints;allpoints = IOExample.ReadPointXYZIntoVector(path);cloud->width = allpoints.size();cloud->height = 1;cloud->is_dense = false;cloud->resize(cloud->width * cloud->height);for (int i = 0; i < allpoints.size(); i++){cloud->points[i].x = allpoints[i].x;cloud->points[i].y = allpoints[i].y;cloud->points[i].z = allpoints[i].z;}//------------------构建超体素--------------------------float voxel_resultion = 0.005f;float seed_resultion = 0.15f;float color_importance = 0.0f;float spatial_importance = 0.4f;float normal_importance = 5.0f;SupervoxelClustering<PointT> super(voxel_resultion, seed_resultion);super.setInputCloud(cloud);super.setNormalImportance(normal_importance);super.setColorImportance(color_importance);super.setSpatialImportance(spatial_importance);std::map<uint32_t, Supervoxel<PointT>::Ptr >supervoxl_clustering;super.extract(supervoxl_clustering);pcl::PointCloud<pcl::PointXYZL>::Ptr supervoxel_cloud = super.getLabeledCloud();int begin = 0;//遍历体素获取体素内点的索引,根据索引提取分割后的点云ofstream outfile("..//测试数据//supervoxel_不缺点.txt", ios::out);struct segpoints{vector<pcl::PointXYZ> points;};vector<segpoints> allsegs;allsegs.resize(supervoxl_clustering.size());vector<pcl::PointXYZ> nonsegs;for (int i = 0; i < supervoxel_cloud->points.size(); i++){double idlabel = supervoxel_cloud->points[i].label;pcl::PointXYZ tempoint;tempoint.x = supervoxel_cloud->points[i].x;tempoint.y = supervoxel_cloud->points[i].y;tempoint.z = supervoxel_cloud->points[i].z;if (idlabel > 0 && idlabel <= supervoxl_clustering.size()){allsegs[idlabel - 1].points.push_back(tempoint);}else{nonsegs.push_back(tempoint);}}//进行保存for (int i = 0; i < nonsegs.size(); i++){outfile << fixed << setprecision(3) << nonsegs[i].x << "\t" << nonsegs[i].y << "\t" << nonsegs[i].z << "\t" << fixed << setprecision(0) << 255 << "\t" << 255 << "\t" << 255 << endl;}for (int i = 0; i < allsegs.size(); i++){double r = rand() % 255;double g = rand() % 255;double b = rand() % 255;for (int j = 0; j < allsegs[i].points.size(); j++){outfile << fixed << setprecision(3) << allsegs[i].points[j].x << "\t" << allsegs[i].points[j].y << "\t" << allsegs[i].points[j].z <<"\t" << fixed << setprecision(0) << r << "\t" << g << "\t" << b << endl;}}outfile.close();cout << "结束" << endl;system("pause");}

 

 

其实可以发现,这样进行超体素划分,体素块之间存在一些将不属于同一面片的点,划分到同一体素当中,这存在明显的。从同一平面上看(左一),相邻面片之间的点全部划分到对应的体素中去了

对于(3)个问题,目前还没有好的解决方案,按照之前博客来说,其包括如下方法,使用近邻点构建体素与体素、体素与单个点之间的关系;或者使用中心点来表示。

超体素分割——分割块点云单独保存及遗漏点的处理相关推荐

  1. CloudComparePCL 基于超体素的点云分割

    文章目录 一.原理概述 二.实现过程 三.实现效果 参考资料 一.原理概述 一般而言,孤立的点并没有什么意义,只有许多点组合在一起形成一种形状,这样才能对我们有所意义.二维图像处理领域中,很早就出现了 ...

  2. 基于机器学习的自适应超体素分割揭示了人脑中的躯体定位组织

    文章来源于微信公众号(茗创科技),欢迎有兴趣的朋友搜索关注 导读 除了在中央前回和中央后回的成熟的躯体组织外,目前强有力的证据表明躯体组织在感觉运动网络的其他区域也很明显.这就存在几个实验问题:感觉运 ...

  3. PCL中点云的超体素(SuperVoxel)

    各位小伙伴们,有没有发现PCL库中已经集成了太多我们想实现的算法或者功能呢?所以这里组织一下学习小组针对PCL库中实现的算法进行剖析与论文解读,所以希望更多的小伙伴们参与进来,我们一起吃透PCL,欢迎 ...

  4. SuperVoxel:PCL中点云的超体素

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 标题:Voxel Cloud Connectivity Segmentation - Supervox ...

  5. 综述:激光雷达全景分割的传统点云聚类方法的技术总结

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨泡泡机器人SLAM 标题:A Technical Survey an ...

  6. 基于深度学习的点云分割网络及点云分割数据集

    作者丨泡椒味的泡泡糖 来源丨深蓝AI 引言 点云分割是根据空间.几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征.点云的有效分割是许多应用的前提,例如在三维重建领域,需要对场景内的物 ...

  7. 前沿丨基于深度学习的点云分割网络及点云分割数据集

    众所周知,点云的有效分割是许多应用的前提,例如在三维重建领域,需要对场景内的物体首先进行分类处理,然后才能进行后期的识别和重建.传统的点云分割主要依赖聚类算法和基于随机采样一致性的分割算法,在很多技术 ...

  8. 大盘点 | 基于深度学习的点云分割网络及点云分割数据集

    编辑 | 深蓝前沿 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 后台回复[数据集下载]获取计算机视觉近30种数据集! 引言 点云分割是根据空间.几何和纹理 ...

  9. 视频剪辑工具,教你批量分割视频并提取原音频单独保存

    视频素材太多,如何进行批量分割,并提取原音频单独保存呢?今天小编给大家分享一个新的剪辑技巧,下面一起来试试. 所需工具 视频素材若干 操作步骤 运行[好简单批量智剪],在"分割视频" ...

最新文章

  1. STC用PCA测量脉宽_用于相干激光雷达的大能量长脉宽单频激光器 | COL
  2. 批处理技巧:循环固定目录的子目录,然后向每个子目录拷贝文件
  3. 强化学习笔记:Actor-critic
  4. UI组件之AdapterView及其子类关系,Adapter接口及其实现类关系
  5. IBASE logical view和physical view
  6. 关于人工智能引擎的最初分析文档
  7. drcom linux怎么运行,Drcom_linux
  8. 戴尔R410 centos6.3 x64 环境下 网卡驱动故障
  9. 计算机科学与技术在哪里上课,计算机科学与技术在职研究生可以异地上课吗?...
  10. PAT甲级1001 字符串处理
  11. Splice Beatmaker for Mac(音乐节拍工具)
  12. Python3内置模块2-logging(转)
  13. P4782 【模板】2-SAT 问题
  14. 使用.net的Cache框架快速实现Cache操作
  15. asp.net怎么生成json数据_[随笔]利用 VS2019 + NET5.0 生成镜像部署
  16. Window环境MatConvNet安装
  17. C++ 泛型编程 map(统计人数)
  18. STM32F103C8T6 点亮LED灯
  19. 《论文阅读》Knowledge-Enriched Transformer for Emotion Detection in Textual Conversations
  20. 采写编杂志采写编杂志社采写编编辑部2022年第11期目录

热门文章

  1. 盗号、薅羊毛、机器注册、恶意爬虫——618大促背后涌动的欺诈暗流
  2. Cisco语音专业认证CCVP
  3. 多任务学习MTL-MMOE
  4. 事后控制不如事中控制,事中控制不如事前控制
  5. 学会给视频添加渐入、色彩变幻特效,简单几步骤做创意小视频
  6. java 删除本地文件夹或文件
  7. Access数据库的加密与解密
  8. 智合同丨AI智能审核工具
  9. coursera python证书_Coursera证书|三天零基础Python编程入门
  10. module 'gensim' has no attribute 'corpora'