注:这个斯坦福兔子的ply文件,在之前有分享过
这里直接上代码,必要的注释都在代码里
#include<iostream>
#include<pcl/pcl_config.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include<pcl/filters/voxel_grid.h>
#include<pcl/common/common.h>
using namespace std;int main(int argc, char* argv) {// 读取带法线的点云pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);//std::string file_name = "C : \\Users\\Administrator\\Desktop\\pcl_learning\\点云库PCL从入门到精通\\第三章\\6\\source\\test.ply";std::string file_name = "C:\\Users\\Administrator\\Desktop\\pcl_learning\\001.ply";pcl::io::loadPLYFile<pcl::PointNormal>(file_name, *cloud_with_normals);cout << cloud_with_normals->points.size() << endl;//对点云对角线方向采样20个点的体素降采样,去掉没有值或者说xyz超极限约束的点//不去的话偶尔会算超限std::vector<int> indexs0;pcl::removeNaNFromPointCloud(*cloud_with_normals,*cloud_with_normals, indexs0);cout << cloud_with_normals->points.size() << endl;pcl::PointNormal min_p, max_p;pcl::getMinMax3D<pcl::PointNormal>(*cloud_with_normals,min_p,max_p);//求对角线长度float D = sqrt((max_p.z - min_p.z) * (max_p.z - min_p.z) + (max_p.x - min_p.x) * (max_p.x - min_p.x) + (max_p.y - min_p.y) * (max_p.y - min_p.y));cout << "对角长度是:" << D << endl;float leaf_size = D/ 20.0;cout << leaf_size << endl;pcl::VoxelGrid<pcl::PointNormal> v;pcl::PointCloud<pcl::PointNormal>::Ptr cloud_filter(new pcl::PointCloud<pcl::PointNormal>);v.setInputCloud(cloud_with_normals);v.setLeafSize(leaf_size, leaf_size, leaf_size);v.filter(*cloud_filter);cout << cloud_filter->points.size() << endl;// 创建可视化窗口pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("点云法线可视化"));viewer->setBackgroundColor(0, 0, 0); // 黑色背景viewer->addPointCloudNormals<pcl::PointNormal>(cloud_filter, 1, 2, "normals");// 可以设置法线颜色(RGB值范围0-1)viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0.5, 0, "normals"); // 红色法线// 启动可视化循环while (!viewer->wasStopped()) {viewer->spinOnce(100);}return 0;}