PCL点云重建源代码详解:从去噪到重建的完整流程
创作时间:
作者:
@小白创作中心
PCL点云重建源代码详解:从去噪到重建的完整流程
引用
CSDN
1.
https://m.blog.csdn.net/mfc5158/article/details/145856929
本文将介绍如何使用PCL(Point Cloud Library)库实现点云的去噪滤波、平滑、采样和重建。通过本示例,读者可以学习到完整的点云处理流程,包括数据读取、预处理、平滑处理、法线估计、三角化重建等关键步骤。
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/surface/mls.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
typedef pcl::PointNormal NormalT;
typedef pcl::PointCloud<NormalT> PointCloudWithNormals;
int main(int argc, char** argv) {
// 1. 读取点云数据
PointCloudT::Ptr cloud(new PointCloudT);
if (pcl::io::loadPLYFile<PointT>("path_to_your_pointcloud.ply", *cloud) == -1) {
std::cerr << "Error loading point cloud" << std::endl;
return -1;
}
// 2. 预处理 - 去噪
pcl::StatisticalOutlierRemoval<PointT> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50); // 考虑邻近50个点
sor.setStddevMulThresh(1.0); // 标准差倍数阈值
sor.filter(*cloud);
// 3. 下采样
pcl::VoxelGrid<PointT> voxel;
voxel.setInputCloud(cloud);
voxel.setLeafSize(0.5f, 0.5f, 0.5f); // 根据点云密度调整
voxel.filter(*cloud);
// 4. 平滑处理 (移动最小二乘法)
pcl::MovingLeastSquares<PointT, NormalT> mls;
pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
mls.setInputCloud(cloud);
mls.setSearchMethod(tree);
mls.setSearchRadius(2.0); // 根据点间距调整
mls.setComputeNormals(true);
PointCloudWithNormals::Ptr cloud_smoothed(new PointCloudWithNormals);
mls.process(*cloud_smoothed);
// 5. 法线估计(如果MLS未计算)
pcl::NormalEstimation<PointT, NormalT> ne;
ne.setInputCloud(cloud);
ne.setSearchMethod(tree);
ne.setRadiusSearch(2.0); // 与MLS半径一致
ne.compute(*cloud_smoothed);
// 6. 贪心投影三角化(适合开放边缘)
pcl::GreedyProjectionTriangulation<NormalT> gp3;
pcl::PolygonMesh triangles;
// 设置重建参数
gp3.setSearchRadius(3.0); // 搜索半径(点间距的3-5倍)
gp3.setMu(2.5); // 最大允许距离乘数
gp3.setMaximumNearestNeighbors(100); // 最大邻近点数
gp3.setMaximumSurfaceAngle(M_PI / 2); // 45度
gp3.setMinimumAngle(M_PI / 18); // 10度
gp3.setMaximumAngle(2 * M_PI / 3); // 120度
gp3.setNormalConsistency(true); // 保持法线一致性
gp3.setInputCloud(cloud_smoothed);
gp3.reconstruct(triangles);
// 7. 后处理 - 网格平滑
//pcl::MeshSmoothingLaplacianVTK smoother;
//smoother.setInputMesh(triangles);
//smoother.setNumIterations(50); // 平滑迭代次数
//smoother.process(triangles);
// 8. 保存结果
pcl::io::savePLYFile("output_mesh.ply", triangles);
// 可视化 (可选)
pcl::visualization::PCLVisualizer viewer("Mesh Viewer");
viewer.addPolygonMesh(triangles, "mesh");
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
return 0;
}
热门推荐
受益人的指定与变更:重要流程与注意事项
城中村改造按下“加速键”
正红花油的正确使用方法是什么
缓刑与假释:条件和区别全面解析
如何制作招财符并增加财运,DIY画的招财符方法分享!
免费查询个人征信的方法有哪些?
个人征信查询哪个渠道最快
教科书因辽宁三次“修改”
利率的期限结构是什么?它如何影响金融市场的运作?
镜柜安装高度尺寸一般多少,镜柜安装注意事项
这一届春招,年轻人都怕BOSS直拒
碳酸氢钠片:用途、副作用与使用须知
GTA5车辆原型揭秘:从柯尼塞格到法拉利F80概念款
橘红茶的制作方法和配料:橘红茶怎么做?
王者荣耀S24赛季结束时间揭晓:赛季末冲刺与奖励领取指南
芭乐热量高吗 减肥可以吃吗
《博德之门3》邪术师升级内容介绍 邪术师升级解锁内容详情
《变法与党争》:解析大明王朝从繁荣到崩溃的历史宿命
生育保险报销流程全解析:从材料准备到待遇领取
长图切割技巧:使用软件、在线工具及编程轻松搞定
从干酵母到鲜酵母:自制鲜酵母的完整教程
滤毒盒防护型号分类 如何选择合适的滤毒盒
如何正确佩戴防毒面具
笛卡尔方法论:重塑思维,独立思考的四大步骤
中医临床研究
浙大邵烨程、王宏涛等:基于学习的四足机器人通用技能控制方法
首例"个人破产"案:负债214万,只还3.2万,信用3年后恢复
践行雷锋精神,这所高校师生一直在行动
孕妇吃6只螃蟹后流产?医生:别超这个数量
如何在Windows 11上解决游戏频繁闪退的问题?