当前位置: 首页 > news >正文

PCL 估计点云的VFH特征

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 法向量计算

2.1.2 VFH特征计算

2.1.3 直方图可视化

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        VFH (Viewpoint Feature Histogram) 特征是一种三维点云描述子,它结合了点云的局部几何信息和视点信息,以提高物体识别和分类的精度。VFH 特征通过计算每个点云的法向量分布,生成一个 308 维的特征直方图,用于表示该点云的形状特征。

1.1原理

VFH 特征的计算过程主要包括以下几个步骤:

1.法向量计算:使用法向量计算估计点云表面的几何结构,法向量描述了点的局部表面方向。

2.视点信息计算:通过计算每个点云的法向量与视点方向之间的关系,增强对视角变化的鲁棒性。

3.VFH特征由两部分组成:

  • 点云几何特征:VFH捕捉点云的局部几何结构,计算法向量之间的夹角分布,生成法向量直方图。
  • 视点相关特征:通过计算法向量与视点方向之间的关系,生成视点相关的直方图信息。

4.特征直方图生成:通过对点与点之间的夹角及点与视点之间的夹角进行直方图统计,生成一个 308 维的特征向量,用于后续的物体识别或分类。

1.2实现步骤

  1. 读取点云数据:从PCD文件中读取点云。
  2. 计算法向量:通过KdTree搜索算法,计算每个点的法向量。
  3. 计算VFH特征:利用点云和法向量,生成VFH特征向量。
  4. 直方图可视化:将计算的VFH特征通过直方图进行可视化。

1.3应用场景

  1. 三维物体识别:通过VFH特征可以对物体进行精确识别和分类。
  2. 机器人抓取:VFH特征结合视点信息,可以为机器人提供更精准的抓取位置和姿态。
  3. 点云配准:在点云配准中,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);           // 搜索半径3cmne.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;
}

三、实现效果


http://www.mrgr.cn/news/46168.html

相关文章:

  • 源代码加密怎么做?企业常用十款源代码加密软件排行榜
  • 服装生产管理:SpringBoot技术实现
  • ABC374
  • 【汇编语言】寄存器(CPU工作原理)(六)—— 修改CS,IP的指令以及代码段
  • 硬盘坏道怎么修复?教程分享!
  • YOLO11涨点优化:blcok优化 | ECVBlock即插即用的多尺度融合模块,助力小目标涨点 | 顶刊TIP 2023 CFPNet
  • 高级Python开发工程师的面试备考指南
  • 解决:由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开.请跟服务器管理员联系
  • RISC-V架构CPU的微架构设计分析
  • 宝兰德加入中国交通运输协会信息专业委员会,携手共绘交通行业信息化新篇章
  • STM32(十八):SPI通信
  • 免费ppt模板从哪找?一文看这里
  • RAG 分块检索难,Late Chunking 值得试试
  • Linux系统和数据库常用的命令2
  • 怎么将手机备忘录传送至电脑
  • 2024年山东省安全员A证证考试题库及山东省安全员A证试题解析
  • windows 安装 ElasticSearch
  • 基于SSM vue uniapp 的个性化商铺系统(小程序)设计与实现
  • Langchain4j如何实现智能问答的跨越式进化?
  • 【C++篇】继承之巅:超越法则束缚,领略面向对象的至臻智慧