pcl多视区显示——超方便

pcl函数原型

  /** \brief Create a new viewport from [xmin,ymin] -> [xmax,ymax].
          * \param[in] xmin the minimum X coordinate for the viewport (0.0 <= 1.0)
          * \param[in] ymin the minimum Y coordinate for the viewport (0.0 <= 1.0)
          * \param[in] xmax the maximum X coordinate for the viewport (0.0 <= 1.0)
          * \param[in] ymax the maximum Y coordinate for the viewport (0.0 <= 1.0)
          * \param[in] viewport the id of the new viewport
          */
 void createViewPort (double xmin, double ymin, double xmax, double ymax, int &viewport);

所以如果想要使用多个窗口来显示,还需要手动计算这几个方块的尺寸,感觉不是很方便,并且函数里指定的x,y坐标轴是与笛卡尔坐标系一致,与id的对应也比较反直觉。如下图所示。
pcl::createViewPort
pcl中好像也没有比较方便的多视区创建函数,所以想要重新封装一个。

createNViewPort()

void createNViewPort(pcl::visualization::PCLVisualizer::Ptr viewer, int row, int col, std::vector<int>& id) {
    
    
	int count = 0;
	for (int i = 0; i < row; i++) {
    
    
		for (int j = 0; j < col; j++) {
    
    
			id.push_back(count);
			viewer->createViewPort(static_cast<float>(j) / col, 1-(static_cast<float>(i+1) / row), static_cast<float>(j + 1) / col, 1- (static_cast<float>(i ) / row), id[count]);
			viewer->setBackgroundColor(255, 255, 255, id[count]);
			//viewer->createViewPort(static_cast<float>(i) / row, static_cast<float>(j) / col, static_cast<float>(j + 1) / row, static_cast<float>(i + 1) / col, id[count]);
			count++;
		}
	}
}

这样就可以通过指定行数和列数快速创建多视区,id与视区的对应如下
在这里插入图片描述

实验

代码

#include <pcl/io/ply_io.h>
#include<pcl/point_types.h>
#include<pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>

void createNViewPort(pcl::visualization::PCLVisualizer::Ptr viewer, int row, int col, std::vector<int>& id) {
    
    
	int count = 0;
	for (int i = 0; i < row; i++) {
    
    
		for (int j = 0; j < col; j++) {
    
    
			id.push_back(count);
			viewer->createViewPort(static_cast<float>(j) / col, 1-(static_cast<float>(i+1) / row), static_cast<float>(j + 1) / col, 1- (static_cast<float>(i ) / row), id[count]);
			viewer->setBackgroundColor(255, 255, 255, id[count]);
			//viewer->createViewPort(static_cast<float>(i) / row, static_cast<float>(j) / col, static_cast<float>(j + 1) / row, static_cast<float>(i + 1) / col, id[count]);
			count++;
		}
	}
}

int main() {
    
    
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPLYFile("D:\\welding_project\\Project1\\ply_source\\bunny\\data\\bun045.ply", *cloud_in);

	//visualization
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("visualizer"));
	int row = 2, col = 2;
	std::vector<int> viewPort_id(row*col);
	createNViewPort(viewer, row, col, viewPort_id);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cloud_in, 255, 0, 0);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color1(cloud_in, 0, 255, 0);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color2(cloud_in, 255, 255, 0);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color3(cloud_in, 0, 0, 255);
	viewer->addPointCloud<pcl::PointXYZ>(cloud_in, color, "cloud_in", viewPort_id[0]);
	viewer->addPointCloud<pcl::PointXYZ>(cloud_in, color1, "cloud_out", viewPort_id[1]);
	viewer->addPointCloud<pcl::PointXYZ>(cloud_in, color2, "cloud_out1", viewPort_id[2]);
	viewer->addPointCloud<pcl::PointXYZ>(cloud_in, color3, "cloud_out2", viewPort_id[3]);
	while (!viewer->wasStopped()) {
    
    
		viewer->spinOnce(1, true);
	}
}

效果

在这里插入图片描述

结论

  • 重新封装了pcl的createViewPort()函数,实现了更便捷的多视区创建
  • 有一个问题,就是不清楚如何实现单独对各个视区的控制,目前用不到这部分,就先不去管了

猜你喜欢

转载自blog.csdn.net/weixin_44368569/article/details/130405588
今日推荐