博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=168
多视口显示
用户经常需要通过多视口比较点云,如果用户在同一个视口绘制点云,会导致信息混乱。PCLVisualizer可视化类允许用户通过不同视口(Viewport)绘制多个点云,这样方便对点云进行比较分析,viewportsVis函数的代码演示如何用多视口来显示点云计算法线的方法结果对比,如图1所示,并进行比较分析,利用不同的搜索半径,基于同一点云计算出对应不同半径的两组法线,第一组,搜索半径为0.05,基于该半径计算的法线用黑色背景显示,第二组,搜索半径为0.1,基于该半径计算的法线用灰色背景显示。这样比较两组法线,用户很容易观察到不同算法参数处理效果的差异,通过这种方法,用户可以很容易对算法参数做出选择,并实时的得到所设置参数的处理效果。
图1 多视口显示示例
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
viewer->initCameraParameters ();
上面是创建视窗对象的标准代码。
int v1();
viewer->createViewPort (0.0, 0.0, 0.5, 1.0, v1);
viewer->setBackgroundColor (, , , v1);
viewer->addText ("Radius: 0.01", , , "v1 text", v1);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb (cloud);
viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);
上面几行代码,创建新的视口,所需的四个参数是视口在X轴的最小值、最大值、Y轴的最小值、最大值,取值在0-1之间。我们创建的视口分布于窗口的左半部分,最后一个字符串参数,用来唯一标识该视口,在其他改变该视口内容的调用中,需要以该唯一标识为参数,我们还设置该视口的背景颜色,添加一个标签以区别于其他视口,利用RGB颜色着色器并添加点云到当前视口中。
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->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, , "sample cloud1");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, , "sample cloud2");
viewer->addCoordinateSystem (1.0);
上面三行代码为所有视口设置属性,大多数PCLVisualizer类的方法成员都有一个可以选择的视口ID参数,当设置该参数时,该方法只作用于所设置视口,不设置该参数的话,该方法作用于所有视口,就像这三行代码一样。
viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, , 0.05, "normals1", v1);
viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, , 0.05, "normals2", v2);
最后,我们添加法线,每个视口都有一组对应的法线。