可视化(visualization)是利用计算机图形学和图像处理技术,将数据转换图像在屏幕上显示出来,并进行交互处理的的理论,方法和技术,
pcl_visualization库建立了能够快速建立原型的目的和可视化算法对三维点云数据操作的结果。类似于opencv的highgui例程显示二维图像,在屏幕上绘制基本的二维图形,库提供了以下几点:
(1)渲染和设置视觉特性的方法(如颜色、大小、透明度等)在PCL任意n维的点云数据集pcl::PointCloud format
(2)在屏幕上绘制基本的3D形状的方法(例如,圆柱体,球体,线,多边形等),无论是从点集或参数方程;
(3)一个直方图可视化模块(pclhistogramvisualizer)的二维图;
(4)大量的几何和颜色处理pcl::PointCloud datasets
.
1. class pcl::visualization::CloudViewer 类CloudViewer实现创建点云可视化的窗口,以及相关的可视化功能
Public Member Functions
CloudViewer (const std::string &window_name) 构建可视化点云窗口,窗口名为window_name
~CloudViewer () 注销窗口相关资源
void
showCloud (const ColorCloud::ConstPtr &cloud, const std::string &cloudname="cloud")
可视化窗口显示cloud对应的点云,考虑到多个点云用键值cloudname来限定是哪一个点云
bool
wasStopped (int millis_to_wait=1)
判断用户是否已经关闭窗口,如果是则需要注销窗口
void
runOnVisualizationThread (VizCallable x, const std::string &key="callable")
在窗口运行期间处理x的回调函数,key为键值标识此回调函数,知道窗口关闭
值调用回调函数一次
void
removeVisualizationCallable (const std::string &key="callable")
删除key对应的回调函数
boost::signals2::connection
注册键盘事件回调函数,cookie为回调时的参数,callback为回调函数的指针
template
boost::signals2::connection
registerKeyboardCallback (void(T::*callback)(const pcl::visualization::KeyboardEvent &, void *), T &instance, void *cookie=NULL)
同上,其中的instance 指向是实现该回到函数的对象
(2)太多了这里就贴出所有的关于可视化的类 对于类的成员就不再一一介绍
等等*****************************************8
应用实例
cloud_viewer.cpp:
#include //类cloud_viewer头文件申明
#include //标准输入输出头文件申明
#include //I/O相关头文件申明
#include //PCD文件读取
/**********************************************************************************
函数是作为回调函数,在主函数中只注册一次 ,函数实现对可视化对象背景颜色的设置,添加一个圆球几何体
*********************************************************************************/
intuser_data;voidviewerOneOff (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" <<:endl>
}/***********************************************************************************
作为回调函数,在主函数中注册后每帧显示都执行一次,函数具体实现在可视化对象中添加一个刷新显示字符串
*************************************************************************************/
voidviewerPsycho (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的消息退出程序
*************************************************************/
intmain ()
{
pcl::PointCloud<:pointxyzrgba>::Ptr cloud (new pcl::PointCloud<:pointxyzrgba>); //声明cloud
pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud); //加载点云文件
pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象//showCloud函数是同步的,在此处等待直到渲染显示为止
viewer.showCloud(cloud);//该注册函数在可视化的时候只执行一次
viewer.runOnVisualizationThreadOnce (viewerOneOff);//该注册函数在渲染输出时每次都调用
viewer.runOnVisualizationThread (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;
}
编译结果如下
未完待续*************************8888888