PCL 计算点云的主曲率

曲率基础知识

点云中的曲率及计算

代码实现

#include <iostream>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/principal_curvatures.h>
using namespace std;

int main(int argc, char** argv){

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("A3  - Cloud.pcd", *cloud); //读取点云
	cout << "Loaded " << cloud->points.size() << " points." << endl;//显示读取点云的个数
	// 计算点云的法线
	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
	n.setInputCloud(cloud);
	//设置邻域点搜索方式
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
	n.setSearchMethod(tree);
	//设置KD树搜索半径
	// n.setRadiusSearch (0.03);
	n.setKSearch(10);
	//定义一个新的点云储存含有法线的值
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	//计算出来法线的值
	n.compute(*normals);
	// 建立主曲率计算
	pcl::PrincipalCurvaturesEstimation<pcl::PointXYZ, pcl::Normal, pcl::PrincipalCurvatures> p;
	// 提供原始点云(没有法线)
	p.setInputCloud(cloud);
	// 为点云提供法线
	p.setInputNormals(normals);
	// 使用与法线估算相同的KdTree
	p.setSearchMethod(tree);
	//p.setRadiusSearch(1.0);
	p.setKSearch(10);
	// 计算主曲率
	pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr pri(new pcl::PointCloud<pcl::PrincipalCurvatures>());
	p.compute(*pri);
	cout << "output points.size: " << pri->points.size() << endl;
	// 显示和检索第0点的主曲率。
	cout << "最大曲率;" << pri->points[0].pc1 << endl;//输出最大曲率
	cout << "最小曲率:" << pri->points[0].pc2 << endl;//输出最小曲率
	//输出主曲率方向(最大特征值对应的特征向量)
	cout << "主曲率方向;" << endl;
	cout << pri->points[0].principal_curvature_x << endl;
	cout << pri->points[0].principal_curvature_y << endl;
	cout << pri->points[0].principal_curvature_z << endl;

	return 0;
}

官网链接:pcl::PrincipalCurvaturesEstimation

猜你喜欢

转载自blog.csdn.net/qq_36686437/article/details/105488457