PclSharp--贪婪投影三角算法
1、PCL点云三角化
1.1 Delaunay三角剖分
定义:假设点集中的一条边e(两个端点为a,b),e若满足下列条件,则称之为Delaunay边:存在一个圆经过a,b两点,圆内(圆上最多三点共圆)不含点集中任何其他的点。而Delaunay三角化就是指三角网格均是由Delaunay边组成,并满足最小角最大原则(在点集可能形成的三角剖分中,Delaunay三角剖分所形成的三角形的最小角最大)。
1.2 贪婪三角化
PCL中采用将三维点云投影到二维平面的方法来实现三角剖分, 具体采用贪婪三角化算法。
其过程为:
1:计算点云中点的法线,再将点云通过法线投影到二维坐标平面。
2:使用基于Delaunay三角剖分的空间区域增长算法完成平面点集的三角化。
3:根据投影点云的连接关系确定原始三维点云间的拓扑关系,最终得到曲面模型。
2、代码:
using PclSharp;
using PclSharp.Features;
using PclSharp.Helpers;
using PclSharp.IO;
using PclSharp.Search;
using PclSharp.Struct;
using PclSharp.Surface;
using System;
namespace PclSharpTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"C#--PclSharp算法库测试:");
//读取点云数据
var cloud = new PointCloudOfXYZ();
using (var reader = new PCDReader())
reader.Read(AppDomain.CurrentDomain.BaseDirectory + $"//pcd//bun0.pcd", cloud);
// 计算法向量
var normals = new PointCloudOfNormal();//法线点云
using (var ne = new NormalEstimationOfPointXYZAndNormal())//法线估计对象
using (var tree = new KdTreeOfXYZ()) //创建用于最近邻搜索的KD-Tree
{
//法线估计
ne.SetSearchMethod(tree);
ne.SetInputCloud(cloud);
ne.KSearch = 10;// 使用当前点周围最近的10个点
ne.Compute(normals);//计算法线
}
//将点云与法线进行字段拼接
PointCloudOfPointNormal cloud_with_normals = new PointCloudOfPointNormal(); //法向量点云对象
//将点云和法线拼接一起
PclHelper.concatenateFields(cloud, normals, cloud_with_normals);
//创建搜索树
KdTree<PointNormal> tree2 = new KdTreeOfXYZNormal();
tree2.SetInputCloud(cloud_with_normals);
// 初始化贪婪三角形的对象
GreedyProjectionTriangulationOfPointNormal gp3 = new GreedyProjectionTriangulationOfPointNormal();
//创建多变形网格,用于存储结果
PolygonMesh triangles = new PolygonMesh();
gp3.SearchRadius = 0.025f; //设置连接点之间的最大距离用于确定k近邻的球半径
gp3.Mu = 2.5f; //设置最近邻距离的乘子,以得到每个点的最终搜索半径
gp3.MaximumNearestNeighbors = 100; //设置搜索的最近邻点的最大数量
gp3.MaximumSurfaceAngle = (Math.PI / 4); // 45 degrees(pi)最大平面角
gp3.MinimumAngle = (Math.PI / 18); // 10 degrees 每个三角的最小角度
gp3.MaximumAngle = (2 * Math.PI / 3); // 120 degrees 每个三角的最大角度
gp3.NormalConsistency = false; //如果法向量一致,设置为true
//设置搜索方法和输入点云
gp3.SetInputCloud(cloud_with_normals);
gp3.SetSearchMethod(tree2);
//执行重构,结果保存在triangles中
gp3.Reconstruct(triangles);
using (var visualizer = new PclSharp.Vis.Visualizer("a window"))
{
//创建两个观察视点
int v1 = 1;
int v2 = 2;
visualizer.CreateViewPort(0.0, 0.0, 0.5, 1.0, v1);
visualizer.CreateViewPort(0.5, 0.0, 1.0, 1.0, v2);
visualizer.SetBackgroundColor_ViewPort(0f, 0f, 0f, v1);
visualizer.SetBackgroundColor_ViewPort(0.05f, 0f, 0f, v2);
visualizer.AddPointCloud(cloud, "v1", v1);
visualizer.AddPolygonMesh(triangles, "v2",v2);
visualizer.SetPointCloudColor(0.5, 1, 1, "v1");//原始点云附色
while (!visualizer.WasStopped)
visualizer.SpinOnce(100);
}
Console.ReadKey();
}
}
}
3、编译结果:
PclSharp--贪婪投影三角算法相关推荐
- PCL点云库用贪婪投影三角法网格化实现点云的表面重建
https://blog.csdn.net/wkxxuanzijie920129/article/details/51404396 https://blog.csdn.net/Architet_Yan ...
- 贪婪投影三角化算法中的参数设置
无序点云的快速三角化 本小节描述了怎样使用贪婪投影三角化算法对有向点云进行三角化,具体方法是先将有向点云投影到某一局部二维坐标平面内,再在坐标平面内进行平面内的三角化,再根据平面内三位点的拓扑连接关系 ...
- 【PCL-3】点云模型网格化--贪婪投影三角化算法
贪婪投影三角化算法是一种对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复. 方法: (1)将三维点通过法线投影到某一平面: (2)对投影 ...
- JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码)
JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码) greedyJumpGame.js完整源代码 greedyJumpGame.test.js完整源代码 greedyJumpGame.js ...
- 【matlab】雷达成像系列 之 BP(BackProjection,后向投影) 成像算法
一.什么是BP算法? 由来:BP算法最初是McCorkle受计算机层析技术的启发推导而来,所谓的计算机层析:就是CT(Computer Tomograpy),这是在医院中再普遍不过的技术了. BP算法 ...
- “马的遍历”问题的贪婪法解决算法
/**//* 标题:<<系统设计师>>应试编程实例-[递推算法程序设计] 作者:成晓旭 时间:2002年09月14日(18:20:00-20:18:00) ...
- java 寻路算法_寻路算法-贪婪最佳优先算法
最近开始接触寻路算法,对此不太了解的话建议读者先看这篇文章 <如何快速找到最优路线?深入理解游戏中寻路算法> . 所有寻路算法都需要一种方法以数学的方式估算某个节点是否应该被选择.大多数游 ...
- 反向投影 matlab,【matlab】雷達成像系列 之 BP(BackProjection,后向投影) 成像算法...
一.什么是BP算法? 由來:BP算法最初是McCorkle受計算機層析技術的啟發推導而來,所謂的計算機層析:就是CT(Computer Tomograpy),這是在醫院中再普遍不過的技術了. BP算法 ...
- 浅谈PHP编写杨辉三角算法
PHP编写杨辉三角算法如下: <?php function test($n) {for ($i=1;$i<$n;$i++) {for ($j=1;$j<=$i;$j++) {if ( ...
最新文章
- 使用nat方式解决虚拟机联网问题
- WEB站点使用企业库安全性异常解决办法
- 500 - Internal server error.
- ug怎么画曲线_UG怎么画雨伞的曲面造型
- 实现 LRU 缓存机制
- Highcharts教程--把js代码从html中抽离出来,放到单独的一个js文件中。由html页面调用...
- vim支持nginx语法高亮
- Apache—DBUtils框架简介
- coreseek mysql_coreseek (sphinx)+ Mysql + Thinkphp搭建中文搜索引擎详解
- 集成学习 Bagging, Boosting, Stacking
- 话单数据仓库搭建(2)- 数据仓库ODS及DWD层
- 爱思助手更新后无法连接服务器,爱思助手出现无法连接或连接超时的操作教程...
- 我的VSTO之路(三):Word基本知识
- 【新知实验室 陈林】
- 基于proteus的51单片机仿真实例二、关于proteus
- confluence 使用笔记
- 冰与火之歌:Python的三元表达式
- GPS模块资料,链接
- php word 邮件合并发送邮件,在word2010中的邮件合并,除需要主文档,还需要什么...
- 基于stm32C8T6的红外遥控器制作 stm做遥控器