国内做网站建设知名的公司,排版设计图片模板,华夏星光工业设计公司,wordpress 流量数据库[TOC]PCL中点云分割模块的学习
学习背景
参考书籍#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,#xff0c;PCL版本为1.10.0#xff0c;CMake版本为3.16#xff0c;可用点云下载地址
学习内容
使用渐进形态滤波器分割识别地面回波#xff0c;即执…[TOC]PCL中点云分割模块的学习
学习背景
参考书籍《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,PCL版本为1.10.0CMake版本为3.16可用点云下载地址
学习内容
使用渐进形态滤波器分割识别地面回波即执行渐进形态滤波器对地面点进行分割。本文所用点云地址
源代码及所用函数
源代码
#include iostream
#include pcl/io/pcd_io.h
#include pcl/point_types.h
#include pcl/filters/extract_indices.h//提供一个名为 pcl::ExtractIndices 的滤波器类用于根据一组给定的索引从点云中提取出一部分点。
#includepcl/segmentation/progressive_morphological_filter.h//提供渐进式形态学滤波器 (Progressive Morphological Filter) 的实现用于从点云数据中分割出地面点。int main()
{pcl::PointCloudpcl::PointXYZ::Ptr cloud (new pcl::PointCloudpcl::PointXYZ);pcl::PointCloudpcl::PointXYZ::Ptr cloud_filtered (new pcl::PointCloudpcl::PointXYZ);pcl::PointIndicesPtr ground(new pcl::PointIndices);/************************************************加载PCD文件********************************************/pcl::PCDReader reader;reader.readpcl::PointXYZ(/home/jojo/PointCloud/samp11-utm.pcd,*cloud);//将读取的点云打印出来// std::cerr Cloud before filtering: std::endl;// std::cerr *cloud std::endl;/************************************************创建滤波器*******************************************/pcl::ProgressiveMorphologicalFilterpcl::PointXYZ pmf;pmf.setInputCloud (cloud);pmf.setMaxWindowSize(20);//最大窗口大小pmf.setSlope(1.0f);//斜率pmf.setInitialDistance(0.5f);//初始距离pmf.setMaxDistance(3.0f);//最大距离pmf.extract(ground-indices);//将分割出的地面点的索引存储到ground-indices中。/*************************************************创建过滤对象**************************************/pcl::ExtractIndicespcl::PointXYZ extract;extract.setInputCloud (cloud);extract.setIndices (ground);extract.filter (*cloud_filtered);//将提取出的地面点存储到cloud_filtered中。//将滤波后的点云打印出来// std::cerr Ground cloud after filtering: std::endl;// std::cerr *cloud_filtered std::endl;pcl::PCDWriter writer;writer.writepcl::PointXYZ (samp11-utm_ground.pcd, *cloud_filtered, false);/***********************************************获取非地面的点云***********************************/extract.setNegative (true);extract.filter (*cloud_filtered);writer.writepcl::PointXYZ (samp11-utm_object.pcd, *cloud_filtered, false);return 0;
}CMakeLists.txt
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)#指定CMake的最低版本要求为3.16
project(project)#设置项目名称
find_package(PCL 1.10 REQUIRED)#查找PCL库,要求版本为1.10或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (bare_earth bare_earth.cpp)
target_link_libraries (bare_earth ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。
运行结果
地面点云
pcl_viewer samp11-utm_ground.pcd非地面点云
pcl_viewer samp11-utm_object.pcd函数 pcl::ProgressiveMorphologicalFilterpcl::PointXYZ是PCL库中用于地面分割的一种滤波器类。它基于形态学操作(morphological operations)的思想,通过逐步增加窗口大小来识别地面点。 该滤波器的工作原理如下: 首先,它使用一个较小的窗口在点云中滑动,计算每个点的最大高度差。如果高度差小于设置的斜率(slope)阈值,则认为这些点属于地面。 然后,它逐步增大窗口大小,重复上述过程,直到窗口大小达到设置的最大值。 通过这种逐步增大窗口大小的方式,滤波器可以逐步识别出更大范围内的地面点。 在使用这个滤波器之前,需要设置以下几个重要参数: setMaxWindowSize(int):设置窗口的最大大小。setSlope(float):设置识别地面的最大斜率阈值。setInitialDistance(float):设置初始窗口的大小。setMaxDistance(float):设置窗口增长的最大距离。extract.setNegative(true)的作用是设置pcl::ExtractIndices对象的negative标志为true表示提取点云中不在给定索引集合中的点。 当negative标志设置为false默认值时pcl::ExtractIndices会提取出与给定索引集合对应的点并将其存储到输出点云中。 当negative标志设置为true时pcl::ExtractIndices会提取出不在给定索引集合中的点并将其存储到输出点云中。
补充内容