PCL根据PCA特征进行几何形状分析

#include <QtCore/QCoreApplication>
//这头文件直接全垒上来算了,省的麻烦

#include <iostream>							//标准C++库中的输入输出
#include <pcl/io/pcd_io.h>					//PCD文件的读写
#include <pcl/point_types.h>				//点类型定义
#include <pcl/point_cloud.h>				//点云类定义
#include <pcl/kdtree/kdtree_flann.h>		//KD-Tree搜索


/*common模块*/
#include <pcl/common/common.h>				//标准的C以及C++类,是其他common 函数的父类;getMinMax3D()函数所需头文件,获得点云三维坐标的最值
#include <pcl/common/angles.h>				//定义了标准的C接口的角度计算函数
#include <pcl/common/centroid.h>			//定义了中心点的估算以及协方差矩阵的计算
#include <pcl/common/distances.h>			//定义标准的C接口用于计算距离
#include <pcl/common/file_io.h>				//定义了一些文件帮助写或者读方面的功能。
#include <pcl/common/random.h>				//定义一些随机点云生成的函数
#include <pcl/common/geometry.h>			//定义一些基本的几何功能的函数
#include <pcl/common/intersections.h>		//定义了线与线相交的函数
#include <pcl/common/norms.h>				//定义了标准的C方法计算矩阵的正则化
#include <pcl/common/time.h>				//定义了时间计算的函数


/*surface模块*/
#include <pcl/surface/mls.h>				//最小二乘平滑处理
#include <pcl/surface/concave_hull.h>		//创建凹多边形
#include <pcl/surface/gp3.h>				//贪婪投影三角化算法
#include <pcl/surface/organized_fast_mesh.h>

/*feature模块*/
#include <pcl/features/normal_3d.h>			//法线特征估计
#include <pcl/features/normal_3d_omp.h>		//法线特征估计加速
#include <pcl/features/pfh.h>				//PFH特征估计
#include <pcl/features/fpfh.h>				//FPFH特征估计
#include <pcl/features/fpfh_omp.h>			//FPFH特征估计加速
#include <pcl/features/vfh.h>				//VFH特征估计
#include <pcl/features/narf.h>				//NARF特征估计
#include <pcl/features/boundary.h>			//边界提取
#include <pcl/features/integral_image_normal.h>

/*registration模块*/
#include <pcl/registration/icp.h>			//ICP配准
#include <pcl/registration/icp_nl.h>		//非线性ICP配准
#include <pcl/registration/ndt.h>			//NDT配准
#include <pcl/registration/transforms.h>	//变换矩阵
#include <pcl/registration/ia_ransac.h>		//sac-ia类头文件
#include <pcl/registration/correspondence_estimation.h>					//直方图配准
#include <pcl/registration/correspondence_rejection_features.h>			//特征的错误对应关系去除
#include <pcl/registration/correspondence_rejection_sample_consensus.h>	//随机采样一致性去除 

/*filters模块*/
#include <pcl/filters/filter.h>				//滤波相关头文件
#include <pcl/filters/passthrough.h>		//滤波相关类头文件
#include <pcl/filters/project_inliers.h>	//滤波相关类头文件,点云投影
#include <pcl/filters/extract_indices.h>	//索引提取
#include <pcl/filters/voxel_grid.h>			//基于体素网格化的滤波
#include <pcl/filters/approximate_voxel_grid.h>			//体素网格过滤器滤波
#include <pcl/filters/statistical_outlier_removal.h>	//统计离群点

/*segmentation模块*/
#include <pcl/ModelCoefficients.h>						//采样一致性模型
#include <pcl/sample_consensus/method_types.h>			//随机参数估计方法
#include <pcl/sample_consensus/model_types.h>			//模型定义
#include <pcl/segmentation/sac_segmentation.h>			//基于采样一致性分割
#include <pcl/segmentation/region_growing.h>			//区域生长头文件
#include <pcl/segmentation/region_growing_rgb.h>		//基于颜色的区域生长
#include <pcl/segmentation/supervoxel_clustering.h>		//超体聚类
#include <pcl/segmentation/lccp_segmentation.h>			//基于凹凸性分割

/*visualization模块*/
#include <pcl/visualization/cloud_viewer.h>				//CloudViewer类可视化
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>

/*range_image模块*/
#include <pcl/range_image/range_image.h>		//深度图像相关
#include <pcl/range_image/range_image_planar.h>

/*Eigen模块*/
#include <Eigen/StdVector>
#include <Eigen/Geometry>

/*console模块*/
#include <pcl/console/print.h>
#include <pcl/console/time.h>
#include <pcl/console/parse.h>


#include <pcl/io/io.h>	//IO相关头文件
#include <boost/make_shared.hpp>			//boost指针相关头文件
#include <pcl/point_representation.h>		//点表示相关头文件
#include <pcl/io/openni2_grabber.h>	//OpenNI数据流获取类相关头文件

//这里有重复的自己删一删把
#include <pcl/ModelCoefficients.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>
#include<pcl/visualization/pcl_visualizer.h>
#include <stdlib.h>
#include <time.h>

#include <iostream>
#include <pcl/console/parse.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/features/boundary.h>
#include <math.h>
#include <boost/make_shared.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>

#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/features/normal_3d.h>

#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/covariance_sampling.h>
#include <pcl/filters/normal_space.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/boundary.h>


#include <pcl/io/ply_io.h>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree_pointcloud_changedetector.h>
#include <vector>
#include <ctime>
#include <pcl/point_types.h>


#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <vector>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/crop_hull.h>
#include <pcl/surface/concave_hull.h>


using namespace std;
using namespace Eigen;

void pca(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud, Vector3f& values, Matrix3f& vectors)
{
	//函数功能:计算点云的局部邻域特征,PCA主成分分析法
	//计算点云整体中心和构建协方差矩阵
	Eigen::Vector4f zx;//中心
	pcl::compute3DCentroid(*cloud, zx); //xyz1
	Eigen::Matrix3f xiefancha;
	pcl::computeCovarianceMatrixNormalized(*cloud, zx, xiefancha);//计算归一化协方差矩阵
	//计算特征值和特征向量
	Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> solve(xiefancha, ComputeEigenvectors);
	values = solve.eigenvalues();//特征值
	vectors = solve.eigenvectors();//特征向量
}

int main(int argc, char** argv)
{
	//输入点云
	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);
	pcl::PCDReader reader;
	reader.read("D:\\shuju\\1.pcd", *cloud);

	//开始计算
	Vector3f values;
	Matrix3f vectors;
	pca(cloud, values, vectors);

	//输出结果
	cout << "特征值如下:" << endl;
	cout << values << endl;//输出特征值
	cout << "特征向量如下:" << endl;
	cout << vectors << endl;//输出特征向量


	//在局部点云特征值已知的情况下, 可用进一步的获取点云的几何形状特征,计算方法如下:
    // 拉姆达1=values[2];拉姆达2=values[1];拉姆达3=values[0];
	cout<< "特征值从大到小排列" << values[2]  << values[1]  << values[0] << endl;

	double a1 = (sqrt(values[2]) - sqrt(values[1])) / sqrt(values[2]);
	double a2 = (sqrt(values[1]) - sqrt(values[0])) / sqrt(values[2]);
	double a3 = sqrt(values[0]) / sqrt(values[2]);

	if ((a1 > a2) && (a1 > a3))//a1最大
	{
		cout << " 点云几何形状为:杆状     " << endl;
	}
	if ((a2 > a1) && (a2 > a3))//a2最大
	{
		cout << " 点云几何形状为:面状     " << endl;
	}
	if ((a3 > a2) && (a3 > a1))
	{
		cout << " 点云几何形状为:球状  (发散状)     " << endl;
	}


	system("pause");
	return 0;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值