PCL中的区域生长分割(region growing segmentation)

2023-11-04

在本博文中,我主要介绍如何在pcl::RegionGrowing类中调用区域增长算法。首先注意一点,这里是region growing segmentation,不是color-based region growing segmentation.


算法核心:该算法是基于点法线之间角度的比较,企图将满足平滑约束的相邻点合并在一起,以一簇点集的形式输出。每簇点集被认为是属于相同平面。


工作原理:首先需要明白,区域增长是从有最小曲率值(curvature value)的点开始的。因此,我们必须计算出所有曲率值,并对它们进行排序。这是因为曲率最小的点位于平坦区域,而从最平坦的区域增长可以减少区域的总数。现在我们来具体描述这个过程:

1.点云中有未标记点,按照点的曲率值对点进行排序,找到最小曲率值点,并把它添加到种子点集;

2.对于每个种子点,算法都会发现周边的所有近邻点。1)计算每个近邻点与当前种子点的法线角度差(reg.setSmoothnessThreshold),如果差值小于设置的阈值,则该近邻点被重点考虑,进行第二步测试;2)该近邻点通过了法线角度差检验,如果它的曲率小于我们设定的阈值(reg.setCurvatureThreshold),这个点就被添加到种子点集,即属于当前平面。

3.通过两次检验的点,被从原始点云去除。

4.设置最小点簇的点数min(reg.setMinClusterSize),最大点簇为max(reg.setMaxClusterSize)。

4.重复1-3步,算法会生成点数在min和max的所有平面,并对不同平面标记不同颜色加以区分。

5.直到算法在剩余点中生成的点簇不能满足min,算法停止工作。


算法具体的伪码表示:http://pointclouds.org/documentation/tutorials/region_growing_segmentation.php#region-growing-segmentation


实现算法的工程文件中的代码,.cpp:

#include <iostream>
#include <vector>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/region_growing.h>

int
main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  if ( pcl::io::loadPCDFile <pcl::PointXYZ> ("region_growing_tutorial.pcd", *cloud) == -1)
  {
    std::cout << "Cloud reading failed." << std::endl;
    return (-1);
  }

  pcl::search::Search<pcl::PointXYZ>::Ptr tree = boost::shared_ptr<pcl::search::Search<pcl::PointXYZ> > (new pcl::search::KdTree<pcl::PointXYZ>);
  pcl::PointCloud <pcl::Normal>::Ptr normals (new pcl::PointCloud <pcl::Normal>);
  pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator;
  normal_estimator.setSearchMethod (tree);
  normal_estimator.setInputCloud (cloud);
  normal_estimator.setKSearch (50);
  normal_estimator.compute (*normals);

  pcl::IndicesPtr indices (new std::vector <int>);
  pcl::PassThrough<pcl::PointXYZ> pass;
  pass.setInputCloud (cloud);
  pass.setFilterFieldName ("z");
  pass.setFilterLimits (0.0, 1.0);
  pass.filter (*indices);

  pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
  reg.setMinClusterSize (50);
  reg.setMaxClusterSize (1000000);
  reg.setSearchMethod (tree);
  reg.setNumberOfNeighbours (30);
  reg.setInputCloud (cloud);
  //reg.setIndices (indices);
  reg.setInputNormals (normals);
  reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI);
  reg.setCurvatureThreshold (1.0);

  std::vector <pcl::PointIndices> clusters;
  reg.extract (clusters);

  std::cout << "Number of clusters is equal to " << clusters.size () << std::endl;
  std::cout << "First cluster has " << clusters[0].indices.size () << " points." << endl;
  std::cout << "These are the indices of the points of the initial" <<
    std::endl << "cloud that belong to the first cluster:" << std::endl;
  int counter = 0;
  while (counter < clusters[0].indices.size ())
  {
    std::cout << clusters[0].indices[counter] << ", ";
    counter++;
    if (counter % 10 == 0)
      std::cout << std::endl;
  }
  std::cout << std::endl;

  pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud ();
  pcl::visualization::CloudViewer viewer ("Cluster viewer");
  viewer.showCloud(colored_cloud);
  while (!viewer.wasStopped ())
  {
  }

  return (0);
}

注释:

      1.文件输入、输出最好使用绝对路径;

      2.代码中涉及到的参数:

             setKSearch(): 这是在计算点的法线时,设置邻域内需要多少点来模拟平面计算法线。法线计算:http://geometryhub.net/notes/pointcloudnormal

                       setMInClusterSize()   setMaxClusterSize() 原理中已经提到

                       setNumberOfneighbours() 指的是区域增长时种子点附近纳入检验的点数

                       setSmoothnessThreshold()  setCurvatureThreshold()   原理中已经提到。这两个阈值的设置尤其重要,它们是region growing segmentation的核心。

      3.注意,输入点点类型为 pcl::PointCloud<pcl::PointXYZ>,输出点为pcl::PointXYZRGB,因为分割完之后不同平面信息被 不同颜色标记,而被抛弃的点被红色标记。如下图所示。点类型根据读者输入的点云数据包含的列信息而定,在此不在详细解释。

            

       4.cmake文件参照如下:

              

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(region_growing_segmentation)

find_package(PCL 1.5 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (region_growing_segmentation region_growing_segmentation.cpp)
target_link_libraries (region_growing_segmentation ${PCL_LIBRARIES})

                

  最后,区域增长算法已经是比较老的平面分割算法。希望大家能提出更好的算法。

         参考资料:http://pointclouds.org/documentation/tutorials/region_growing_segmentation.php#region-growing-segmentation

    


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCL中的区域生长分割(region growing segmentation) 的相关文章

  • Can‘t Compile project with PCL

    报错 xff1a In file included from usr include vtk vtkAtomicTypes h 18 0 from usr include vtk vtkObjectBase h 46 from usr in
  • ubuntu下安装多版本PCL

    1 多版本安装 最初安装了PCL1 8 1 xff0c 因实验需求 xff0c 需要再安装PCL1 9 0 PCL1 8 1的安装没有做任何额外改动 xff0c 其库文件安装地址为 usr local include pcl 1 8 pcl
  • 【点云空间索引】python-pcl:KdTree与八叉树

    1 点云是什么 通过雷达 激光扫描 立体摄像机等三维测量设备获得的点云数据 具有数据量大 分布不均匀等特点 点云数据主要是表征目标表面的海量点集合 并不具备传统实体网格数据的几何拓扑信息 点云处理中最核心的问题就是建立离散点间的拓扑结构 实
  • PCL点云库学习笔记(搜索方法)

    PCL点云库学习笔记 搜索方法 一 k d tree 二 八叉树 一 k d tree 我们所有的k d树都是三维空间的 k d树的每个级都使用特定维度拆分所有子级 在树的根部 所有子项都将根据第一维进行拆分 即 如果第一维坐标小于根 则它
  • PCL学习(1)PCL初玩

    PCL学习 文章目录 PCL学习 toc 前言 安装 说明 一步步引导做例子 关于CMakeLists txt 具体实践 官网的例子 解释 参数 总结 前言 最近进行毕设论文的设计时 博主学习计算机相关学习的过程中 但是浏览中感觉PCL进行
  • PCL分割:Conditional Euclidean Clustering官方历程,在自己配置环境上调错

    本人环境 VS2015 PCL1 8 1 1 首先遇到遇到了 无法解析的外部符号 提示和normal estimation等错误 解决办法 打开项目属性页 gt C C gt 预处理器 添加 PCL NO PRECOMPILE 2 erro
  • Ubuntu18.04安装PCL保姆级教程

    系统环境 Ubuntu18 04 6 LTS 1 安装依赖包 sudo apt get update sudo apt get install git build essential linux libc dev sudo apt get
  • 点云地图PCL转换成为八叉树地图octomap

    TODO 完成离线点云地图到八叉树地图的转换 进一步在线实时完成点云地图到八叉树地图的转换 转载自高翔的博客 SLAM拾萃 1 octomap 我是萌萌哒的分割线 大家好 时隔多年之后 我又开始了博客旅程 经历了很多事情之后呢 我发现自己的
  • PCL1.8.0+VS2013环境配置

    一 PCL环境配置 1 下载PCL 1 8 0 AllInOne msvc2013 win32exe和PCL 1 8 0 AllInOne msvc2013 win32exe pdb然后解压 配置环境变量PATH 下载链接 https pa
  • 点云边界提取及可视化

    include
  • 【PCL】的五大依赖库及作用

    安装点云PCL Point Cloud Library 库时 需要额外安装5个依赖库 它们有什么作用呢 如下 Boost 用于共享指针和多线程 Eigen 一个标准的C 模板库用于线性代数 矩阵 向量等计算 FLANN Fast Appro
  • PCL:从法线计算到曲率计算并可视化

    法线求解原理 表面法线是几何体表面的重要属性 在很多领域都有大量应用 例如 在进行光照渲染时产生符合可视习惯的效果时需要表面法线信息才能正常进行 对于一个已知的几何体表面 根据垂直于点表面的矢量 因此推断表面某一点的法线方向通常比较简单 然
  • PCL-获取点云体素中的所有点的索引的方法

    使用 octree 将点云体素化之后 获取体素中所有点的方法 即OctreeContainerBase中的三个方法的介绍 getPointIndex getPointIndicesVector getPointIndices 这三个方法都是
  • 关于VTK9 vs2019编译QVTK 过程中的记录

    环境 vtk9 0 QT5 12 PCL 1 12 vs2019 x64 这段时间下载了VTK 9 0 并利用vs2019对QVTK进行了编译 1 只要在编译过程中勾选了QT相关选项 就一定可以生成QVTK相关的头文件和库 编译过程网上已经
  • PCL之区域生长分割

    算法思想 首先依据点的曲率值对点进行排序 之所以排序 是因为区域生长算法是从曲率最小的点开始生长的 这个点就是初始种子点 初始种子点所在的区域即为最平滑的区域 从最平滑的区域开始生长可减少分割片段的总数 提高效率 算法流程 设置一空的种子点
  • python-pcl安装和使用

    安装 因为工作中要进行点云数据的显示 因此要安装python pcl 网上搜了很多教程 但是安装中还是遇到很多问题 这里把自己遇到的和可能遇到的问题总结一下 环境 Ubuntu 14 04 python 2 7 6 pcl 1 7 0 网上
  • 【Ubuntu】vscode配置PCL库/vscode无法导入PCL库

    问题 PCL库是ROS框架自带的点云处理库 可以通过find package PCL REQUIRED 在CMakeLists txt中导入 但是vscode却无法识别 出现问题如下 注意 本文解决方案仅限Ubuntu 解决方案 打开工程路
  • 点云配准注意的地方

    1 法向量是局部坐标系的概念 因此要将点云中心移到原点 再计算法向量 类似于先平移再旋转 而不是先旋转再平移 2 用kdtree时 用近邻点个数 而不是距离 因为点云各个不同 3 变换矩阵的对角线是目标与源点云的相似度 位移为0 x det
  • PCL常用小知识

    转自 SimpleTriangle 时间计算 pcl中计算程序运行时间有很多函数 其中利用控制台的时间计算是 首先必须包含头文件 include
  • PCL调错(2):VTK报错

    为了解决这两个问题 一共做了两步操作 第一 百度搜索结果是说我的lib库连接不对 就是VTK附加依赖项没有添加完整 比如把vtkRenderingOpenGL lib库添加进去 所以又重新把vtk下的lib库都导入一遍 有一种方法 在cmd

随机推荐

  • Delphi多层开发方案比较

    以下转载自 http blog sina com cn s blog 53decb4101009a5m html type v5 one label rela nextarticle http blog csdn net SmallHand
  • 华为机试HJ60 查找组成一个偶数最接近的两个素数

    HJ60 查找组成一个偶数最接近的两个素数 Python 题目 解题思路 代码 结果 题目 解题思路 1 多组输入 需要循环 2 先创建一个判断是否素数的函数以备调用 素数判断 从1以后开始 如果到该数一半的位置有可以整除的数 则不是素数
  • 【pygame杂记】字体

    这一节放在这里挺突兀的 但是因为今天开周会 晚回来了 而且吃晚饭还吃撑了所以就简单写一下吧 举个栗子进行简述 我们知道在python中所有的东西都可以抽象成对象 在这里 我们创建了一个字体的对象 创建字体对象 font pygame fon
  • android Handler详细使用方法实例

    开发环境为android4 1 Handler使用例1 这个例子是最简单的介绍handler使用的 是将handler绑定到它所建立的线程中 本次实验完成的功能是 单击Start按钮 程序会开始启动线程 并且线程程序完成后延时1s会继续启动
  • DDL语言的使用

    第1关 创建数据库 编程要求 在右侧窗口编写 SQL 并创建一个名为 teachingdb 的教学数据库 连接数据库的用户名为 root 密码为 123123 请在此编写代码 操作完毕之后点击评测 Begin create database
  • 蓝桥杯VIP算法训练-轨道炮-看完秒懂的(c++map)

    题目描述 小明在玩一款战争游戏 地图上一共有 N 个敌方单位 可以看作 2D 平面上的点 其中第 i 个单位在 0 时刻的位置是 Xi Yi 方向是 Di 上下左右之一 用 U D L R 表示 速度是 Vi 小明的武器是轨道炮 只能使用一
  • Typescript--Typescript中的新增类型

    一 any any表示的是任意类型 一个变量设置类型为any后 相当于该变量管理了TS的类型检测 尽量不要用any let d any 声明变量如果不指定类型 则TS解析器会自动判断变量的类型为any 隐式的any let d d 10 d
  • DataFrame数据的多种遍历方法

    后续补充 遍历DataFrame的三种方法 iteritem 方法返回一个
  • Unity初探(光源类型与光照模式)

    0 引子 unity的光源有四种 每种光源都有3种光照模式 而场景中不同模式的光源而且对静态和动态的对象有不同的效果 而官方文档又显得有点晦涩难懂 如果是初学者第一次阅读 比如说我 难免会被场景中动态和静态游戏对象与不同模式光源的交互 以及
  • 【DATAX】datax读取hive分区表时,空分区任务报错问题解决

    问题场景 之前在 Dolphinscheduler调度Datax任务读取Hive分区表案例 博客中我分享了调度任务读取hive分区的几个场景 当时提到了分区中有空文件的解决方案 除此之外 我们还遇到了空分区的场景 即该分区没有数据 连所谓的
  • BLS with Random Oracle; BLS 短签名在随机谕言机模型下的安全证明 内容小结

    BLS with Random Oracle BLS 短签名在随机谕言机模型下的安全证明 内容小结 密码学安全规约推荐书目 博客为这两本书学习笔记与内容小结 密码学中的可证明安全性 杨波 清华大学出版社 Introduction to Se
  • 优化图形性能

    良好的性能对很多游戏的成功至关重要 以下几条简单法则有助于将游戏的渲染速度最大化 找出影响图形性能的主要因素 游戏的图形部分主要影响计算机的两个系统 CPU 和 GPU 找到性能问题所在是一切优化的首要法则 因为 GPU 与 CPU 的优化
  • qt 信号与槽机制,登录界面跳转

    登录界面跳转 配置文件 pro QT core gui texttospeech greaterThan QT MAJOR VERSION 4 QT widgets CONFIG c 11 The following define make
  • JDK源码中为什么在方法中创建一个临时变量替代成员变量、类变量

    JDK源码中为什么在方法中创建一个临时变量替代成员变量 类变量 又名 临时变量提高Java代码性能 一个Java类中可以存在多种形式的变量 可以是最一般的成员变量 或静态变量 或临时变量 那么这三种变量的存取效率如何 1 实战出真知 pac
  • 【ML on Kubernetes】第 6 章:机器学习工程

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 其他常用类

    1 Json和对象之间的转换 2 StringUtils StringUtils isNotBlank 判断不为空且也不是空字符串 3 BeanCopier BeanCopier是Cglib包中的一个类 用于对象的复制 net sf cgl
  • MySQL基础--(函数,函数返回值)

    含义 一组预先编译好的sql语句的集合 理解成成批的语句 1 提高代码的重用性 2 简化操作 3 减少编译次数并且减少和数据库服务器的连接次数 提高效率 区别 存储过程 可以有0个返回 也可以有多个返回 适合做批量插入 批量更新 函数 有且
  • Sqlserver递归查询所有上级或所有下级成员

    菜单目录结构表 create table tb menu id int not null 主键id title varchar 50 标题 parent int parent id 查找所有上级节点 with cte parent id t
  • Picgo使用Gitee平台搭建图床照片无法显示

    1 问题 使用Hexo框架搭建个人博客 发现博客中图片无法显示 2 问题分析 查看图床 发现相册中图片无法显示 查阅多方网站 发现Gitee与Picgo配合使用时 图片文件不能大于1M 这主要因为Gitee查阅超过1M的文件需要登录的权限
  • PCL中的区域生长分割(region growing segmentation)

    在本博文中 我主要介绍如何在pcl RegionGrowing类中调用区域增长算法 首先注意一点 这里是region growing segmentation 不是color based region growing segmentatio