PCL可视化,你想要一只五彩兔子吗
文章目录
- 1 简单的案例
- 2 上色
- 3 带颜色的点云
- 4 法线
- 5 球形和连线
前情提要:PCL安装与测试;文件读写;kd-tree;octree
斯坦福兔子文件
CloudViewer
早在最开始配置环境之后就演示过了,那也是斯坦福兔子的首秀,其操作流程为
visualization::CloudViewer viewer("Cloud Viewer"); //1. 创建viewer对象
viewer.showCloud(cloud); //2. 装入点云
viewer.runOnVisualizationThreadOnce(viewerOneOff); //3. 开始绘图线程
创建对象和装入点云其实没什么好说的,但runOnVisualizationThread
相对复杂一些,其输入参数是一个函数指针,并且要求这个函数viewerOneOff
的输入为viewer
,这个过程有着很大的自由度,比如在官方教程中,就给viewer
加装了一个球
void viewerOneOff(visualization::PCLVisualizer& viewer) {viewer.setBackgroundColor(0.5, 0.9, 0.5); //设置背景颜色PointXYZ o;o.x = 1.0;o.y = 0;o.z = 0;viewer.addSphere(o, 0.25, "shpere", 0);
}
接下来还是用斯坦福兔子来作为主要的绘图对象
int main() {PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);char strfilepath[256] = "rabbit.pcd";io::loadPCDFile(strfilepath, *cloud);visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象viewer.showCloud(cloud);viewer.runOnVisualizationThread(viewerOneOff);system("pause");return 0;
}
结果可以看到
可以看出,CloudViewer
的功能还是比较简陋的,尽管在调用绘图线程时可以通过回调函数来进行设置,但相比之下,PCLVisualizer
显然是功能更加复杂的绘图类,接下来就逐一演示其复杂之处。
在正式体验之前,先导入头文件和命名空间,并考虑到一些过长的名称需要反复调用,所以define
一下。
#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
#define PC PointCloud<PointXYZ>
#define PCRGB PointCloud<PointXYZRGB>
#define VIS visualization::PCLVisualizerusing namespace pcl;
1 简单的案例
首先来一个最简单的案例,其使用流程基本和CloudViewer
是一样的
void simpleVis(PC::ConstPtr cloud)
{VIS* viewer(new VIS("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addPointCloud<PointXYZ>(cloud, "rabbit");viewer->spin();//用于改变显示点云的尺寸viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 1, "rabbit");viewer->addCoordinateSystem(1.0); //设置坐标轴,1.0为坐标轴的尺度viewer->initCameraParameters(); //初始化相机(观察点)参数
}int main() {PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);char strfilepath[256] = "rabbit.pcd";io::loadPCDFile(strfilepath, *cloud);simpleVis(cloud);system("pause");return 0;
}
其中,在添加点云的时候,cloud
后面还跟了一个rabbit
,这个字符串实则是一个ID,起到标识的作用,后面在设置渲染参数时,也用到了这个"rabbit"
。
其效果为
2 上色
通过PointCloudColorHandlerCustom
可以为点云设置颜色
void customColourVis(PointCloud<PointXYZ>::ConstPtr cloud)
{VIS* viewer(new VIS("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);visualization::PointCloudColorHandlerCustom<PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<PointXYZ>(cloud, single_color, "rabbit");viewer->spin();viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 3, "rabbit");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();
}
//main函数中只是把simpleVis换成customColourVis
效果为
3 带颜色的点云
尽管斯坦福兔子并没有颜色,但PCL是支持带颜色的点云的,接下来就人为地添加颜色,方法是根据x,y,zx,y,zx,y,z三个轴的坐标大小来做一个到rgb的映射,最后结果如下,顿时感觉绚丽了不少
代码为
//根据点的位置上色
void setRGB(PC::ConstPtr pc, PCRGB::Ptr pcRGB) {PointXYZ pMin, pMax; //三个轴的最大值和最小值getMinMax3D(*pc, pMin, pMax); //需要include<pcl/common/common.h>PointXYZRGB pTmp;for (auto pt : pc->points) {pTmp = PointXYZRGB(pt.x, pt.y, pt.z);pTmp.r = (uint8_t)((pt.x - pMin.x) / (pMax.x - pMin.x) * 255);pTmp.g = (uint8_t)((pt.y - pMin.y) / (pMax.y - pMin.y) * 255);pTmp.b = (uint8_t)((pt.z - pMin.z) / (pMax.z - pMin.z) * 255);pcRGB->points.push_back(pTmp);}
}void rgbVis(PC::ConstPtr cloud)
{PCRGB::Ptr pcRGB(new PCRGB);setRGB(cloud, pcRGB);VIS* viewer(new VIS("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);//创建一个颜色处理对象用于显示自定义颜色数据visualization::PointCloudColorHandlerRGBField<PointXYZRGB> rgb(pcRGB);viewer->addPointCloud<PointXYZRGB>(pcRGB, rgb, "rabbit");viewer->spin();viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 3, "rabbit");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();
}//main函数中只是把simpleVis换成rgbVis
4 法线
接下来绘制兔子的法线,
#include <pcl/features/normal_3d.h>
//设置法线
void setNormal(PCRGB::ConstPtr pcRGB, PointCloud<Normal>::Ptr norm) {NormalEstimation<PointXYZRGB, Normal> ne; //此为法线计算器ne.setInputCloud(pcRGB);search::KdTree<PointXYZRGB>::Ptr tree(new search::KdTree<PointXYZRGB>());ne.setSearchMethod(tree);ne.setKSearch(5); //选取最近的5个点做法线ne.compute(*norm);
}void normalsVis(PC::ConstPtr cloud) {PCRGB::Ptr pcRGB(new PCRGB);setRGB(cloud, pcRGB); //上色PointCloud<Normal>::Ptr norm(new PointCloud<Normal>); //法线setNormal(pcRGB, norm);VIS* viewer(new VIS("Normals"));viewer->setBackgroundColor(0, 0, 0);visualization::PointCloudColorHandlerRGBField<PointXYZRGB> rgb(pcRGB);viewer->addPointCloud<PointXYZRGB>(pcRGB, rgb, "rgbRabbit");viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 3, "rgbRabbit");//显示点云法线viewer->addPointCloudNormals<PointXYZRGB, Normal>(pcRGB, norm, 1, 0.2, "rgbNormals");viewer->spin();viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();
}
然后就看到兔子长毛了
5 球形和连线
PCL visualizer可以绘制一些几何图形,下面在兔子的起点和终点之间连一条线
void shapesVis(PC::ConstPtr cloud)
{PCRGB::Ptr pcRGB(new PCRGB);setRGB(cloud, pcRGB); //上色VIS* viewer(new VIS("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);visualization::PointCloudColorHandlerRGBField<PointXYZRGB> rgb(pcRGB);viewer->addPointCloud<PointXYZRGB>(pcRGB, rgb, "rgbRabbit");viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 3, "rgbRabbit");//分别是点云的起点和终点PointXYZRGB pStart = pcRGB->points[0];PointXYZRGB pEnd = pcRGB->points[pcRGB->size()-1];//起点到终点的连线viewer->addLine<PointXYZRGB>(pStart, pEnd, "line");viewer->addSphere(pStart, 0.5, 0, 0.5, 0.0, "sphere1");viewer->addSphere(pEnd, 0.5, 0, 0.5, 0.0, "sphere2");viewer->spin();viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();
}
结果如下,可看到两个绿了吧唧的球
PCL可视化,你想要一只五彩兔子吗相关推荐
- python123百钱买百鸡_求解百钱买百鸡问题。假设大鸡 5 元一只,中鸡 3 元一只,小鸡 1 元三只,现有 100 元钱想买 100 只鸡,有多少种买法?截图代码和运行结果_学小易找答案...
[填空题]表达式 'apple.peach,banana,pear'.find('ppp') 的值为 ________ . [填空题]已知 x = '123' 和 y = '456' ,那么表达式 x ...
- 本周AI热点回顾:「时空版」Transformer训练速度远超3D CNN;拒绝内卷的AI狼火了!不想抓羊只想躺!...
点击左上方蓝字关注我们 01 「时空版」Transformer训练速度远超3D CNN,提速3倍! Facebook AI推出了全新的视频理解架构TimeSform ...
- 题目95:百鸡问题:一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡。现有n元钱,想买n只鸡。问有多少种买法?(钱要用完)
题目转载:http://python.wzms.com/s/1/85 题目描述: 百鸡问题:一只公鸡值5元, 一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡. 现有n元钱,想买n只鸡. 问有多少种买 ...
- 在一个笼子里同事养着一些鸡和兔子,你想了解有多少只鸡和兔,主任对你说:我只告诉你鸡和兔的总头数是16和总脚数是40,你能不能自己计算有多少只鸡和多少只兔?
帮一个小妹妹解决了一个C语言的编程题,题目如下 在一个笼子里同事养着一些鸡和兔子,你想了解有多少只鸡和兔,主任对你说:我只告诉你鸡和兔的总头数是16和总脚数是40,你能不能自己计算有多少只鸡和多少只兔 ...
- 题目54:百钱百鸡 一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡。现有n元钱,想买n只鸡。问有多少种买法?(钱要用完)
题目转载:http://python.wzms.com/s/1/50 题目描述: 百鸡问题:一只公鸡值5元, 一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡. 现有n元钱,想买n只鸡. 问有多少种买 ...
- 人类想要拥有金钱、权力、美丽、永生、幸福……但海龟只想做一只海龟
人类想要拥有金钱.权力.美丽.永生.幸福--. 但海龟只想做一只海龟! 写这篇文章的初心,原是为了介绍5月23日(世界海龟日)在广东被放归大海的那些乌龟壳上的二维码(兼具"导航"和 ...
- 我想成为一只IT小小鸟
我想成为一只IT小小鸟 --读<我是一只IT小小鸟>有感 书上讲的很多的人和事其实和我的现实都很相识,可是我自己在这样的环境下,我真的是很担心自己以后能不能成为一个IT人士.自己也抱怨学校 ...
- SemanticKITTI点云拼接+PCL可视化
点云拼接 参考:https://blog.csdn.net/sunqin_csdn/article/details/105475082 代码 concat.h #include <iostrea ...
- 基于QT的PCL可视化点云数据处理分析软件
pcl 是我尝试过使用体验最好的点云数据可视化工具,它是c++上著名的软件开发库,虽然还有很多代码没有写完整,但是不妨碍它成为一个优秀的点云工具,本文介绍了PCL:可视化点云软件,对大家相关软件开发具 ...
- 百钱买百鸡python编程列表推导式_使用循环和列表推导式两种方法求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?...
[程序题]编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n [单选题]患者男,67岁.确诊为原发性支气管肺癌,为行手术 ...
最新文章
- selenium工具的安装
- oracle 安装程序异常终止,Oracle安装错误“程序异常终止
- 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
- 计算机组装与维修bios设置,(完整版)计算机组装与维修模拟试题(BIOS设置的习题).docx...
- STM32——ADC
- 畅玩4c刷android 9.0,华为畅玩4C电信版 CyanogenMod 13.0_Android_6.0.1 【HRT_chiwahfj】
- Linux下安装LAMP的步骤
- Google搜索技巧大全:101个谷歌搜索技巧推荐
- 高性能的java的ip资源扫描和端口分析
- JPA简介及其使用详解
- Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(三)技能标签(Ability Tags)
- .Net Core怎么使用Hangfire
- 电脑管理android手机版下载安装,airdroid下载
- JS对象基础-怎么理解对象
- 计算机网络常见英文缩写词语
- “注水”的新力与“错付”的陈凯
- 德鲁克日志读后感之二十二
- java 进阶笔记线程与并发之ForkJoinPool简析
- 斯福尼健康采暖,终结健康杀手——雾霾
- Python调用谷歌翻译接口