本文为参考【计算机视觉life】公众号的系列文章:从零开始一起学习SLAM | 点云到网格的进化,实现的点云网格化过程。

网格化流程

  1. 下采样+统计滤波
    通过下采样减少点云数据容量、提高处理速度;使用统计分析技术,去除点云数据集中的噪声、离群点;

滤波前后对比
  1. 重采样,平滑处理
    通过重采样对物体表面进行平滑处理和漏洞修复

点云平滑前后
  1. 计算点云表面法线
    计算点云法线,并将点云位姿、颜色、法线信息合并到一起,构建有向点云。

点云表面法线
  1. 网格化
    使用贪心投影三角化算法对有向点云进行三角化,实现稀疏点云的网格化。

点云网格化示例

代码

/***************************** 给定稠密的点云,进行如下操作:*        下采样和滤波、重采样平滑、法线计算,贪心投影网格化。
****************************/
#include <pcl/point_types.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/surface/mls.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/surface/poisson.h>
typedef pcl::PointXYZ PointT;int main(int argc, char** argv)
{// Load input filepcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);pcl::PointCloud<PointT>::Ptr cloud_downSampled(new pcl::PointCloud<PointT>);pcl::PointCloud<PointT>::Ptr cloud_filtered(new pcl::PointCloud<PointT>);pcl::PointCloud<PointT>::Ptr cloud_smoothed(new pcl::PointCloud<PointT>);if (pcl::io::loadPCDFile("fusedCloud.pcd", *cloud) == -1){cout << "could not load the file..." << endl;}std::cout << "Orginal points number: " << cloud->points.size() << std::endl;// 1.下采样,同时保持点云形状特征pcl::VoxelGrid<PointT> downSampled;               // 下采样对象downSampled.setInputCloud(cloud);downSampled.setLeafSize(0.01f, 0.01f, 0.01f);  // 栅格叶的尺寸downSampled.filter(*cloud_downSampled);// 2.统计滤波pcl::StatisticalOutlierRemoval<PointT> sor;      // 滤波对象sor.setInputCloud(cloud_downSampled);sor.setMeanK(50);sor.setStddevMulThresh(1.0);                   // 设置判定为离群点的阈值sor.filter(*cloud_filtered);// 3.对点云重采样,进行平滑pcl::search::KdTree<PointT>::Ptr treeSampling(new pcl::search::KdTree<PointT>); // 创建用于最近邻搜索的KD-Treepcl::MovingLeastSquares<PointT, PointT> mls;    // 定义最小二乘实现的对象mlsmls.setComputeNormals(false);                  // 设置在最小二乘计算中是否需要存储计算的法线mls.setInputCloud(cloud_filtered);              // 设置待处理点云mls.setPolynomialOrder(2);                        // 拟合2阶多项式拟合mls.setPolynomialFit(false);                    // 设置为false可以 加速 smoothmls.setSearchMethod(treeSampling);               // 设置KD-Tree作为搜索方法mls.setSearchRadius(0.05);                        // 单位m.设置用于拟合的K近邻半径mls.process(*cloud_smoothed);                    // 输出// 4.法线估计pcl::NormalEstimation<PointT, pcl::Normal> normalEstimation;                    // 创建法线估计的对象normalEstimation.setInputCloud(cloud_smoothed);                                 // 输入点云pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);         // 创建用于最近邻搜索的KD-TreenormalEstimation.setSearchMethod(tree);pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);    // 定义输出的点云法线// K近邻确定方法,使用k个最近点,或者确定一个以r为半径的圆内的点集来确定都可以,两者选1即可normalEstimation.setKSearch(10);                    // 使用当前点周围最近的10个点                                                       //normalEstimation.setRadiusSearch(0.03);           // 对于每一个点都用半径为3cm的近邻搜索方式normalEstimation.compute(*normals);                 // 计算法线// 5.将点云位姿、颜色、法线信息连接到一起pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);pcl::concatenateFields(*cloud_smoothed, *normals, *cloud_with_normals);// 6.贪心投影三角化//定义搜索树对象pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);tree2->setInputCloud(cloud_with_normals);// 三角化pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;   // 定义三角化对象pcl::PolygonMesh triangles;                                    // 存储最终三角化的网络模型// 设置三角化参数gp3.setSearchRadius(0.1);              // 设置搜索时的半径,也就是KNN的球半径gp3.setMu(2.5);                            // 设置样本点搜索其近邻点的最远距离为2.5倍(典型值2.5-3),这样使得算法自适应点云密度的变化gp3.setMaximumNearestNeighbors(100);    // 设置样本点最多可搜索的邻域个数,典型值是50-100gp3.setMinimumAngle(M_PI / 18);         // 设置三角化后得到的三角形内角的最小的角度为10°gp3.setMaximumAngle(2 * M_PI / 3);       // 设置三角化后得到的三角形内角的最大角度为120°gp3.setMaximumSurfaceAngle(M_PI / 4);    // 设置某点法线方向偏离样本点法线的最大角度45°,如果超过,连接时不考虑该点gp3.setNormalConsistency(false);      // 设置该参数为true保证法线朝向一致,设置为false的话不会进行法线一致性检查gp3.setInputCloud(cloud_with_normals);  // 设置输入点云为有向点云gp3.setSearchMethod(tree2);             // 设置搜索方式gp3.reconstruct(triangles);                // 重建提取三角化// 7.显示网格化结果boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);       // 设置背景 viewer->addPolygonMesh(triangles, "mesh");  // 网格化点云添加到视窗while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}return 1;
}

结果

  • 备注:
    所需点云源文件【公众号提供】:h?ttps://pan?.baidu.com/s/1avSGdi4IG3ry3wNCI_jDLQ 提?取?码:cxjy(删除"?"即可访问)

点云的网格化【Win10+VS2015】相关推荐

  1. 【PCL点云库】Win10+VS2015+PCL1.8.1配置

    最近需要用到点云库,所以需要配置PCL,看了网上写的一些教程,写的都还可以,但是都有一些问题,所以本人在参考其他博主教程的基础上加以改进尽量将配置过程讲的仔细一点,本人也是从小白过来的,所以理解万岁, ...

  2. 服务器搭建虚拟win云服务,云服务器创建win10虚拟机

    云服务器创建win10虚拟机 内容精选 换一换 弹性云服务器(Elastic Cloud Server,以下简称ECS)是由CPU.内存.镜像.云硬盘组成的一种可随时获取.弹性可扩展的计算服务器,同时 ...

  3. Win10+VS2015+EF6.0+MySQL5.6+MVC环境部署和排错

    Win10+VS2015+EF6.0+MySQL5.6+MVC环境部署和排错 本来已经好几个月不弄专业了,今天一哥们问我问题的时候重新捣鼓了一下,就做个文档供后来人参考吧~ 1.首先安装MySQL 5 ...

  4. PCL【Win10+VS2015+PCL_1.8.0环境配置】

    PCL[Win10+VS2015+PCL_1.8.0环境配置] 一.安装 1.下载地址 PCL下载地址1 2.安装过程 (1)安装下载下的PCL 1.8.0 All-in-one Installer ...

  5. WIN10+VS2015部署PanddleOCR

    一.环境 WIN10 VS2015 (1)下载panddleOCR项目和模型 下载地址:https://github.com/PaddlePaddle/PaddleOCR 我下载的是2.0版本的 该页 ...

  6. opencv2.4.13在win10+VS2015下的配置过程

    opencv2.4.13在win10+VS2015下的配置过程 参考https://blog.csdn.net/shanghairuoxiao/article/details/69391229一个是本 ...

  7. 服务器装win10系统文档,云服务器 安装win10

    云服务器 安装win10 内容精选 换一换 使用弹性云服务器或者外部镜像文件创建私有镜像时,必须确保操作系统中已安装UVP VMTools,使新发放的云服务器支持KVM虚拟化,同时也可以提升云服务器的 ...

  8. win10+vs2015+pcl1.8.1安装配置

    win10+vs2015+pcl1.8.1安装配置过程: 1.下载pcl1.8.1,网址:http://unanancyowen.com/en/pcl181 界面如下图, 选择下载下面两个即可. 2. ...

  9. Seetaface 03 Seetaface python版 win10 vs2015编译

    01 环境 win10x64 vs2015 update3 cmake3.7.2 git 源码:https://github.com/5455945/SeetaFaceEngine.git 如果要测试 ...

最新文章

  1. angularjs 让当前路由重新加载_Vuerouter(路由)
  2. Java学习之字符串
  3. 基于MATLAB的Okumura-Hata模型的仿真
  4. Python只需要三十行代码,打造一款简单的人工语音对话
  5. java常见笔试_Java 常见笔试题(2)
  6. openstack-networking-neutron(一)---端到端和点到点的理解
  7. Web前端开发笔记——第三章 CSS语言 第七节 圆角边框、阴影
  8. 【机器学习】传统目标检测算法总结
  9. .net中前台javascript与后台c#函数相互调用
  10. 解决北京户口,中科院计算所校招,CV/图像处理工程师,博士优先
  11. java解析excel生成sql文件
  12. Sparse Principal Component Analysis
  13. 怎么把ppt文字大小设置一致_其实,90%的大学生根本不会做PPT
  14. ALS算法介绍(协同过滤算法介绍)
  15. chrome浏览器91版本,Chrome中跨域请求无法携带Cookie的解决方案
  16. 阿里云轻量应用服务器(香港)2020测评
  17. 封装一个常用的js工具类
  18. 通过JS定义一个Iframe
  19. qbo 点云数据(距离)的获取
  20. linux编辑文本到最后一行,linux编辑文本(vim)时跳转到最后一行和第一行及相关指令...

热门文章

  1. 迅雷看看与RealMedia codec
  2. Sprite Kit -- Sprite
  3. excel图表制作:旋风图让数据对比更直观
  4. appserv 64位 php5.6,AppServ
  5. 被讨厌的勇气:介绍及内容导航
  6. 1月1日服务器例行维护公告,11月1日剑网3服务器例行维护公告
  7. 蓝牙文件传输+obex+xp
  8. gradle-7.1.1-all 百度网盘下载
  9. 软考考前20问丨带你学透「软设」重难点(1)
  10. 孔乙己堪比娱乐圈的顶流,鲁迅也很吃惊