#include \n#include <pcl/io/ply_io.h>\n#include <pcl/point_types.h>\n#include <pcl/features/moment_of_inertia_estimation.h>\n#include <pcl/features/normal_3d.h>\n#include <pcl/filters/voxel_grid.h>\n\nint main(int argc, char** argv) {\n // 读取点云数据\n pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ);\n pcl::io::loadPLYFilepcl::PointXYZ("model.ply", *cloud);\n\n // 对点云进行体素下采样\n pcl::VoxelGridpcl::PointXYZ sor;\n sor.setInputCloud(cloud);\n sor.setLeafSize(0.01f, 0.01f, 0.01f);\n sor.filter(*cloud);\n\n // 计算点云法线\n pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;\n pcl::PointCloudpcl::Normal::Ptr normals(new pcl::PointCloudpcl::Normal);\n pcl::search::KdTreepcl::PointXYZ::Ptr tree(new pcl::search::KdTreepcl::PointXYZ);\n tree->setInputCloud(cloud);\n ne.setInputCloud(cloud);\n ne.setSearchMethod(tree);\n ne.setRadiusSearch(0.03);\n ne.compute(*normals);\n\n // 计算点云形状特征\n pcl::MomentOfInertiaEstimationpcl::PointXYZ feature_extractor;\n feature_extractor.setInputCloud(cloud);\n feature_extractor.setInputNormals(normals);\n feature_extractor.compute();\n\n // 圆度\n float circularity;\n feature_extractor.getCircularity(circularity);\n\n // 球形度\n float sphericity;\n feature_extractor.getSphericity(sphericity);\n\n // 内径比\n float aspect_ratio;\n feature_extractor.getAspectRatio(aspect_ratio);\n\n // 矩形度\n float rectangularity;\n feature_extractor.getRectangularity(rectangularity);\n\n // 棱角性\n float omnivariance;\n feature_extractor.getOmnivariance(omnivariance);\n\n // 等效Feret长短轴比\n float feret_diameter_ratio;\n feature_extractor.getFeretDiameterRatio(feret_diameter_ratio);\n\n // 等效椭圆长短轴比\n float eccentricity;\n feature_extractor.getEccentricity(eccentricity);\n\n // 等效Feret椭圆周长比\n float feret_eccentricity;\n feature_extractor.getFeretEccentricity(feret_eccentricity);\n\n // 外接矩形长短轴比\n float bounding_box_ratio;\n feature_extractor.getBoundingBoxRatio(bounding_box_ratio);\n\n // 形状因子\n float shape_factor;\n feature_extractor.getShapeFactor(shape_factor);\n\n // 凸度\n float convexity;\n feature_extractor.getConvexity(convexity);\n\n // 卡尺比\n float caliper_diameter_ratio;\n feature_extractor.getCaliperDiameterRatio(caliper_diameter_ratio);\n\n // 凸包比\n float hull_volume_ratio;\n feature_extractor.getHullVolumeRatio(hull_volume_ratio);\n\n // 输出结果\n std::cout << "Circularity: " << circularity << std::endl;\n std::cout << "Sphericity: " << sphericity << std::endl;\n std::cout << "Aspect Ratio: " << aspect_ratio << std::endl;\n std::cout << "Rectangularity: " << rectangularity << std::endl;\n std::cout << "Omnivariance: " << omnivariance << std::endl;\n std::cout << "Feret Diameter Ratio: " << feret_diameter_ratio << std::endl;\n std::cout << "Eccentricity: " << eccentricity << std::endl;\n std::cout << "Feret Eccentricity: " << feret_eccentricity << std::endl;\n std::cout << "Bounding Box Ratio: " << bounding_box_ratio << std::endl;\n std::cout << "Shape Factor: " << shape_factor << std::endl;\n std::cout << "Convexity: " << convexity << std::endl;\n std::cout << "Caliper Diameter Ratio: " << caliper_diameter_ratio << std::endl;\n std::cout << "Hull Volume Ratio: " << hull_volume_ratio << std::endl;\n\n return 0;\n}