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;
}
热门推荐
艺名可以用真名吗?艺名和原名可以出现在身份证上吗?
象形字的演变:从新石器时代到现代的传承与创新
专家解读:中药能否改善近视和散光?
防控近视,先辨真假!中医教你4大护眼穴
总投资24.59亿元,上海迪士尼度假区新项目渐露端倪
河北保定:科学认识眼底病变的信号
如何理解公募基金中的FOF策略?这种策略如何影响投资组合的多样性?
《哪吒2》神话新篇,情感与视觉的双重盛宴
五蕴皆空的智慧:佛法观点下的解脱之道
睫角守宫养护全攻略:新手也能轻松上手!
医生解答:过期食品到底能不能吃?
强烈建议所有女性,体检时一定要做这4项检查
视听语言中的色相及其作用
档案补办流程详解,补办材料一览
中专毕业之后,人事档案如何查询与补办?
DDoS防御手段有哪些?
如何防止web恶意大量访问攻击
德天瀑布旅游攻略:德天瀑布在哪里好玩?景点攻略自由行一日游指南
崩坏星穹铁道银河幸运星活动玩法介绍
学校组织召开东北抗联革命文物调查、保护与研究学术研讨会
如何安全服用精神疾病药物?|心理科普手册
万科巨变与房地产行业的时代转折:从市场化标杆到国资主导的逻辑与启示
被“人为制造”的9类消费,看完后我悟了:都是没必要花的冤枉钱
学会辨认过期食品安全
可以在高海拔种植的豆科牧草
拉马努金:只活了32岁的数学天才,靠直觉发现4000多个公式
平潭岛,藏在山海间的梦幻宝藏
平潭 | 点赞!超绝拍照打卡点,去了就不想走!
如何选择合适的柜门把手?这些把手的材质有哪些差异?
自然写作是什么?解开自然写作的神秘面纱:流畅表达,直抵人心!