PCLVisualizer可视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer 更为复杂,具有更全面的功能,如显示法线、点云着色、绘制多种形状和开辟多个视口。
/可视化单个点云:应用PCLVisualizer可视化类显示单个具有XYZ信息的点云****/
//simpleVis函数实现最基本的点云可视化操作,
boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{
//创建视窗对象并给标题栏设置一个名称“3D Viewer”并将它设置为boost::shared_ptr智能共享指针,这样可以保证指针在程序中全局使用,而不引起内存错误
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
//设置视窗的背景色,可以任意设置RGB的颜色,这里是设置为黑色
viewer->setBackgroundColor (0, 0, 0);
/*将点云添加到视窗对象中,并定一个唯一的字符串作为ID 号,利用此字符串保证在其他成员中也能标志引用该点云,多次调用addPointCloud可以实现多个点云的添加,每调用一次就会创建一个新的ID号,如果想更新一个已经显示的点云,先调用removePointCloud(),并提供需要更新的点云ID 号,也可使用updatePointCloud*/
viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
//用于改变显示点云的尺寸,可以利用该方法控制点云在视窗中的显示方法,1设置显示点云大小
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
//通过设置照相机参数使得从默认的角度和方向观察点云
viewer->initCameraParameters ();
return (viewer);
}
/可视化点云自定义颜色特征给点云着上指定的颜色,以区别其他的点云,****/
//点云类型为XYZ类型,customColourVis函数将点云赋值为绿色,
boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
viewer->setBackgroundColor (0, 0, 0);
//创建一个自定义的颜色处理器PointCloudColorHandlerCustom对象,并设置颜色为纯绿色
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
//addPointCloud<>()完成对颜色处理器对象的传递
viewer->addPointCloud<pcl::PointXYZ> (cloud, single_color, "sample cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
viewer->addCoordinateSystem (1.0);
viewer->initCameraParameters ();
return (viewer);
}
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> sources_cloud_color(source,250,0,0);
//对输入为pcl::PointXYZ类型的点云,着色为红色。其中,source表示真正处理的点云,sources_cloud_color表示处理结果.
view->addPointCloud(source,sources_cloud_color,"sources_cloud_v1",v1);
//将点云source,处理结果sources_cloud_color,添加到视图中,其中,sources_cloud_v1,表示该点云的”标签“,,之所以设置各个处理点云的名字,是为了在后续处理中易于区分; v1表是添加到哪个视图窗口(pcl中可设置多窗口模式)
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"sources_cloud_v1");
//设置点云属性. 其中PCL_VISUALIZER_POINT_SIZE表示设置点的大小为3,双引号中”sources_cloud_v1“,就是步骤2中所说的标签。
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY,1,"sources_cloud_v1");
//主要用来设置标签点云的不透明度,表示对标签名字为"sources_cloud_v1"的标签点云设置不透明度为1,也就是说透明度为0. 默认情况下完全不透明。
/可视化点云法线和其他特征 normalsVis函数中演示了如何实现点云的法线/
boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis (
pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)
{
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
viewer->setBackgroundColor (0, 0, 0);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
//实现对点云法线的显示
viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 10, 0.05, "normals");
viewer->addCoordinateSystem (1.0);
viewer->initCameraParameters ();
return (viewer);
}
/******************************************************************************************
多视角显示:PCL visealizer可视化类允许用户通过不同的窗口(Viewport)绘制多个点云这样方便对点云比较
viewportsVis函数演示如何用多视角来显示点云计算法线的方法结果对比
******************************************************************************************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)
{
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
viewer->initCameraParameters ();
//以上是创建视图的标准代码
int v1(0); //创建新的视口
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); //4个参数分别是X轴的最小值,最大值,Y轴的最小值,最大值,取值0-1,v1是标识
viewer->setBackgroundColor (0, 0, 0, v1); //设置视口的背景颜色
viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1); //添加一个标签区别其他窗口 利用RGB颜色着色器并添加点云到视口中
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);
//对第二视口做同样的操作,使得做创建的点云分布于右半窗口,将该视口背景赋值于灰色,以便明显区别,虽然添加同样的点云,给点云自定义颜色着色
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, 3, "sample cloud1");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");
viewer->addCoordinateSystem (1.0);//添加法线 每个视图都有一组对应的法线
viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, 10, 0.05, "normals1", v1);
viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, 10, 0.05, "normals2", v2);
return (viewer);
}