博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCL库学习笔记(一个窗口同时显示多个点云和依次显示不同点云)
阅读量:4048 次
发布时间:2019-05-25

本文共 2568 字,大约阅读时间需要 8 分钟。

本文利用 PCLViewer 类实现对点云的可视化,并描述两种情况的代码实现:

一个窗口同时显示多个点云和依次显示不同点云。

这两个要求其实在很久之前利用PCL库工具时就遇到过,能够大大简化当时的工作量。但是没有精力和耐心对其中原理进行探究。这次的系统学习,强迫自己进行了较深入的了解,记录如下:

首先认识三个函数:

boost::shared_ptr
viewer (new pcl::visualization::PCLVisualizer("3D Viewer"));// 函数1 addPointCloud()viewer->addPointCloud
(cloud1, "sample cloud");// 函数3 removePointCloud()viewer->removePointCloud("sample cloud1");// 函数2 updatePointCloud()viewer->updatePointCloud(cloud1, "sample cloud");

再认识两种ID,其中第一种是定义viewer对象时定义的 “3D Viewer”,可以理解为我们打开的窗口的名称为 “3D Viewer”;其次第二种是add point cloud 时添加的 “sample cloud”,可以理解为我们为当前点云取了一个名字叫做 “sample cloud”;再谈这三个函数就好理解了:

  1. addPointCloud() 就相当于在 “3D Viewer” 窗口中添加了一个点云 cloud1,它的小名叫做 “sample cloud”,因此窗口中就会可视化出 cloud;所以当我们再次想在窗口 “3D Viewer” 添加另外一个点云时,就可以这样写:
    viewer->addPointCloudpcl::PointXYZ(cloud2, “sample cloud1”);
    需要注意,要为cloud2取一个不同的小名,不然在同一个窗口中就会冲突。这样我们就实现了一个窗口同时显示多个点云功能;
  2. removePointCloud() 就容易理解了,在窗口中移除点云,因此参数直接为该点云的小名就行;
  3. updatePointCloud() 这个函数就等于先进行一次removePointCloud() 再进行一次addPointCloud();所以就不难理解,这个函数可以实现一个窗口依次显示不同点云;

直接上代码(只是一个示例呀):

#include 
#include
#include
#include
int main(){
pcl::PointCloud
::Ptr cloud1(new pcl::PointCloud
); pcl::PointCloud
::Ptr cloud2(new pcl::PointCloud
); pcl::PointCloud
::Ptr cloud3(new pcl::PointCloud
); pcl::PointCloud
::Ptr cloud4(new pcl::PointCloud
); pcl::io::loadPCDFile("C:\\Users\\13427\\Desktop\\maize.pcd", *cloud1); pcl::io::loadPCDFile("C:\\Users\\13427\\Desktop\\room_scan1.pcd", *cloud2); pcl::io::loadPCDFile("C:\\Users\\13427\\Desktop\\maize.pcd", *cloud3); pcl::io::loadPCDFile("C:\\Users\\13427\\Desktop\\room_scan1.pcd", *cloud4); pcl::PointCloud
::Ptr data[] = { cloud1,cloud2,cloud3,cloud4 }; boost::shared_ptr
viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); viewer->setBackgroundColor(0, 0, 0); viewer->addPointCloud
(cloud1, "sample cloud"); //viewer->addPointCloud
(cloud2, "sample cloud1"); //viewer->removePointCloud("sample cloud1"); viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); viewer->addCoordinateSystem(1.0); viewer->initCameraParameters(); int i = 1; while (!viewer->wasStopped()) { viewer->updatePointCloud(data[i], "sample cloud"); i = (i + 1) % 4; viewer->spinOnce(1000); } return 0;}

随便看一看应该就懂我代码想表达的含义了。这里再额外介绍两个函数:

// 函数1 viewer->wasStopped()viewer->wasStopped()// 函数2 viewer->spinOnce(1000)viewer->spinOnce(1000)

实际上 我们现实的点云是一个动态的不断刷新的过程。看下面两个官方解释,大家应该就懂了。看似细节的东西,还是需要时间去搞懂,不然一直是粘贴复制代码,到最后发现,其实啥都不会。

在这里插入图片描述
在这里插入图片描述

转载地址:http://xvyci.baihongyu.com/

你可能感兴趣的文章
SSH原理与运用
查看>>
程序员之深刻的思辨和严密的体系结构
查看>>
黄威地址的openeim001
查看>>
工人的工资少openeim002
查看>>
ye我们胜利了的shooow
查看>>
太白山可真雄伟的shooow
查看>>
只见他满身尘土的openeim
查看>>
故事从一只平凡的openeim002
查看>>
真是哑巴吃黄连的openeim001
查看>>
MainActivity 会异步加载图片到相应的ImageView上
查看>>
妈妈十分生气的shooow
查看>>
怎么写一个温泉管理系统
查看>>
令人神清气爽的shooow
查看>>
指导教师的shooow
查看>>
leetcode面试题01.06.字符串压缩,超出时间限制,样例通过31/32
查看>>
机器学习实战、第二章KNN算法详解、AttributeError: ‘dict‘ object has no attribute ‘iteritems‘
查看>>
leetcode 535 TinyURL 的加密与解密 暴力 年轻人不讲武德—shooter7的博客
查看>>
课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)
查看>>
leetcode1792第232场周赛第三题,以及二维数组根据某一列进行排序——优先队列
查看>>
学生网上选课管理系统的设计与实现—计算机类专业课程设计(毕业设计)
查看>>