PCL中ROPS特征描述

点云库PCL学习教程 专栏收录该内容
51 篇文章 13 订阅

PCL中ROPS特征描述

一、相比于其他的特征描述,ROPS需要三个输入数据:
1.points: 输入点云
2.indices: RoPS特征点的标号(即关键点在点云中的下标)
3.triangles:三角面元

二、代码

#include <pcl/features/rops_estimation.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/histogram_visualizer.h>
#include<pcl/visualization/pcl_plotter.h>

int main()
{

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
	pcl::io::loadPCDFile("D:\\pcd\\phone_ch10.5\\points.pcd", *cloud);
	//计算RoPS特征的关键点的标号indices
	pcl::PointIndicesPtr indices = boost::shared_ptr <pcl::PointIndices>(new pcl::PointIndices());
	std::ifstream indices_file;
	indices_file.open("D:\\pcd\\phone_ch10.5\\indices.txt", std::ifstream::in);
	for (std::string line; std::getline(indices_file, line);)
	{
		std::istringstream in(line);
		unsigned int index = 0;
		in >> index;
		indices->indices.push_back(index - 1);
	}
	indices_file.close();
	//加载Mesh的面元信息
	std::vector <pcl::Vertices> triangles;
	std::ifstream triangles_file;
	triangles_file.open("D:\\pcd\\phone_ch10.5\\triangles.txt", std::ifstream::in);
	for (std::string line; std::getline(triangles_file, line);)
	{
		pcl::Vertices triangle;
		std::istringstream in(line);
		unsigned int vertex = 0;
		in >> vertex;
		triangle.vertices.push_back(vertex - 1);
		in >> vertex;
		triangle.vertices.push_back(vertex - 1);
		in >> vertex;
		triangle.vertices.push_back(vertex - 1);
		triangles.push_back(triangle);
	}
	//设置局部邻域大小支撑半径,数值越大包含表面信息越多,但受遮挡的影响也越大
	float support_radius = 0.0285f;
	//设置获得分布矩阵的投影平面划分单元格数
	unsigned int number_of_partition_bins = 5;
	//设置绕每个坐标轴的旋转次数
	unsigned int number_of_rotations = 3;
	//设置特征提取算法使用到的邻域搜索函数kd-tree
	pcl::search::KdTree<pcl::PointXYZ>::Ptr search_method(new pcl::search::KdTree<pcl::PointXYZ>);
	search_method->setInputCloud(cloud);
	//实例化ROPSEstimation类
	pcl::ROPSEstimation <pcl::PointXYZ, pcl::Histogram <135> > feature_estimator;
	feature_estimator.setSearchMethod(search_method);
	feature_estimator.setSearchSurface(cloud);
	feature_estimator.setInputCloud(cloud);
	feature_estimator.setIndices(indices);
	feature_estimator.setTriangles(triangles);
	feature_estimator.setRadiusSearch(support_radius);
	feature_estimator.setNumberOfPartitionBins(number_of_partition_bins);
	feature_estimator.setNumberOfRotations(number_of_rotations);
	feature_estimator.setSupportRadius(support_radius);
	//计算RoPS特征
	pcl::PointCloud<pcl::Histogram <135> >::Ptr histograms(new pcl::PointCloud <pcl::Histogram <135> >());
	feature_estimator.compute(*histograms);

	std::cout << histograms->header << endl;
	std::string title = "ROPS特征描述子";
	pcl::visualization::PCLPlotter *plotter = new pcl::visualization::PCLPlotter(title.c_str());//此处应该有个bug,通过构建函数传递的窗口名不起作用。
	plotter->setWindowName(title);//所以用该函数设置窗口名。
	plotter->setShowLegend(true);
	plotter->addFeatureHistogram<pcl::Histogram <135>>(*histograms, 135, "rops");
	plotter->spin();
	return 0;
}

三、显示
在这里插入图片描述

  • 1
    点赞
  • 5
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

CV-点云

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值