PCL 同一个窗口里显示多个点云

时间:2024-03-15 15:27:15

之前进行点云分割时,由于阀值的设置,总有几个小的面不能和周围的大面归为一类,这部分阀值和效果设置不是线性的,遂决定根据索引显示所有分割的点云,然后由用户选取其中的两个进行两两的拼接。
步骤为:
1.确定两个需要拼接的点云的索引
2.将这两个索引号输入进去,生成二者拼接的pcd文件,
在完成步骤1时,遇到的问题是怎么样根据索引来显示多个点云,这部分需要用到循环来将点云显示在viewer里
这部分一直想找到如何在同一个窗口里显示多个点云
PCL 同一个窗口里显示多个点云
如图是官方教程里的双窗口显示,

 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 ("Radius: 0.01", 10, 10, "v1 text", v1);

pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb (cloud);

viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);
 int v2(0);

viewer->createViewPort (0.5, 0.0, 1.0, 1.0, v2);

viewer->setBackgroundColor (0.3, 0.3, 0.3, v2);

viewer->addText ("Radius: 0.1", 10, 10, "v2 text", v2);

pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color (cloud, 0, 255, 0);

viewer->addPointCloud<pcl::PointXYZRGB> (cloud, single_color, "sample cloud2", v2);

其中viewer->createViewPort (0.0, 0.0, 0.5, 1.0, v1);
createViewPort是用于创建新视口的函数,所需的4个参数分别是视口在X轴的最小值、最大值,Y轴的最小值、最大值,取值在0-1.
V1视口位于窗口左半部分,V2视口位于右半部分。
创建一个田字由四个窗口显示点云的方法是先创建四个viewport的id
根据xy坐标原点在左上角:

int v1,v2,v3,v4;
viewer->createViewPort (0.0, 0.0, 0.5, 0.5, v1); //(Xmin,Ymin,Xmax,Ymax)设置窗口坐标
viewer->createViewPort (0.5, 0.0, 1.0, 0.5, v2);
viewer->createViewPort (0.0, 0.5, 0.5, 1.0, v3);
viewer->createViewPort (0.5, 0.5, 1.0, 1.0, v4);

效果:
PCL 同一个窗口里显示多个点云

下面是如何使用for循环来根据索引创建不同的窗口,有几个索引就创建几个窗口来查看所有的点云

参考:
论坛提问
官方教程