PCL库学习笔记(一个窗口同时显示多个点云和依次显示不同点云)

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

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

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

首先认识三个函数:

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer
						(new pcl::visualization::PCLVisualizer("3D Viewer"));
// 函数1 addPointCloud()
viewer->addPointCloud<pcl::PointXYZ>(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 <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>

int main()
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud3(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud4(new pcl::PointCloud<pcl::PointXYZ>);

	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<pcl::PointXYZ>::Ptr data[] = { cloud1,cloud2,cloud3,cloud4 };

	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	viewer->setBackgroundColor(0, 0, 0);
	viewer->addPointCloud<pcl::PointXYZ>(cloud1, "sample cloud");
	//viewer->addPointCloud<pcl::PointXYZ>(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)

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

  • 13
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值