pcl的可视化(一)
PCL中visualization模块及类介绍
pcl中pcl_visualization库提供了可视化相关的数据结构和组件,其主要是为了可视化其他模块的算法处理后的结果,可直观的反馈给用户。
class pcl::visualization::PCLVisualizer
类PCLVisualizer为PCL可视化3D点云的主要类。其内部实现了添加各种3D对象以及交互实现等,比其他类实现的功能更齐全。
实践
1.简单点云可视化
下面是关于如何在可视化线程中运行代码的例子,PCLVisualizer是CloudViewer的后端,但它在自己的线程中运行,若要使用PCLVisualizerl类必须使用调用函数,这样可以避免可视化的并发问题。但是调用时一定要特别注意,以免发生代码混乱的情况,因为调用函数要从可视化线程中进行。
// cloud_viewer.cpp #include <pcl/visualization/cloud_viewer.h> #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> 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++; } int main () { pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); pcl::io::loadPCDFile ("../maize.pcd", *cloud); //加载点云文件 pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象 //showCloud函数是同步的,在此处等待直到渲染显示为止 viewer.showCloud(cloud); //该注册函数在可视化时只调用一次 viewer.runOnVisualizationThreadOnce (viewerOneOff); //该注册函数在渲染输出时每次都调用 viewer.runOnVisualizationThread (viewerPsycho); while (!viewer.wasStopped ()) { // user_data++; } return 0; }
在CMake中建立工程文件,并生成相应的可执行文件,生成可执行文件就可以运行了
运行结果如下图所示,可以看到一个圆球,玉米的点云,动态刷新的字符串。