//可视化
//创建一个点云带有rgb数据类型的
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
//建立一个RGB着色器(颜色处理对象) visualizer利用这样的对象显示自定义的颜色数据
//利用这样的对象显示自定义颜色数据,在这个示例中,PointCloudColorHandlerRGB对象得到每个点云的RGB颜色字段
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); // 设置点云大小
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(10000));
}
Visualizer类 是pcl中最全的可视化类,功能更全面,使用更复杂
void visualize_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& filter_cloud) {
//---------显示点云-----------------------
//创建视窗对象并给标题栏定义一个名称“显示点云”, 定义为boost::shared_ptr指针,可以保证其在全局使用,不引起内存错误
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("显示点云"));
// 多视口
int v1(0), v2(0); //设置viewpoint
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); // 在窗口中创建视口, xmin,ymin,xmax,ymax为视口左下角窗口坐标 及右上角窗口坐标,viewport为视口标志
viewer->setBackgroundColor(0, 0, 0, v1); //设置背景颜色
viewer->addText("point clouds", 10, 10, "v1_text", v1); //在指定视口添加字符串“point clouds”10,10为在视口的坐标,“v1_text”为添加字符串的id标志
viewer->createViewPort(0.5, 0.0, 1, 1.0, v2);
viewer->setBackgroundColor(0.1, 0.1, 0.1, v2);
viewer->addText("filtered point clouds", 10, 10, "v2_text", v2);
// 按照z字段进行渲染,将z改为x或y即为按照x或y字段渲染
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z");//实现从点云中一个普通字段生成颜色 并在VTK中可视化
//在指定的viewpoint添加点的类型为PointXYZRGB的点云图像,"sample cloud"为点云的id标志,id标志可以保证其他成员方法中也能引用该点云
//addpointcloud每调用一次就要建一个新的id号
viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud", v1);
viewer->addPointCloud<pcl::PointXYZ>(filter_cloud, "cloud_filtered", v2);
//在指定的viewpoint内设置id点云的渲染属性,"cloud_filtered"的id值
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "cloud_filtered", v2);
该方法(PointCloudColorHandlerRGBField)要求点云类型包含RGB三个颜色分量,即该方法是直接显示点云中各个点的RGB属性字段信息,而不是通过对点云着色显示不同颜色。
如果输入的pcd文件是PointXYZ类型或是其他不带有RGB属性的点云类型,以PointXYZRGB或是PointXYZRGBA的点云类型读入,那么程序找不到rgb相应的值就会强行赋值为(0,0,0),即黑色。所以,当背景为黑色时就看不到点云了。