#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;
}
PCL根据PCA特征进行几何形状分析
最新推荐文章于 2023-10-21 22:17:09 发布