https://blog.csdn.net/uranus1992/article/details/84545820
PCL 显示两个点云
https://blog.csdn.net/weixin_45377028/article/details/104564467
其中v1(v2)就是点云的viewport参数!(viewport应该就是点云的位置!)
**
15visualization可视化/4multi_pcl_visualizer/multi_pcl_visualizer.cpp
/*
* @Description: add: 两个窗口显示点云(滤波前&滤波后) https://blog.csdn.net/weixin_45377028/article/details/104564467
* @Author: HCQ
* @Company(School): UCAS
* @Date: 2020-10-14 11:11:11
* @LastEditors: HCQ
* @LastEditTime: 2020-10-14 11:30:58
*/
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/passthrough.h>
int main(int argc, char **argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
// 填入点云数据
pcl::PCDReader reader;
// 把路径改为自己存放文件的路径
reader.read<pcl::PointXYZ>("../table_scene_mug_stereo_textured.pcd", *cloud);
std::cerr << "Cloud before filtering: " << std::endl;
std::cerr << *cloud << std::endl;
pcl::visualization::PCLVisualizer viewer("双窗口学习");
//添加坐标系
//viewer.addCoordinateSystem(0,0);
int v1(0); //设置左右窗口
int v2(1);
viewer.createViewPort(0.0, 0.0, 0.5, 1, v1);
viewer.setBackgroundColor(0, 0, 0, v1);
viewer.createViewPort(0.5, 0.0, 1, 1, v2);
viewer.setBackgroundColor(0.5, 0.5, 0.5, v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_blue(cloud, 0, 0, 255); // 显示蓝色点云
viewer.addPointCloud(cloud, cloud_out_blue, "cloud_out1", v1);
pcl::PassThrough<pcl::PointXYZ> pass; //创建滤波器 pass
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(0, 1.5);
//pass.setFilterLimitsNegative (true);
pass.filter(*cloud_filtered);
std::cerr << "Cloud after filtering: " << std::endl;
std::cerr << *cloud_filtered << std::endl;
/*pcl::PCDWriter writer;*/
//writer.write<pcl::PointXYZ> ("table_scene_lms400_inliers.pcd", *cloud_filtered, false);
//sor.setNegative (true);
//sor.filter (*cloud_filtered);
//writer.write<pcl::PointXYZ> ("table_scene_lms400_outliers.pcd", *cloud_filtered, false);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_orage(cloud_filtered, 250, 128, 10); //显示橘色点云
viewer.addPointCloud(cloud_filtered, cloud_out_orage, "cloud_out2", v2);
//viewer.setSize(960, 780);
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}
显示四个点云
其中viewer->createViewPort (0.0, 0.0, 0.5, 1.0, v1);
createViewPort是用于创建新视口的函数,所需的4个参数分别是视口在(Xmin,Ymin,Xmax,Ymax)设置窗口坐标,取值在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);
int v1(0); // 左上角
viewer->createViewPort(0.0, 0.5, 0.5, 1.0, v1);
int v2(0); // 右上角
viewer->createViewPort(0.5, 0.5, 1.0, 1.0, v2);
int v3(0); // 左下角
viewer->createViewPort(0.0, 0.0, 0.5, 0.5, v3);
int v4(0); // 右下角
viewer->createViewPort(0.5, 0.0, 1.0, 0.5, v4);
https://blog.csdn.net/weixin_43661854/article/details/90765962?
个人总结
// 可视化
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("three 三窗口 "));
int v1(0); //设置左右窗口
int v2(1);
int v3(2);
viewer->createViewPort(0.0, 0.0, 0.5,1.0, v1); //(Xmin,Ymin,Xmax,Ymax)设置窗口坐标
viewer->createViewPort(0.5, 0.0, 1.0, 0.5, v2);
viewer->createViewPort(0.5, 0.5, 1.0, 1.0, v3);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_red(cloud, 255, 0, 0); // 显示红色点云
viewer->addPointCloud(cloud, cloud_out_red, "cloud_out1", v1);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_green(cloud, 0, 255, 0); // 显示绿色点云
viewer->addPointCloud(cloud_plane, cloud_out_green, "cloud_out2", v2); // 平面
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_blue(cloud, 0, 0, 255); // 显示蓝色点云
viewer->addPointCloud(cloud_cylinder, cloud_out_blue, "cloud_out3", v3); // 圆柱
while (!viewer->wasStopped())
{
viewer->spinOnce();
}