@[TOC]PCL中点云特征描述与提取模块的学习
学习背景
参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,PCL版本为1.10.0,CMake版本为3.16。18.06环境下也可使用。
学习内容
估计点云中每个点的法向量
源代码及所用函数
源代码
//法线估计实例
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>
#include<pcl/features/integral_image_normal.h>//法线估计类头文件
#include<pcl/visualization/cloud_viewer.h>
#include<pcl/point_types.h>
#include<pcl/features/normal_3d.h>
//主函数
int main(int argc,char** argv)
{
//打开点云文件
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("/home/jojo/PointCloud/PCLB/Features/01/table_400.pcd",*cloud);
/*创建法线估计向量*/
//这行表示一个输入点类型为 pcl::PointXYZ,输出法向量类型为 pcl::Normal 的法向量估计器。
//pcl::PointXYZ 是输入点云的点类型,表示每个点只包含 x、y、z 三个坐标值。
//pcl::Normal 是输出法向量的类型,表示每个法向量由 x、y、z 三个浮点数分量表示。
pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal> ne;
ne.setInputCloud(cloud);
/*创建法向量估计对象后,需要对其进行配置*/
//创建一个空的KdTree对象,并把它传递给法线估计向量
//基于给出的输入数据集,KdTree将被建立
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
ne.setSearchMethod(tree);//设置邻域搜索方法:
//存储输出数据
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
//使用半径在查询点周围3厘米范围内的所有临近元素
ne.setRadiusSearch(0.03);
//计算特征值
ne.compute(*cloud_normals);
//将法向量显示出来
pcl::visualization::PCLVisualizer viewer("PCL Viewer");
viewer.setBackgroundColor(0,0,0);
//viewer.addPointCloudNormals() 是 PCL (Point Cloud Library) 中的一个函数,用于在可视化窗口中显示点云及其法线信息。
//<pcl::PointXYZ,pcl::Normal> 是函数模板参数,指定了点云数据类型为 pcl::PointXYZ(包含 x、y、z 坐标的点)
//以及法线数据类型为 pcl::Normal(包含法线 x、y、z 分量的结构体)
//cloud参数表示需要添加法线信息的点云,cloud_normals参数表示将法线信息存储到此点云中
viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud,cloud_normals);
while(!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)#指定CMake的最低版本要求为3.16
project(normal_estimation)#设置项目名称
find_package(PCL 1.10 REQUIRED)#查找PCL库,要求版本为1.7或更高。
include_directories(KaTeX parse error: Expected 'EOF', got '#' at position 20: …_INCLUDE_DIRS})#̲将PCL库的头文件目录添加到包…{PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (normal_estimation normal_estimation.cpp)
target_link_libraries (normal_estimation ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。