• PCLVisualizer可视化类(4)


    博客转载自: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(0);
    viewer->createViewPort (0.0, 0.0, 0.5, 1.0, v1);
    viewer->setBackgroundColor (0, 0, 0, v1);
    viewer->addText ("Radius: 0.01", 10, 10, "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, 3, "sample cloud1");
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");
    viewer->addCoordinateSystem (1.0);

    上面三行代码为所有视口设置属性,大多数PCLVisualizer类的方法成员都有一个可以选择的视口ID参数,当设置该参数时,该方法只作用于所设置视口,不设置该参数的话,该方法作用于所有视口,就像这三行代码一样。

    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);

    最后,我们添加法线,每个视口都有一组对应的法线。

  • 相关阅读:
    python 输出所有列表元素的乘积
    shell 变量赋值运算
    shell 判断变量是否为空
    js 获取地址栏域名以及URL
    python 获取列表大于指定长度的元素
    python 判断列表字符串元素首尾字符是否相同
    python 通过列表元素值截取列表并获取长度
    python 判断两个列表是否有公共元素
    python 获取列表的键值对
    python 判断列表的包含关系
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8598388.html
Copyright © 2020-2023  润新知