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中好像也没有比较方便的多视区创建函数,所以想要重新封装一个。
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()函数,实现了更便捷的多视区创建
- 有一个问题,就是不清楚如何实现单独对各个视区的控制,目前用不到这部分,就先不去管了