介绍:
CVFH是一种基于区域描述的特征点,也是基于VHF扩展的方法(VFH在物体局部遮挡的情况下识别效果并不好)。
输入格式:
(1)由一组定向点P组成的点云。定向意味着所有点都具有正常的法向量n。
(2)此功能不使用颜色信息。
工作原理:
(1)由于遮挡和传感器限制,我们使用传感器获取的是物体的2.5D点云数据,一旦缺失部分点云,计算整个点云的点和正常质心的结果可能完全不同。这就是为什么一旦点云中缺少必要点,VFH描述符也就会完全不同。
(2)CVFH创建稳定的集群区域。从点云P开始,新的簇Ci从尚未分配给任何簇的随机点Pr开始。如果Ci中存在点Pj,则P中的每个点Pi被分配给该簇,使得它们的法线类似并且它们处于直接邻域中(比较角度和距离阈值)。聚类簇群太少的集群被拒绝或忽略。
(3)计算每个群集上的VFH。
(4)为每个直方图添加形状分布,表示点如何围绕质心分布。
(5)有关特征计算的更多详细信息,请参阅原始论文:http://ieeexplore.ieee.org/xpl/articleDetails.jsp?numumber = 6130296
CVFH描述子的提取
提取CVFH描述子的过程与VFH差不多,具体可参考如下程序:
void calcuate_cvfh(const string name, pcl::PointCloud<pcl::VFHSignature308> &vfhs,float normal_r=0.6)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(name, *cloud) == -1)
{
PCL_ERROR("Cloudn't read file!");
return;
}
//估计法线
pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal> ne;
ne.setInputCloud(cloud);
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>);
ne.setRadiusSearch(normal_r);
//使用半径在查询点周围范围内的所有邻元素
ne.compute(*cloud_normals);
//CVFH
pcl::CVFHEstimation<pcl::PointXYZ,pcl::Normal, pcl::VFHSignature308> cvfh;
cvfh.setInputCloud(cloud);
cvfh.setInputNormals(cloud_normals);
//创建一个空的kd树表示法
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree1(new
pcl::search::KdTree<pcl::PointXYZ>);
cvfh.setSearchMethod(tree1);
//输出的数据集
//pcl::PointCloud<pcl::VFHSignature308>::Ptr vfhs(new pcl::PointCloud<pcl::VFHSignature308>());
//vfh.setRadiusSearch(15);
cvfh.compute(vfhs);
}
显示CVFH特征与可视化VFH特征的过程是差不多的,大概是这个代码(还没进行测试):
pcl::visualization::PCLPlotter plotter;
plotter.addFeatureHistogram<pcl::VFHSignature308>(cvfhs, "vfh", 0);
plotter.plot();//显示cvfh特征