PCL贪婪投影三角化算法
贪婪投影三角化算法是一种对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复。
方法:
(1)将三维点通过法线投影到某一平面
(2)对投影得到的点云作平面内的三角化
(3)根据平面内三位点的拓扑连接关系获得一个三角网格曲面模型
在平面区域的三角化过程中用到了基于Delaunay的空间区域增长算法,该方法通过选取一个样本三角片作为初始曲面,不断扩张曲面边界,最后形成一张完整的三角网格曲面,最后根据投影点云的连接关系确定各原始三维点间的拓扑连接,所得的三角网格即为重建得到的曲面模型。
该算法适用于采样点云来自表面连续光滑的曲面且点云的密度变化比较均匀的情况
pcl1.8.1+vs2015
#include<iostream>
#include<pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include<pcl/point_types.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/obj_io.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h> int main(int argc, char** argv) {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PCLPointCloud2 cloud_blob;
//*打开点云文件
if (pcl::io::loadPCDFile("rabbit.pcd", cloud_blob) == -1) {
PCL_ERROR("Couldn't read file rabbit.pcd\n");
return(-1);
}
pcl::fromPCLPointCloud2(cloud_blob, *cloud); //法线估计对象
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
//存储估计的法线
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
//定义kd树指针
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud);
n.setInputCloud(cloud);
n.setSearchMethod(tree);
n.setKSearch(20);
//估计法线存储到其中
n.compute(*normals);//Concatenate the XYZ and normal fields*
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_width_normals(new pcl::PointCloud<pcl::PointNormal>);
//链接字段
pcl::concatenateFields(*cloud, *normals, *cloud_width_normals); //定义搜索树对象
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
//点云构建搜索树
tree2->setInputCloud(cloud_width_normals); //定义三角化对象
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
//存储最终三角化的网络模型
pcl::PolygonMesh triangles;//设置连接点之间的最大距离,(即是三角形最大边长)
gp3.setSearchRadius(200.0f);
//设置各种参数值
gp3.setMu(2.5f);
gp3.setMaximumNearestNeighbors(100);
gp3.setMaximumSurfaceAngle(M_PI_4);
gp3.setMinimumAngle(M_PI / 18);
gp3.setMaximumAngle(2 * M_PI / 3);
gp3.setNormalConsistency(false); //设置搜索方法和输入点云
gp3.setInputCloud(cloud_width_normals);
gp3.setSearchMethod(tree2); //执行重构,结果保存在triangles中
gp3.reconstruct(triangles); //保存网格图
//pcl::io::saveOBJFile("result.obj", triangles);
std::string output_dir = "E:/C/cloud_mesh.ply";
std::string sav = "saved mesh in:";
sav += output_dir;
pcl::console::print_info(sav.c_str());
std::cout << std::endl; pcl::io::savePLYFileBinary(output_dir.c_str(), triangles); // 显示结果图
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("MAP3D MESH"));
////设置背景;
viewer->setBackgroundColor(0, 0, 0);
//设置显示的网格
viewer->addPolygonMesh(triangles, "my");
//viewer->initCameraParameters();
while (!viewer->wasStopped()) {
viewer->spin();
}
std::cout << "success" << std::endl;
return 0;
}
运行结果
说明:
需要处理的数据比较多,因此需要耐心等一会
三角化后的文件保存在 E:/C/cloud_mesh.ply,用compareCloud打开
PCL贪婪投影三角化算法的更多相关文章
- Delaunay三角化算法
参考:<平面域中的Delaunay三角算法>
- 用canvas 实现个图片三角化(LOW POLY)效果
之前无意中看到Ovilia 用threejs做了个LOW POLY,也就是图片平面三角化的效果,觉得很惊艳,然后就自己花了点时间尝试了一下. 我是没怎么用过threejs,所以就直接用canvas的2 ...
- 三角化---深度滤波器---单目稠密重建(高翔slam---十三讲)
一.三角化 [1]三角化得到空间点的三维信息(深度值) (1)三角化的提出 三角化最早由高斯提出,并应用于测量学中.简单来讲就是:在不同的位置观测同一个三维点P(x, y, z),已知在不同位置处观察 ...
- 多视几何——三角化求解3D空间点坐标
VINS-Mono / VINS-Fusion中triangulatePoint()函数通过三角化求解空间点坐标,代码所体现的数学描述不是很直观,查找资料,发现参考文献[1]对这个问题进行详细解释,记 ...
- FPGA加三移位算法:硬件逻辑实现二进制转BCD码
本文设计方式采用明德扬至简设计法.利用FPGA来完成显示功能不是个很理想的方式,当显示任务比较复杂,要通过各种算法显示波形或者特定图形时,当然要用单片机通过C语言完成这类流程控制复杂,又对时序要求不高 ...
- 三目算法、if/else,switch/case运用
//输入学生的成绩,判断考试是否及格,及格6大于等于0 //第一种写法:三目运算 大多用于单独判断是否满足某个条件 import java.util.Scanner; public class Hel ...
- [CGAL]带岛多边形三角化
CGAL带岛多边形三角化,并输出(*.ply)格式的模型 模型输出的关键是节点和索引 #include <CGAL/Triangulation_vertex_base_with_id_2.h&g ...
- K:找寻数组中第n大的数组元素的三个算法
相关介绍: 给定一个数组,找出该数组中第n大的元素的值.其中,1<=n<=length.例如,给定一个数组A={2,3,6,5,7,9,8,1,4},当n=1时,返回9.解决该问题的算法 ...
- Schur 三角化定理的推论
将学习到什么 从 Schur 的酉三角化定理可以收获一批结果,在这一部分介绍重要的几个. 迹与行列式 相似矩阵具有相同的特征多项式, 从特征多项式一节中, 我们又知道,相似矩阵的迹以及行列式都是相 ...
随机推荐
- AspxGridView行为:分页、分组、排序、过滤、锁定列
HTML页面 <dx:ASPxGridView ID="grvList" Width="100%" runat="server" Au ...
- 7、Python变量流程基础(变量、赋值、格式化、运算符、流程控制、range()函数)
一.执行Python程序的两种方式 1.交互式 在终端内输入“python3”,然后输入python代码 2.命令行式 在终端内输入“python3 文本文件路径” 二.变量 1.变量的组成 Pyth ...
- 15 分钟学会使用 Git 和远程代码库
Git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...
- TypeScript语言学习笔记(4)枚举
枚举 // 数值型枚举 enum Direction { Up = 1, Down, Left, Right, } // Up=0 enum Direction { Up, Down, Left, R ...
- Java 多线程实战
Java多线程 public class ThreadTest { public static void main(String[] args) throws InterruptedException ...
- [ARIA] Create an Accessible Tooltip on a Text Input
Here we use HTML and CSS to create a stylish yet semantic tooltip on a form input. I am using aria-d ...
- 在WinDbg里使用MEX调试扩展
简介 针对WinDbg的MEX调试扩展可以帮助您简化常见的调试器任务,并为调试器提供强大的文本筛选功能.此扩展被Microsoft支持工程师广泛用于解决流程应用程序的故障. 下载&安装 下载m ...
- 洛谷 P4822 [BJWC2012]冻结 题解
P4822 [BJWC2012]冻结 题目描述 "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于 ...
- sublime text 3插件改造之添加从模版新增文件到指定目录
简介:以前使用ST2里面的Sublime NFFT插件比较顺手,最近安装了ST3,但是Sublime NFFT插件不支持ST3,就下载了SublimeTmpl从模版新建文件插件.在使用时,习惯在侧边栏 ...
- Java int 与 Integer 区别
学习借鉴(其实搬了别人的好多)和自己的理解,可能会有较多错误,如有疑问联系我呀. int 是基本数据类型, Integer 是引用类型,也就是一个对象. int 储存的是数值,Integer 储存的 ...