pcl点云可视化

  • 类一:pcl::visualization::PCLVisualizer
    • 基础显示功能:显示点云、网格、设置颜色、连线
      • 效果图
    • 高级功能:设置回掉函数进行交互、显示区域分割
      • 按键事件
      • 点选取事件
        • 效果图
      • 区域选取事件
      • 显示区域分割
  • 类二:pcl::visualization::CloudViewer

可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕显示出来,并且进行交互处理的理论、方法和技术。

PCL中pcl_visualization库中提供了可视化相关的数据结构和组件,其主要是为了可视化其他模块算法处理后的结果,可直观的反馈给用户。其依赖于pcl_common、pcl_range_image、pcl_kdtree、pcl_IO模块以及VTK外部开源可视化库。下面给出2个常用的可视化类。

类一:pcl::visualization::PCLVisualizer

PCLVisualizer是PCL可视化3D点云的主要类。其内部实现了添加各种3D对象以及交互的实现等,比其他类实现的功能更齐全。

基础显示功能:显示点云、网格、设置颜色、连线

#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
// 包含相关头文件
#include <pcl/visualization/pcl_visualizer.h>typedef pcl::PointXYZ PointT;int main()
{// 读取点云pcl::PointCloud<PointT>::Ptr cloud1(new pcl::PointCloud<PointT>);pcl::io::loadPCDFile("0010.pcd", *cloud1);pcl::PointCloud<PointT>::Ptr cloud2(new pcl::PointCloud<PointT>);pcl::io::loadPCDFile("0020.pcd", *cloud2);// 定义对象pcl::visualization::PCLVisualizer viewer; //设置背景颜色,默认黑色//viewer.setBackgroundColor(100, 100, 100); // rgb// --- 显示点云数据 ----// "cloud1" 为显示id,默认cloud,显示多个点云时用默认会报警告。pcl::visualization::PointCloudColorHandlerCustom<PointT> green(cloud2, 0, 255, 0); // rgbviewer.addPointCloud(cloud1, green, "cloud1"); pcl::visualization::PointCloudColorHandlerCustom<PointT> red(cloud2, 255, 0, 0); // rgb// 将点云设置颜色,默认白色viewer.addPointCloud(cloud2, red, "cloud2");// 将两个点连线PointT temp1 = cloud1->points[0];PointT temp2 = cloud1->points[1000];//viewer.addLine(temp1, temp2, "line0"); // 同样可以设置线的颜色,蓝色viewer.addLine(temp1, temp2, 0, 0, 255, "line0");// --- 显示网格数据 ---pcl::PolygonMesh mesh;pcl::io::loadPLYFile("read.ply", mesh);viewer.addPolygonMesh(mesh);// 开始显示2种方法,任选其一// 1. 阻塞式viewer.spin();// 2. 非阻塞式while (!viewer.wasStopped()){viewer.spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));// 可添加其他操作}system("pause");return 0;
}

效果图

高级功能:设置回掉函数进行交互、显示区域分割

按键事件

#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>// 回掉函数所用数据结构
struct callback_args {bool *isShow;pcl::PointCloud<pcl::PointXYZ>::Ptr orgin_points;pcl::visualization::PCLVisualizer::Ptr viewerPtr;
};// 按键事件回掉函数
void kb_callback(const pcl::visualization::KeyboardEvent& event, void* args)
{if (event.keyDown() && event.getKeyCode() == 'a'){std::cout << "a has pressed" << std::endl;struct callback_args* data = (struct callback_args *)args;if (*(data->isShow)){data->viewerPtr->removePointCloud("cloud");*(data->isShow) = false;std::cout << "remove" << std::endl;}else {data->viewerPtr->addPointCloud(data->orgin_points, "cloud");*(data->isShow) = true;std::cout << "add" << std::endl;}}
}int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("bunny.pcd", *cloud);pcl::console::print_highlight("load cloud !\n");// 定义对象pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);viewer->addPointCloud(cloud, "cloud");// 初始化参数bool isShow = true;struct callback_args kb_args;kb_args.isShow = &isShow;kb_args.orgin_points = cloud;kb_args.viewerPtr = viewer;// 设置回掉函数viewer->registerKeyboardCallback(kb_callback, (void*)&kb_args);viewer->spin();return 0;
}

这段代码实现了按下a清空显示,再按下重新显示。
主要设置回掉函数实现

viewer->registerKeyboardCallback(kb_callback, (void*)&kb_args);

kb_callback实现具体功能。

点选取事件

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>struct callback_args {// structure used to pass arguments to the callback functionpcl::PointCloud<pcl::PointXYZ>::Ptr clicked_points_3d;pcl::visualization::PCLVisualizer::Ptr viewerPtr;
};void pp_callback(const pcl::visualization::PointPickingEvent& event, void* args)
{struct callback_args* data = (struct callback_args *)args;if (event.getPointIndex() == -1)return;int index = event.getPointIndex();std::cout << "index: " << index << std::endl;pcl::PointXYZ current_point;event.getPoint(current_point.x, current_point.y, current_point.z);data->clicked_points_3d->points.push_back(current_point);// Draw clicked points in red:pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(data->clicked_points_3d, 255, 0, 0);data->viewerPtr->removePointCloud("clicked_points");data->viewerPtr->addPointCloud(data->clicked_points_3d, red, "clicked_points");data->viewerPtr->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "clicked_points");std::cout << current_point.x << " " << current_point.y << " " << current_point.z << std::endl;
}int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("bunny.pcd", *cloud);pcl::console::print_highlight("load cloud !\n");pcl::visualization::PCLVisualizer viewer;pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud, 0, 255, 0);viewer.addPointCloud(cloud, green, "cloud");// Add point picking callback to viewer:struct callback_args cb_args;pcl::PointCloud<pcl::PointXYZ>::Ptr clicked_points_3d(new pcl::PointCloud<pcl::PointXYZ>);cb_args.clicked_points_3d = clicked_points_3d;cb_args.viewerPtr = pcl::visualization::PCLVisualizer::Ptr(&viewer);viewer.registerPointPickingCallback(pp_callback, (void*)&cb_args);pcl::console::print_highlight("Shift+click on three floor points, then press 'Q'...\n");// Spin until 'Q' is pressed:viewer.spin();system("pause");return 0;
}

效果图

按下shfit并点击某个点会将坐标打印出来。

区域选取事件

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>struct callback_args{// structure used to pass arguments to the callback functionpcl::PointCloud<pcl::PointXYZ>::Ptr orgin_points;pcl::PointCloud<pcl::PointXYZ>::Ptr chosed_points_3d;pcl::visualization::PCLVisualizer::Ptr viewerPtr;
};void ap_callback(const pcl::visualization::AreaPickingEvent& event, void* args)
{struct callback_args* data = (struct callback_args *)args;std::vector<int> indiecs;if (!event.getPointsIndices(indiecs))return;for (int i = 0; i < indiecs.size(); ++i){data->chosed_points_3d->push_back(data->orgin_points->points[indiecs[i]]);}// Draw clicked points in red:pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(data->chosed_points_3d, 255, 0, 0);data->viewerPtr->removePointCloud("chosed_points");data->viewerPtr->addPointCloud(data->chosed_points_3d, red, "chosed_points");data->viewerPtr->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "chosed_points");std::cout << "selected " << indiecs.size() << " points , now sum is " << data->chosed_points_3d->size() << std::endl;
}int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("rabbit.pcd", *cloud);pcl::console::print_highlight("load cloud !\n");pcl::visualization::PCLVisualizer viewer;pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud, 0, 255, 0);viewer.addPointCloud(cloud, green, "cloud");// Add point picking callback to viewer:struct callback_args cb_args;cb_args.orgin_points = cloud;pcl::PointCloud<pcl::PointXYZ>::Ptr chosed_points_3d(new pcl::PointCloud<pcl::PointXYZ>);cb_args.chosed_points_3d = chosed_points_3d;cb_args.viewerPtr = pcl::visualization::PCLVisualizer::Ptr(&viewer);viewer.registerAreaPickingCallback(ap_callback, (void*)&cb_args);pcl::console::print_highlight("press x enter slected model, then press 'qQ'...\n");// Spin until 'Q' is pressed:viewer.spin();system("pause");return 0;
}

显示区域分割

pcl可以将显示区域分割,从(xmin,ymin)到(xmax,ymax)一个矩形区域,范围是(0,1)。左下角(0,0),右上角(1,1)。之前所有的函数都支持区域显示。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
// 包含相关头文件
#include <pcl/visualization/pcl_visualizer.h>typedef pcl::PointXYZ PointT;int main()
{// 读取点云pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);pcl::io::loadPCDFile("read.pcd", *cloud);// 定义对象pcl::visualization::PCLVisualizer viewer; int v1(1); // viewportviewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);viewer.setBackgroundColor(255, 0, 0, v1);viewer.addPointCloud(cloud, "cloud1", v1);;int v2(2);// viewportviewer.createViewPort(0.5, 0.0, 1.0, 1.0, v1);viewer.setBackgroundColor(0, 255, 0, v2);viewer.addPointCloud(cloud, "cloud2", v2);;viewer.spin();system("pause");return 0;
}

类二:pcl::visualization::CloudViewer

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
// 包含相关头文件
#include <pcl/visualization/cloud_viewer.h>typedef pcl::PointXYZ PointT;int main()
{// 读取点云pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);pcl::io::loadPCDFile("read.pcd", *cloud);pcl::visualization::CloudViewer viewer("simple cloud viewer");viewer.showCloud(cloud);while (!viewer.wasStopped()){// todo::}system("pause");return 0;
}

点云学习笔记16——pcl点云可视化相关推荐

  1. 点云学习笔记15——PCL常用的基础代码

    点云学习笔记15--PCL基础 命名规范 常用代码 1.时间计算 2.pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换 3.如何查找点云的x,y,z的极值? 4 ...

  2. (学习笔记)PCL点云库的基本使用

    目录 前言 1.理解点云库 1.1.不同的点云类型 1.2.PCL中的算法 1.3.ROS的PCL接口 2.创建第一个PCL程序 2.1.创建点云 2.2.加载点云文件 2.3.创建点云文件 2.4. ...

  3. 点云学习笔记7——python pcl将点云数据转换成俯视图(鸟瞰图)

    点云学习笔记7--python pcl将点云数据转换成俯视图(鸟瞰图) 环境安装 点云数据 代码 效果图 参考 环境安装 可以参考我另外一篇文章: 点云学习笔记3--点云库(PCL)安装与测试教程 点 ...

  4. 点云学习笔记11——VoxelNet算法+代码运行

    点云学习笔记11--VoxelNet算法+代码运行 一.算法分析 摘要 介绍 相关工作 1.2. 贡献 2.VoxelNet 2.1.特征学习网络 2.1.1 特征学习网络 二.代码复现 2.1.环境 ...

  5. 1.Hadoop的安装和使用(华为云学习笔记,Spark编程基础,大数据)

    此笔记为第一篇,学校开放华为云平台,帮助我们学习有关大数据方面相关知识的学习笔记,因为是云平台,是已经搭建好linux环境了,使用的是Ubantu.精心整理,自学笔记,如有什么问题,请耐心指正 Had ...

  6. 【14天鸿蒙设备开发实战-第七章 设备联网上云 学习笔记】

    14天鸿蒙设备开发实战-第七章 设备联网上云 学习笔记 一.开发环境.平台与硬件需求 二.华为IoT平台API 2.1 初始化 2.1.1 设备信息初始化 2.1.2 华为IoT平台 初始化 2.1. ...

  7. 阿里云学习笔记——设置规则引擎(2)

    标题阿里云学习笔记--设置规则引擎(2) 下面是我自己作为学习笔记分享,大神勿喷,如有叙述错误的地方欢迎指正. 1.定义Topic 定义了p_data和s_data 2.创建规则引擎,这里创建了APP ...

  8. 【论文学习笔记-16】立体匹配:360SD-net

    [论文学习笔记-16]立体匹配:360SD-net Contribution RelatedWork Method Experiment 本文利用两张360°摄像机获得的球形图片进行立体匹配,与双目立 ...

  9. cocos2d-x学习笔记16:记录存储1:CCUserDefault

    cocos2d-x学习笔记16:记录存储1:CCUserDefault 一.简述 CCUserDefalt作为NSUserDefalt类的cocos2d-x实现版本,承担了cocos2d-x引擎的记录 ...

  10. SpringBoot学习笔记(16)----SpringBoot整合Swagger2

    Swagger 是一个规范和完整的框架,用于生成,描述,调用和可视化RESTful风格的web服务 http://swagger.io Springfox的前身是swagger-springmvc,是 ...

最新文章

  1. Redis集群方案之Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(待实践)
  2. python爬虫工程师-Python-爬虫工程师-面试总结
  3. reactjs脚手架目录结构说明
  4. 【通俗理解】锁存器,触发器,寄存器和缓冲器的区别
  5. delphi libeay32 各版本_Zbrush各版本合集
  6. 使用Dynamic LINQ创建高级查询服务
  7. PyCharm+Python3转换xls文件为xlsx文件格式
  8. 安卓手机可以改鸿蒙吗,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  9. python的print怎么输出utf-8的编码_原创反转精度算法:小数的终极编码
  10. 谷歌能让死去的亲人继续活在网络世界,即便他们从来不上网
  11. 希尔排序法(插入排序的改进版本)
  12. elasticsearch6 php,elasticsearch 6.x php-client
  13. 别乎略安身立命的基础本领
  14. 计算机设备管理程序在哪,设备管理器在哪里查找?如何打开?
  15. 手把手教你做出数据可视化项目(一)页面布局
  16. [工具推荐]截图工具 -- snipaste
  17. C#-进击Hangfire
  18. idle最好记的常用快捷键大全
  19. Soft Diffusion:谷歌新框架从通用扩散过程中正确调度、学习和采样
  20. 任天堂国行 Switch OLED 版 评测

热门文章

  1. CSS 内联样式 外联样式 嵌套样式
  2. java 造数据_java测试造数据神器JavaFaker
  3. PS基础全讲和使用技巧(二)
  4. Windows下的YouTube-dl与FFmpeg下载安装配置
  5. 简约商务风ppt模板推荐
  6. 缓冲流、转换流、序列化流、装饰设计模式、comms-io工具包
  7. 计算机教室标语6个字,教室标语大全
  8. 如何在visio里将图形进行任意角度旋转
  9. 计算机无法安装win10,电脑无法安装win10系统的原因及解决方法
  10. 软件工程标准与软件文档