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;
}
热门推荐
离职管理:如何降低离职率和保留关键人才
如何通过专业方法紧固飞轮?这种紧固方法对机械性能有何影响?
门窗中空玻璃怎样选?三玻两腔是最佳选择吗?
劳动仲裁前领导污名化:企业应对员工维权重要案例
宁德时代大改革:五天八小时,员工喜忧参半
干货讲堂 | 变压器空载损耗、负载损耗以及阻抗电压的计算
李雪健昔日座驾:曾开切诺基拍《水浒传》,他的两辆车哪辆更经典?
青菜、杭白、生菜等本地叶菜纷纷跌破“一元大关”,沪蔬菜价格呈现季节性回落走势
疫苗生产工艺流程详解
药品质量保障与稳定性探究:科学化管理确保药品安全有效
企业税务风险管理的六大关键步骤
爱尔兰的国家发展战略重点是什么?
银行的信用卡取现手续费与第三方支付取现手续费的对比?
口腔溃疡用西地碘含片无效,换啥药好?
徐志摩诗《偶然》原文及赏析
磷酸氢钙的主要用途和生产方法
如何有效处理污水倒灌问题?这种处理方法有哪些实际效果?
维氏硬度计检测精度的影响因素
如何选择适用于不同材料的维氏硬度计
深入解读富氢水:未来健康饮水的趋势与挑战
四川首个博物馆AI数智人亮相金沙
寒湿痹阻型腰椎间盘突出临床表现有哪些
掌握心肺复苏:关键时刻能救命的急救技能
如何校准爱华多功能声级计以确保准确性
伯克希尔成为日元债最大海外发行商之一,巴菲特会再次推高日本股市么?
对精神分裂症病人可采取哪些心理治疗?
遗产房征收土地补偿全攻略
2025年如何用AI“拍”电影?我们扒了10部口碑佳作的幕后制作流程
古代战争中的军功记录与认定
从扭伤到恢复:脚踝伤害完全攻略