PCL 点云视窗类CloudViewer

点云视窗类CloudViewer是简单显示点云的可视化工具类,可以让用户用尽可能少的代码查看点云。注意:点云视窗类不能应用于多线程应用程序中。

简单点云可视化
如果用户想用几行代码可视化程序中所对应的地物,可以使用下面的代码:

#include <pcl/visualization/cloud_viewer.h>
//...
void
foo ()
 {
   pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
//... 为cloud添加对应的场景
pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
   viewer.showCloud (cloud);
while (!viewer.wasStopped ())
   {
   }
 }

一个更具体的例子
下面是关于如何在可视化线程中运行代码的例子,PCLVisualizer是CloudViewer的后端,但它在自己的线程中运行,若要使用PCLVisualizer类,必须使用调用函数,这样可以避免可视化的并发问题。但是,调用时一定要特别注意,以免发生代码混乱的情况,因为调用函数要从可视化线程中进行。

代码
首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第7章例1文件夹中,打开名为cloud_viewer.cpp的代码文件。同文件夹下可以找到相关的测试点云文件maize.pcd。

解释说明
下面解析源代码的关键语句,下面一段代码为相关类的头文件声明。

#include <pcl/visualization/cloud_viewer.h> //类CloudViewer头文件声明
#include //标准输入输出头文件声明
#include <pcl/io/io.h> //io相关头文件声明
#include <pcl/io/pcd_io.h> //pcd文件读取头文件声明
下面函数是作为回调函数,在主函数中注册后只执行一次,函数具体实现对可视化对象背景颜色设置、添加一个圆球几何体。

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)
{
  staticunsigned 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::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++;
    }
  return0;
}

编译并运行程序
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:

…>cloud_viewer.exe
运行结果如图1所示,可以看到一个圆球、玉米的点云、动态刷新的字符串。

在这里插入图片描述

图1 CloudViewer实例运行结果

### PCL 点云处理使用教程 #### 安装配置环境 为了能够顺利使用PCL进行点云处理,首先需要安装并配置好开发环境。这通常涉及下载和编译PCL库以及设置IDE以便于编写和调试代码[^2]。 #### 创建基本的点云集 创建一个简单的点云集是学习PCL的第一步。可以通过读取文件或者直接在程序中生成一些随机分布的数据点作为起点。下面是一段用来初始化简单点云的例子: ```cpp #include <pcl/point_cloud.h> #include <pcl/point_types.h> int main () { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); // 添加几个测试点到cloud对象里去 cloud->width = 5; cloud->height = 1; cloud->points.resize(cloud->width * cloud->height); for (size_t i = 0; i < cloud->points.size (); ++i){ cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f); cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f); cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f); } } ``` 这段代码展示了如何声明一个新的`PointCloud<PointXYZ>`型的指针变量,并向其中填充五个随机位置的空间坐标点[^1]。 #### 可视化点云数据 一旦有了点云数据之后,就可以考虑将其显示出来观察效果了。PCL自带了一个叫做`visualization`模块可以帮助完成这项工作。这里给出一段用于渲染上述创建好的点云实例的小例子: ```cpp #include <pcl/visualization/cloud_viewer.h> // ... 继续上面main函数... if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1){ //* 加载pcd文件失败 */ PCL_ERROR ("Couldn't read file test_pcd.pcd \n"); } // 显示窗口直到用户关闭它为止... pcl::visualization::CloudViewer viewer("Simple Cloud Viewer"); viewer.showCloud(cloud); while (!viewer.wasStopped ()) {} ``` 此片段说明了怎样加载外部`.pcd`格式文件并将结果显示在一个交互式的图形界面当中。 #### 数据预处理——半径异常移除过滤器 当面对实际场景下的复杂点云时,往往存在噪声干扰等问题影响后续分析质量。此时可以采用诸如半径异常移除这样的预处理手段来改善输入条件。具体做法如下所示: ```cpp #include <pcl/filters/radius_outlier_removal.h> //...继续之前的main() 函数体内部... pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem; outrem.setInputCloud(cloud); // 设置待处理的目标点集 outrem.setRadiusSearch(0.8); // 设定搜索邻域大小参数 outrem.setMinNeighborsInRadius (2); // 至少要有两个邻居才保留该点 outrem.filter (*cloud_filtered); // 执行滤波操作, 输出结果保存至cloud_filtered容器内 ``` 以上就是关于利用C++结合PCL库来进行基础级别的点云处理与可视化的入门指南[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值