当前位置: 首页 > news >正文

SLAM 将PCL点云转换成网格地图

PCL 3D点云没有表面信息,转换成网格地图之后可以构建出法线、纹理等信息。

先看一下输入的3D点云:

运行程序后会显示生成的网格地图,如下图所示:

看一下放大后的局部对比:

输入点云放大后每个点还是孤立的小方块。

输出的网格地图已经是一个平面了。

输入:map.pcd 3D点云地图

输出:没有保存输出结果

运行:编译后在cmd里才能运行,需要1个参数:输入的3D点云地图

示例:program.exe map.pcd

视频演示:https://www.bilibili.com/video/BV1RMdcBwEUC/

代码:

#include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/kdtree/kdtree_flann.h> #include <pcl/surface/surfel_smoothing.h> #include <pcl/surface/mls.h> #include <pcl/surface/gp3.h> #include <pcl/surface/impl/mls.hpp> // typedefs typedef pcl::PointXYZRGB PointT; typedef pcl::PointCloud<PointT> PointCloud; typedef pcl::PointCloud<PointT>::Ptr PointCloudPtr; typedef pcl::PointXYZRGBNormal SurfelT; typedef pcl::PointCloud<SurfelT> SurfelCloud; typedef pcl::PointCloud<SurfelT>::Ptr SurfelCloudPtr; SurfelCloudPtr reconstructSurface( const PointCloudPtr &input, float radius, int polynomial_order) { pcl::MovingLeastSquares<PointT, SurfelT> mls; pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>); mls.setSearchMethod(tree); mls.setSearchRadius(radius); mls.setComputeNormals(true); mls.setSqrGaussParam(radius * radius); mls.setPolynomialFit(polynomial_order > 1); mls.setPolynomialOrder(polynomial_order); mls.setInputCloud(input); SurfelCloudPtr output(new SurfelCloud); mls.process(*output); return (output); } pcl::PolygonMeshPtr triangulateMesh(const SurfelCloudPtr &surfels) { // Create search tree* pcl::search::KdTree<SurfelT>::Ptr tree(new pcl::search::KdTree<SurfelT>); tree->setInputCloud(surfels); // Initialize objects pcl::GreedyProjectionTriangulation<SurfelT> gp3; pcl::PolygonMeshPtr triangles(new pcl::PolygonMesh); // Set the maximum distance between connected points (maximum edge length) gp3.setSearchRadius(0.05); // Set typical values for the parameters gp3.setMu(2.5); gp3.setMaximumNearestNeighbors(100); gp3.setMaximumSurfaceAngle(M_PI / 4); // 45 degrees gp3.setMinimumAngle(M_PI / 18); // 10 degrees gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees gp3.setNormalConsistency(true); // Get result gp3.setInputCloud(surfels); gp3.setSearchMethod(tree); gp3.reconstruct(*triangles); return triangles; } int main(int argc, char **argv) { // Load the points PointCloudPtr cloud(new PointCloud); if (argc == 0 || pcl::io::loadPCDFile(argv[1], *cloud)) { cout << "failed to load point cloud!"; return 1; } cout << "point cloud loaded, points: " << cloud->points.size() << endl; // Compute surface elements cout << "computing normals ... " << endl; double mls_radius = 0.05, polynomial_order = 2; auto surfels = reconstructSurface(cloud, mls_radius, polynomial_order); // Compute a greedy surface triangulation cout << "computing mesh ... " << endl; pcl::PolygonMeshPtr mesh = triangulateMesh(surfels); cout << "display mesh ... " << endl; pcl::visualization::PCLVisualizer vis; vis.addPolylineFromPolygonMesh(*mesh, "mesh frame"); vis.addPolygonMesh(*mesh, "mesh"); vis.resetCamera(); vis.spin(); }

参考:高翔《视觉SLAM十四讲》P333页附近

http://www.jsqmd.com/news/1153740/

相关文章:

  • 终极指南:5分钟掌握Figma设计稿到多平台代码的智能转换
  • D3KeyHelper:暗黑破坏神3终极自动化工具,5分钟打造你的专属游戏助手
  • 虚拟文化体验翻译:虚拟导览系统的多语言交互与信息架构设计
  • 网盘直链下载助手完整教程:三步实现满速下载,告别客户端依赖
  • XUnity.AutoTranslator翻译失效:5步快速诊断与终极修复方案
  • LinkSwift网盘直链下载助手:告别限速!9大网盘高速下载完整解决方案
  • 洛雪音乐桌面版:打破平台壁垒的终极音乐聚合解决方案
  • 直播/录屏必看!采集卡和显卡到底有啥区别?搭配用法一次讲透✅
  • YOLO26涨点改进| CVPR 2026顶会| 独家卷积+Mamba改进篇| 引入AKCMamba-YOLO中的CAKCMamba模块,助力小目标检测、遥感目标检测、图像分类、图像分割任务,高效涨点
  • AI智能体工作流实战:从代码生成到项目级工程执行
  • AI高考数学解题实战:从宕机到可靠,构建LLM+SymPy协同系统
  • 革命性ARM设备重生方案:Amlogic-S9xxx-Armbian技术架构深度解析
  • 【Autosar从入门到精通到进阶实战篇】18 CANopen网络设计与拓扑优化:从单总线到多网关级联
  • GitHub 热门项目报告(2026.7.1~2026.7.8)
  • 3步解锁网易云音乐:ncmdump一站式解密工具让NCM格式不再受限
  • 西门子的这张“知识大网“,正在悄悄改变企业AI的底层逻辑
  • 蓝牙5.4 LE Audio硬件设计与协议栈优化实践
  • 3分钟破解音乐枷锁:ncmdump如何让你真正拥有自己的音乐收藏?
  • 学术写作效率突破!2026全流程AI写作辅助软件深度解析
  • 086、损失函数设计指南:从L1到感知损失,如何选择与组合超分损失
  • 3步解锁美的智能家电局域网控制:告别云端依赖,重获掌控权
  • 173、breakpoint() 不止是断点:PYTHONBREAKPOINT 环境变量与自定义调试入口
  • ThreadPoolExecutor参数解析
  • D3KeyHelper完全指南:5分钟打造你的暗黑3专属按键助手
  • 暗黑3自动按键助手:5分钟告别手指疲劳,游戏效率提升200%
  • 技术 Leader:“你根本不会用 Codex 和 Claude Code,也不懂 Vibe Coding!”,我:“用你教我?”
  • AcFunDown:轻松下载A站视频的终极指南
  • 锂离子电池过压保护与BQ29200硬件设计实践
  • Fast-GitHub:国内开发者必备的GitHub下载加速插件
  • 如何通过AcFunDown实现A站视频一站式智能下载管理