pcl曲面网格模型的三种显示方式
pcl网格模型有三种可选的显示模式,分别是面片模式(surface)显示,线框图模式(wireframe)显示,点模式(point)显示。默认为面片模式进行显示。设置函数分别为:
void pcl::visualization::PCLVisualizer::setRepresentationToSurfaceForAllActors ( )
void pcl::visualization::PCLVisualizer::setRepresentationToWireframeForAllActors ( )
void pcl::visualization::PCLVisualizer::setRepresentationToPointsForAllActors ( )
在程序中的具体实现可参考下面的例子:
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/vtk_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
/*点云载入模块*/
// 点云模型读入,此处读入为PCD格式点云文件.数据类型为PointXYZ.
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) == -1)
{
PCL_ERROR("Couldn't read file mypointcloud.pcd\n"); //若读取失败将提示
return -1;
}
std::cerr << "点云读入 完成" << std::endl;
/*法向估计模块*/
// Normal estimation(法向量估计)
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;//创建法向估计对象
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);//创建法向数据指针
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);//创建kdtree用于法向计算时近邻搜索
tree->setInputCloud(cloud);//为kdtree输入点云
n.setInputCloud(cloud);//为法向估计对象输入点云
n.setSearchMethod(tree);//设置法向估计时采用的搜索方式为kdtree
n.setKSearch(20);//设置法向估计时,k近邻搜索的点数
n.compute(*normals); //进行法向估计
std::cerr << "法线计算 完成" << std::endl;
/*点云数据与法向数据拼接*/
// 创建同时包含点和法向的数据结构的指针
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
//将已获得的点数据和法向数据拼接
pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
// 创建另一个kdtree用于重建
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
//为kdtree输入点云数据,该点云数据类型为点和法向
tree2->setInputCloud(cloud_with_normals);
/*曲面重建模块*/
// 创建贪婪三角形投影重建对象
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
//创建多边形网格对象,用来存储重建结果
pcl::PolygonMesh triangles;
//设置参数
gp3.setSearchRadius(25); // 设置连接点之间的最大距离(最大边长)用于确定k近邻的球半径(默认为0)
gp3.setMu(2.5); // 设置最近邻距离的乘子,已得到每个点的最终搜索半径(默认为0)
gp3.setMaximumNearestNeighbors(100); //设置搜索的最近邻点的最大数量
gp3.setMaximumSurfaceAngle(M_PI / 2); // 45 degrees 最大平面角
gp3.setMinimumAngle(M_PI / 18); // 10 degrees 每个三角的最大角度
gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees
gp3.setNormalConsistency(false); //若法向量一致,设为true
// 设置点云数据和搜索方式
gp3.setInputCloud(cloud_with_normals);
gp3.setSearchMethod(tree2);
//开始重建
gp3.reconstruct(triangles);
std::cerr << "重建 完成" << std::endl;
//将重建结果保存到硬盘文件中,重建结果以VTK格式存储
pcl::io::saveVTKFile("mymesh.vtk", triangles);
// Additional vertex information
std::vector<int> parts = gp3.getPartIDs();
std::vector<int> states = gp3.getPointStates();
fstream fs;
fs.open("partsID.txt", ios::out);
if (!fs)
{
return -2;
}
fs << "点云数量为:" << parts.size() << "\n";
for (int i = 0; i < parts.size(); i++)
{
if (parts[i] != 0)
{
fs << parts[i] << "\n"; //这的fs对吗?
}
}
//图形显示模块
//创建显示对象指针
std::cerr << "开始显示 ........" << std::endl;
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(0, 0, 0.6); //设置窗口颜色
viewer->addPolygonMesh(triangles, "my"); //设置所要显示的网格对象
//设置网格模型显示模式
//viewer->setRepresentationToSurfaceForAllActors(); //网格模型以面片形式显示
//viewer->setRepresentationToPointsForAllActors(); //网格模型以点形式显示
viewer->setRepresentationToWireframeForAllActors(); //网格模型以线框图模式显示
viewer->addCoordinateSystem(0.1); //设置坐标系,参数为坐标显示尺寸
viewer->initCameraParameters();
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
// Finish
return 0;
}
pcl曲面网格模型的三种显示方式的更多相关文章
- 【css笔记】css中的盒模型和三种定位机制(固定定位,绝对定位,浮动)
html页面上的元素都可以看成是框组成的,框通过三种定位机制排列在一起就过程了我们看到的页面.而框就是盒模型. 盒模型 1.页面上的每个元素可以看成一个矩形框,每个框由元素的内容,内边距,边框和外边距 ...
- EF Core中避免贫血模型的三种行之有效的方法(翻译)
Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...
- 6_1 持久化模型与再次加载_探讨(1)_三种持久化模型加载方式以及import_meta_graph方式加载持久化模型会存在的变量管理命名混淆的问题
笔者提交到gitHub上的问题描述地址是:https://github.com/tensorflow/tensorflow/issues/20140 三种持久化模型加载方式的一个小结论 加载持久化模型 ...
- CSS三种布局模型是什么?
在网页中,元素有三种布局模型:流动模型(Flow) 默认的.浮动模型 (Float).层模型(Layer).下面我们来看一下这三种布局模型. 三种布局模型介绍: 1.流动模型(Flow) 流动(Flo ...
- 【CSS 第六天】三种简历
1.盒子模型 2.三种简历 利用float和CSS制作内容一致,但是样式不一致的三种简历. 代码 3.效果 style-1 3.2效果2 效果三
- Netty中的三种Reactor(反应堆)
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- SDN三种模型解析
数十年前,计算机科学家兼网络作家Andrew S. Tanenbaum讽刺标准过多难以选择,当然现在也是如此,比如软件定义网络模型的数量也很多.但是在考虑部署软件定义网络(SDN)或者试点之前,首先需 ...
- Javascript事件模型系列(一)事件及事件的三种模型
一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...
- SQL2000的三种“故障还原模型”
一.SQL2000的三种“故障还原模型” 在数据库属性的“选项”页,“故障还原模型”栏,共有三项选择:简单.完全.大容量日志记录.它们的根本差别在于SQL2000对数据库日志的维护方式不同.下面逐个讲 ...
随机推荐
- ASP.NET MVC Html.BeginForm 设置 timeout
示例代码: @using (Html.BeginForm("PublishSubmit", "Blog", FormMethod.Post, new { id ...
- [Maven]Maven入门教程
概念 Maven是什么 Maven 是一个项目管理工具.它负责管理项目开发过程中的几乎所有的东西. 版本 maven有自己的版本定义和规则 构建 maven支持许多种的应用程序类型,对于每一种支持的应 ...
- linux终端指令总结
一直没机会进行linux指令的系统学习,但是工作中总能遇到通过指令操作文件或数据库的情况,总不能一味地依赖后端开发者的帮忙.上任领导说过,要是在同一个地方跌倒,那么你就是傻子.我可不想成为傻子,so, ...
- Rafy 框架 - 大批量导入实体
某些场景下,开发者希望能够大批量地把实体的数据导入到数据库中.虽然使用实体仓库保存实体列表非常方便,但是其内部实现机制是一条一条的保存到数据库,当实体的个数较多时,效率就会很低.所以 Rafy 设计了 ...
- 『.NET Core CLI工具文档』(八)dotnet-restore
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-restore 翻译:dotnet-restore 名称 dotnet-restore - 还原一个项目的 ...
- C#委托的一次"甜蜜"接触
委托是个说烂了的话题,但是依旧有好多人不知道为什么要在C#中使用委托,最近有朋友也问到我这个问题,所以举例些场景,以供那些知道怎么声明委托.怎么调用却不知道为什么要用的朋友一些参考,当然也是希望验证下 ...
- spring/spring boot/spring cloud开发总结
背景 针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- Linux-ssh配置
- Atitit mac os 版本 新特性 attilax大总结
Atitit mac os 版本 新特性 attilax大总结 1. Macos概述1 2. 早期2 2.1. Macintosh OS (系统 1.0) 1984年2 2.2. Mac OS 7. ...