• 【PCL】CloudViewer可视化(Visualization)


    终于学到可视化了。这里先学一下CloudViewer,是一个简单的点云可视化工具,不可用于多线程。

    CloudViewer通过showCloud方法接收一个点云指针,并且在这个成员函数执行过后,可视化的方框就应该已经出现了。

    CloudCiewer类:

    class pcl::visualization::CloudViewer
    
    • 1

    下面是加载房间点云数据的实例:

    // pcl-181 点云可视化
    #include                          //标准输入输出头文件申明
    #include                       //I/O相关头文件申明
    #include                   //PCD文件读取
    #include  //类cloud_viewer头文件申明
    #include 				//出错解决:加入vtk,用opengl渲染
    VTK_MODULE_INIT(vtkRenderingOpenGL);
    VTK_MODULE_INIT(vtkInteractionStyle);
    
     /**********************************************************************************
       函数是作为回调函数,在主函数中只注册一次 ,函数实现对可视化对象背景颜色的设置,添加一个圆球几何体
     *********************************************************************************/
    int user_data;
    
    void viewerOneOff(pcl::visualization::PCLVisualizer &viewer)
    {
    	viewer.setBackgroundColor(1.0, 0.5, 1.0); //设置背景颜色
    	pcl::PointXYZ o;                          //存储球的圆心位置
    	o.x = 1.0;
    	o.y = 0;
    	o.z = 0;
    	viewer.addSphere(o, 0.25, "sphere", 0); //添加圆球几何对象(黑色圆球)
    	std::cout << "i only run once" << std::endl;
    }
    /***********************************************************************************
       作为回调函数,在主函数中注册后每帧显示都执行一次,函数具体实现在可视化对象中添加一个刷新显示字符串
       *************************************************************************************/
    void viewerPsycho(pcl::visualization::PCLVisualizer &viewer)
    {
    	static unsigned count = 0;
    	std::stringstream ss;
    	ss << "Once per viewer loop: " << count++;
    	viewer.removeShape("text", 0);
    	viewer.addText(ss.str(), 200, 300, "text", 0); // 添加文字
    
    	//FIXME: possible race condition here:
    	user_data++;
    }
    /**************************************************************
      首先加载点云文件到点云对象,并初始化可视化对象viewer,注册上面的回
       调函数,执行循环直到收到关闭viewer的消息退出程序
       *************************************************************/
    int main()
    {
    	// 创建点云渲染对象,导入待渲染文件
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); //声明cloud
    	pcl::io::loadPCDFile("data/room_scan1.pcd", *cloud);                          //加载点云文件
    
    	//创建点云渲染句柄
    	pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象
    	//showCloud函数是同步的,在此处等待直到渲染显示为止
    	viewer.showCloud(cloud);
    
    	//下面的内容是一个模板,支持用户进行更复杂的操作。
    	//该注册函数在可视化的时候只执行一次
    	viewer.runOnVisualizationThreadOnce(viewerOneOff); //只运行一次的业务逻辑可以放在viewerOneOff函数里,比如设置背景、画个三维球等等。
    	//该注册函数在渲染输出时每次都调用
    	viewer.runOnVisualizationThread(viewerPsycho); //需要每轮渲染的业务逻辑可以放在viewerPsycho
    	//现在的业务逻辑仅仅是完成用户数据的单调增加,此处还可以完成更多丰富的操作。
    
    	while (!viewer.wasStopped())
    	{
    		//此处可以添加其他处理
    		//FIXME: Note that this is running in a separate thread from viewerPsycho
    		//and you should guard against race conditions yourself...
    		user_data++;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    运行结果如下:

    在这里插入图片描述

    模板如下:

    // #include "stdafx.h"
    // #include
    // #include
    // #include
    
    // int main()
    // {
    // 	pcl::PointCloud::Ptr cloud(new pcl::PointCloud);	//实例化对象
    // 	pcl::io::loadPCDFile("table_scene_lms400.pcd", *cloud);	//加载pcd
    // 	pcl::visualization::CloudViewer viewer("cloud viewer");	//创建viewer
    // 	viewer.showCloud(cloud);	//显示cloud
    // 	while (!viewer.wasStopped())
    // 	{
    // 	}
    //     return 0;
    // }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    以上。

  • 相关阅读:
    SpringBoot集成ElasticSearch,实现模糊查询,批量CRUD,排序,分页,高亮
    学习操作系统之分时系统+时间片
    在Linux下,转换来自windos文本中的换行符\r\n为\n
    SolidWorks如何绘制环形波纹垫片
    echarts-wordcloud ——文字云制作企业标签——基础积累
    Matlab数学建模实战应用:案例2 - 传染病传播
    【pen200-lab】10.11.1.217
    一键生成PDF即刻呈现:轻松创建无忧体验
    代码保护软件VMProtect用户手册之内置脚本的使用(4)——关于功能的类
    世界各国当日数据探索性分析
  • 原文地址:https://blog.csdn.net/qq_40344790/article/details/127615182