此处以双窗口为例
多窗口可视化:同时显示两个窗口 在两个窗口中同时显示点云,并且可以同时控制
一:核心代码:
//第一个窗口显示内容进行设定
int v1(0);
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer->setBackgroundColor(0, 0, 0, v1);
viewer->addText("viewer_01", 10, 10, "v1 text", v1);
pcl::visualization::PointCloudColorHandlerCustom < pcl::PointXYZRGB>rgb(pointCloudPtr, 255, 0, 0);
viewer->addPointCloud<pcl::PointXYZRGB>(pointCloudPtr, rgb, "sample cloud1", v1);//添加点云pointCloudPtr,其处理结果rgb,添加到视图中,sample cloud1为点云的名字,v1代表是添加到哪个视图窗口(pcl中可设置多窗口模式)
//第二个窗口显示内容进行设定
int v2(0);
viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);// 功能尚不明确,仅仅知道:四个数值代表X最小值,Y最小值,X最大值,Y最大值,显示窗口的ID号
viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);//设置v2的背景颜色 背景颜色的设置范围被归化到0-1之间
viewer->addText("viewer_02", 10, 10, "v2 text", v2);//功能尚不明确?
pcl::visualization::PointCloudColorHandlerCustom < pcl::PointXYZRGB>single_color(pointCloudPtr, 0, 255, 0);
//上面一行代码含义:pointCloudPtr为真正的点云,将真正的点云上色,然后把结果存放在:single_color中;
viewer->addPointCloud<pcl::PointXYZRGB>(pointCloudPtr, single_color, "sample cloud2", v2);
//上面一行代码:将点云pointCloudPtr的处理结果single_color显示在视图中。 "sample cloud2"是该点云的名字,v2是开设的第二个窗口
//之所以设置各个处理点云的名字,是为了在后续处理中易于区分; v1表是添加到哪个视图窗口(pcl中可设置多窗口模式)
二:完整代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h> // //PCL可视化的头文件
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointCloudPtr(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile("bunny.pcd", *pointCloudPtr);//读取PCD文件
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->initCameraParameters();//初始化相机参数
//第一个窗口显示内容进行设定
int v1(0);
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer->setBackgroundColor(0, 0, 0, v1);
viewer->addText("viewer_01", 10, 10, "v1 text", v1);
pcl::visualization::PointCloudColorHandlerCustom < pcl::PointXYZRGB>rgb(pointCloudPtr, 255, 0, 0);
viewer->addPointCloud<pcl::PointXYZRGB>(pointCloudPtr, rgb, "sample cloud1", v1);//添加点云pointCloudPtr,其处理结果rgb,添加到视图中,sample cloud1为点云的名字,v1代表是添加到哪个视图窗口(pcl中可设置多窗口模式)
//第二个窗口显示内容进行设定
int v2(0);
viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);// 功能尚不明确,仅仅知道:四个数值代表X最小值,Y最小值,X最大值,Y最大值,显示窗口的ID号
viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);//设置v2的背景颜色 背景颜色的设置范围被归化到0-1之间
viewer->addText("viewer_02", 10, 10, "v2 text", v2);//功能尚不明确?
pcl::visualization::PointCloudColorHandlerCustom < pcl::PointXYZRGB>single_color(pointCloudPtr, 0, 255, 0);
//上面一行代码含义:pointCloudPtr为真正的点云,将真正的点云上色,然后把结果存放在:single_color中;
viewer->addPointCloud<pcl::PointXYZRGB>(pointCloudPtr, single_color, "sample cloud2", v2);
//上面一行代码:将点云pointCloudPtr的处理结果single_color显示在视图中。 "sample cloud2"是该点云的名字,v2是开设的第二个窗口
//之所以设置各个处理点云的名字,是为了在后续处理中易于区分; v1表是添加到哪个视图窗口(pcl中可设置多窗口模式)
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");//设置点云点的大小为3,"sample cloud1"是设置后点云的名字
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud2");
viewer->addCoordinateSystem(1.0);
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
}
//该while循环代表让窗口一直显示,也可以用:viewr->spin();代替
//viewer->spin();
return (0);
}
实现结果:
存在疑问点:1、viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);的使用方法尚不明确
2、viewer->addText("viewer_01", 10, 10, "v1 text", v1); 功能存疑
有待学习:对点云中部分区域进行上色