文章目录

  • 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可视化,你想要一只五彩兔子吗相关推荐

  1. python123百钱买百鸡_求解百钱买百鸡问题。假设大鸡 5 元一只,中鸡 3 元一只,小鸡 1 元三只,现有 100 元钱想买 100 只鸡,有多少种买法?截图代码和运行结果_学小易找答案...

    [填空题]表达式 'apple.peach,banana,pear'.find('ppp') 的值为 ________ . [填空题]已知 x = '123' 和 y = '456' ,那么表达式 x ...

  2. 本周AI热点回顾:「时空版」Transformer训练速度远超3D CNN;拒绝内卷的AI狼火了!不想抓羊只想躺!...

    ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍点击左上方蓝字关注我们 01 「时空版」Transformer训练速度远超3D CNN,提速3倍! Facebook AI推出了全新的视频理解架构TimeSform ...

  3. 题目95:百鸡问题:一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡。现有n元钱,想买n只鸡。问有多少种买法?(钱要用完)

    题目转载:http://python.wzms.com/s/1/85 题目描述: 百鸡问题:一只公鸡值5元, 一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡. 现有n元钱,想买n只鸡. 问有多少种买 ...

  4. 在一个笼子里同事养着一些鸡和兔子,你想了解有多少只鸡和兔,主任对你说:我只告诉你鸡和兔的总头数是16和总脚数是40,你能不能自己计算有多少只鸡和多少只兔?

    帮一个小妹妹解决了一个C语言的编程题,题目如下 在一个笼子里同事养着一些鸡和兔子,你想了解有多少只鸡和兔,主任对你说:我只告诉你鸡和兔的总头数是16和总脚数是40,你能不能自己计算有多少只鸡和多少只兔 ...

  5. 题目54:百钱百鸡 一只公鸡值5元,一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡。现有n元钱,想买n只鸡。问有多少种买法?(钱要用完)

    题目转载:http://python.wzms.com/s/1/50 题目描述: 百鸡问题:一只公鸡值5元, 一只母鸡值3元,而1元可买3只小鸡,用百元买百鸡. 现有n元钱,想买n只鸡. 问有多少种买 ...

  6. 人类想要拥有金钱、权力、美丽、永生、幸福……但海龟只想做一只海龟

    人类想要拥有金钱.权力.美丽.永生.幸福--. 但海龟只想做一只海龟! 写这篇文章的初心,原是为了介绍5月23日(世界海龟日)在广东被放归大海的那些乌龟壳上的二维码(兼具"导航"和 ...

  7. 我想成为一只IT小小鸟

    我想成为一只IT小小鸟 --读<我是一只IT小小鸟>有感 书上讲的很多的人和事其实和我的现实都很相识,可是我自己在这样的环境下,我真的是很担心自己以后能不能成为一个IT人士.自己也抱怨学校 ...

  8. SemanticKITTI点云拼接+PCL可视化

    点云拼接 参考:https://blog.csdn.net/sunqin_csdn/article/details/105475082 代码 concat.h #include <iostrea ...

  9. 基于QT的PCL可视化点云数据处理分析软件

    pcl 是我尝试过使用体验最好的点云数据可视化工具,它是c++上著名的软件开发库,虽然还有很多代码没有写完整,但是不妨碍它成为一个优秀的点云工具,本文介绍了PCL:可视化点云软件,对大家相关软件开发具 ...

  10. 百钱买百鸡python编程列表推导式_使用循环和列表推导式两种方法求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?...

    [程序题]编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n [单选题]患者男,67岁.确诊为原发性支气管肺癌,为行手术 ...

最新文章

  1. selenium工具的安装
  2. oracle 安装程序异常终止,Oracle安装错误“程序异常终止
  3. 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
  4. 计算机组装与维修bios设置,(完整版)计算机组装与维修模拟试题(BIOS设置的习题).docx...
  5. STM32——ADC
  6. 畅玩4c刷android 9.0,华为畅玩4C电信版 CyanogenMod 13.0_Android_6.0.1 【HRT_chiwahfj】
  7. Linux下安装LAMP的步骤
  8. Google搜索技巧大全:101个谷歌搜索技巧推荐
  9. 高性能的java的ip资源扫描和端口分析
  10. JPA简介及其使用详解
  11. Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(三)技能标签(Ability Tags)
  12. .Net Core怎么使用Hangfire
  13. 电脑管理android手机版下载安装,airdroid下载
  14. JS对象基础-怎么理解对象
  15. 计算机网络常见英文缩写词语
  16. “注水”的新力与“错付”的陈凯
  17. 德鲁克日志读后感之二十二
  18. java 进阶笔记线程与并发之ForkJoinPool简析
  19. 斯福尼健康采暖,终结健康杀手——雾霾
  20. Python调用谷歌翻译接口

热门文章

  1. 50内的勾股数java_学习知识:50以内勾股数有哪些
  2. 仅以此贴,献给兄弟们的《光辉岁月》
  3. github 乱码网页排版
  4. 百度编辑器上传图片后转到七牛存储
  5. 使用 Convex 进行状态管理的指南
  6. Underexposed Photo Enhancement using Deep Illumination Estimation阅读札记
  7. peta linux对电脑配置要求,使用petalinux遇到的一些问题汇总
  8. php新增的特性,PHP7新增特性
  9. logstash性能测试
  10. Sql Server 02