【译】PCL官网教程翻译(18):估计一组点的视点特征直方图(VFH)签名 - Estimating VFH signatures for a set of points

英文原文查看

估计一组点的视点特征直方图(VFH)签名

本文描述了视点特征直方图([VFH])描述符,这是一种针对聚类(如对象)识别和6DOF姿态估计问题的点簇表示方法。
下图展示了一个VFH识别和姿态估计的例子。给定一组火车数据(除最左边的点云外,最上面一行、最下面一行),学习一个模型,然后使用一个云(最左边的部分)查询/测试模型。匹配的结果按从最好到最差的顺序从左到右从左下角开始。有关更多信息,请参见使用VFH描述符和/或[VFH]集群识别和6DOF位姿估计
在这里插入图片描述

理论基础

视点特征直方图(或VFH)起源于FPFH描述符(参见快速点特征直方图(FPFH)描述符)。由于其速度快、识别能力强,我们决定利用FPFH的强识别结果,在保持尺度不变的同时增加视点方差。
我们对目标识别和姿态识别问题的贡献是将整个对象集群的FPFH扩展到估计值(如下图所示),并计算视点方向和每一点估计的法线之间的额外统计量。为此,我们采用了将视点方向直接混合到FPFH中相对法线角计算中的关键思想。
在这里插入图片描述
视点分量是通过收集视点方向与每个法线形成的角度的直方图来计算的。注意,我们不是指每个法线的视角,因为这不是尺度不变的,而是指中心点方向到每个法线的角度。第二个分量测量快速点特征直方图(FPFH)描述符中描述的相对平移、倾斜和偏航角,但现在测量的是中心点的视点方向和表面上的每个法线之间的角度。
在这里插入图片描述
因此,新组合的特征称为视点特征直方图(VFH)。下图展示了这个想法,新特性由两部分组成:
1/一个视点方向分量
2/由扩展的FPFH组成的表面形状分量。
在这里插入图片描述

估计VFH特性

视图特征直方图在PCL中作为pcl_features库的一部分实现。
默认的VFH实现为三个扩展的FPFH值中的每一个使用45个binning子分区,为每个点到质心的距离再加上45个binning子分区,为视点组件使用128个binning子分区,这样就得到了一个308字节的浮点值数组。它们存储在pcl::VFHSignature308点类型中。
PFH/FPFH描述符与VFH之间的主要区别在于,对于给定的点云数据集,只估计一个VFH描述符,而生成的PFH/FPFH数据的条目数与云中点的个数相同。
下面的代码片段将为输入数据集中的所有点估计一组VFH特性。

#include <pcl/point_types.h>
#include <pcl/features/vfh.h>

{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal> ());

  ... read, pass in or create a point cloud with normals ...
  ... (note: you can create a single PointCloud<PointNormal> if you want) ...

  // 创建VFH估计类,并将输入数据集+法线传递给它
  pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> vfh;
  vfh.setInputCloud (cloud);
  vfh.setInputNormals (normals);
  // 或者,如果cloud类型为PointNormal,则执行vfh.setInputNormals(cloud);

  // 创建一个空的kdtree表示,并将其传递给FPFH估计对象。
  // 它的内容将根据给定的输入数据集填充到对象中(因为没有其他搜索表面)。
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
  vfh.setSearchMethod (tree);

  // 输出数据集
  pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs (new pcl::PointCloud<pcl::VFHSignature308> ());

  // 计算特征
  vfh.compute (*vfhs);

  // vfhs->points.size () 应该为 1
}

可视化VFH签名

libpcl_visualization包含一个特殊的PCLHistogramVisualization类,pcl_viewer也使用这个类自动将VFH描述符显示为浮点值的直方图。有关更多信息,请参见http://www.pointclouds.org/documentation/overview/visualiz.php。

注意
[VFH] (1, 2) http://www.willowgarage.com/sites/default/files/Rusu10IROS.pdf
@InProceedings{Rusu10IROS, author = {Radu Bogdan Rusu and Gary Bradski and Romain Thibaux and John Hsu}, title = {Fast 3D Recognition and Pose Using the Viewpoint Feature Histogram}, booktitle = {Proceedings of the 23rd IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)}, year = {2010}, address = {Taipei, Taiwan}, month = {October} }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
下面是一个使用PCL中VFH算法加汉明特征匹配的简单示例代码: ```cpp #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/features/vfh.h> #include <pcl/features/normal_3d.h> #include <pcl/registration/correspondence_estimation.h> #include <pcl/registration/correspondence_rejection_sample_consensus.h> #include <pcl/registration/transformation_estimation_svd.h> int main(int argc, char** argv) { // 加载云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source(new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("source.pcd", *cloud_source); pcl::io::loadPCDFile("target.pcd", *cloud_target); // 计算法向量 pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; ne.setInputCloud(cloud_source); pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>()); ne.setSearchMethod(tree); pcl::PointCloud<pcl::Normal>::Ptr normals_source(new pcl::PointCloud<pcl::Normal>); ne.setRadiusSearch(0.03); ne.compute(*normals_source); ne.setInputCloud(cloud_target); pcl::PointCloud<pcl::Normal>::Ptr normals_target(new pcl::PointCloud<pcl::Normal>); ne.compute(*normals_target); // 计算VFH描述子 pcl::VFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::VFHSignature308> vfh; vfh.setInputCloud(cloud_source); vfh.setInputNormals(normals_source); pcl::search::KdTree<pcl::PointXYZ>::Ptr vfhtree(new pcl::search::KdTree<pcl::PointXYZ>()); vfh.setSearchMethod(vfhtree); pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs_source(new pcl::PointCloud<pcl::VFHSignature308>); vfh.compute(*vfhs_source); vfh.setInputCloud(cloud_target); vfh.setInputNormals(normals_target); pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs_target(new pcl::PointCloud<pcl::VFHSignature308>); vfh.compute(*vfhs_target); // 计算VFH描述子的汉明距离 pcl::registration::CorrespondenceEstimation<pcl::VFHSignature308, pcl::VFHSignature308> est; est.setInputSource(vfhs_source); est.setInputTarget(vfhs_target); pcl::CorrespondencesPtr correspondences(new pcl::Correspondences()); est.determineCorrespondences(*correspondences); // 筛选和优化对应关系 pcl::registration::CorrespondenceRejectorSampleConsensus<pcl::PointXYZ> rejector; rejector.setInputSource(cloud_source); rejector.setInputTarget(cloud_target); rejector.setInlierThreshold(0.15); rejector.setMaximumIterations(10000); pcl::CorrespondencesPtr correspondences_filtered(new pcl::Correspondences()); rejector.getRemainingCorrespondences(*correspondences, *correspondences_filtered); // 计算变换矩阵 pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ> estimation; pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ>::Matrix4 transformation; estimation.estimateRigidTransformation(*cloud_source, *cloud_target, *correspondences_filtered, transformation); // 输出结果 std::cout << "Transformation matrix:" << std::endl; std::cout << transformation << std::endl; return 0; } ``` 该代码中,先加载了两个云数据,然后计算了每个的法向量和VFH描述子。接着,使用pcl::registration::CorrespondenceEstimation类计算云间的对应关系,并使用pcl::registration::CorrespondenceRejectorSampleConsensus类对对应关系进行筛选和优化,最后使用pcl::registration::TransformationEstimationSVD类计算云间的变换矩阵。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值