PCL 估计点云的VFH特征
目录
PCL点云算法汇总及实战案例汇总的目录地址链接:
一、概述
VFH (Viewpoint Feature Histogram) 特征是一种三维点云描述子,它结合了点云的局部几何信息和视点信息,以提高物体识别和分类的精度。VFH 特征通过计算每个点云的法向量分布,生成一个 308 维的特征直方图,用于表示该点云的形状特征。
1.1原理
VFH 特征的计算过程主要包括以下几个步骤:
1.法向量计算:使用法向量计算估计点云表面的几何结构,法向量描述了点的局部表面方向。
2.视点信息计算:通过计算每个点云的法向量与视点方向之间的关系,增强对视角变化的鲁棒性。
3.VFH特征由两部分组成:
- 点云几何特征:VFH捕捉点云的局部几何结构,计算法向量之间的夹角分布,生成法向量直方图。
- 视点相关特征:通过计算法向量与视点方向之间的关系,生成视点相关的直方图信息。
4.特征直方图生成:通过对点与点之间的夹角及点与视点之间的夹角进行直方图统计,生成一个 308 维的特征向量,用于后续的物体识别或分类。
1.2实现步骤
- 读取点云数据:从PCD文件中读取点云。
- 计算法向量:通过KdTree搜索算法,计算每个点的法向量。
- 计算VFH特征:利用点云和法向量,生成VFH特征向量。
- 直方图可视化:将计算的VFH特征通过直方图进行可视化。
1.3应用场景
- 三维物体识别:通过VFH特征可以对物体进行精确识别和分类。
- 机器人抓取:VFH特征结合视点信息,可以为机器人提供更精准的抓取位置和姿态。
- 点云配准:在点云配准中,VFH特征能够帮助不同点云间的匹配,提高配准精度。
二、代码实现
2.1关键函数
2.1.1 法向量计算
void computeNormals(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::Normal>::Ptr normals)
{
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setInputCloud(cloud); // 设置输入点云
ne.setSearchMethod(tree); // 设置搜索方法
ne.setRadiusSearch(0.03); // 搜索半径3cm
ne.compute(*normals); // 计算法向量
}
2.1.2 VFH特征计算
void computeVFH(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::Normal>::Ptr normals, pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_features)
{
pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> vfh;
vfh.setInputCloud(cloud); // 设置输入点云
vfh.setInputNormals(normals); // 设置法向量
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
vfh.setSearchMethod(tree); // 设置搜索方法
vfh.compute(*vfh_features); // 计算VFH特征
}
2.1.3 直方图可视化
void visualizeVFH(pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_features)
{
pcl::visualization::PCLPlotter plotter;
plotter.setTitle("VFH Feature Histogram"); // 设置标题
plotter.setShowLegend(true); // 显示图例
plotter.addFeatureHistogram(*vfh_features, 300); // 可视化VFH特征
plotter.setWindowSize(800, 600); // 设置窗口大小
plotter.spinOnce(30000000); // 显示
}
2.2完整代码
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/features/vfh.h> // VFH特征估计头文件
#include <pcl/io/pcd_io.h> // 点云文件读写
#include <pcl/features/normal_3d.h> // 法线特征估计
#include <pcl/visualization/pcl_plotter.h> // 用于可视化VFH直方图
using namespace std;
// 计算法向量
void computeNormals(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::Normal>::Ptr normals)
{
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setInputCloud(cloud); // 设置输入点云
ne.setSearchMethod(tree); // 设置搜索方法
ne.setRadiusSearch(0.03); // 设置搜索半径为3厘米
ne.compute(*normals); // 计算法向量
}
// 计算VFH特征
void computeVFH(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::Normal>::Ptr normals, pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_features)
{
pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> vfh;
vfh.setInputCloud(cloud); // 设置输入点云
vfh.setInputNormals(normals); // 设置法向量
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
vfh.setSearchMethod(tree); // 设置搜索方法
vfh.compute(*vfh_features); // 计算VFH特征
}
// 可视化VFH直方图
void visualizeVFH(pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_features)
{
pcl::visualization::PCLPlotter plotter;
plotter.setTitle("VFH Feature Histogram"); // 设置标题
plotter.setShowLegend(true); // 显示图例
plotter.addFeatureHistogram(*vfh_features, 300); // 可视化VFH特征
plotter.setWindowSize(800, 600); // 设置窗口大小
plotter.spinOnce(30000000); // 显示
}
int main()
{
// 1. 读取点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read("person2.pcd", *cloud);
// 2. 计算法向量
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
computeNormals(cloud, normals);
// 3. 计算VFH特征
pcl::PointCloud<pcl::VFHSignature308>::Ptr vfh_features(new pcl::PointCloud<pcl::VFHSignature308>);
computeVFH(cloud, normals, vfh_features);
// 4. 可视化VFH特征直方图
visualizeVFH(vfh_features);
return 0;
}
三、实现效果
原文地址:https://blog.csdn.net/qq_47947920/article/details/142782913
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!