点云库PCL学习笔记 -- 可视化 -- 1.简单的点云可视化
- 简单的点云可视化,可以使用以下的代码。
#include <pcl/visualization/cloud_viewer.h>
//...
void
foo ()
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
//... 为 cloud 添加对应的场景
pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer"); //创建 viewer 对象(视窗)
viewer.showCloud (cloud); //将 cloud 添加进去视窗进行可视化
while (!viewer.wasStopped ()) //循环处理
{
}
}
简单的点云可视化代码示例cloud_viewer.cpp
#include <pcl/visualization/cloud_viewer.h> //类cloud_viewer头文件申明
#include <iostream> //标准输入输出头文件申明
#include <pcl/io/io.h> //I/O相关头文件申明
#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)
{
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop: " << count++; //用于刷新文字的字符串输入, count 用于计数
viewer.removeShape ("text", 0); //用于移除 ID:text 对象,用于刷新文字
viewer.addText (ss.str(), 200, 300, "text", 0); //添加文字: ss.str()为文字内容; (200, 300)为文字的位置; text为标签ID;
//修正: 这里可能的竞争条件:(主函数中的 viewerPsycho 是单独线程中运行的)
user_data++;
}
int
main ()
{
//定义并实例化一个PointCloud指针对象,储存 XYZRGBA 类型的点云数据
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::io::loadPCDFile ("maize.pcd", *cloud); //打开 maize.pcd 的PCD文件
pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建视窗对象,并给视窗标题栏定义名称为 Cloud Viewer
viewer.showCloud(cloud); // showCloud 函数是同步的,在此处等待直到渲染显示为止
viewer.runOnVisualizationThreadOnce (viewerOneOff); //该注册函数在可视化时只调用一次
viewer.runOnVisualizationThread (viewerPsycho); //该注册函数在渲染输出时每次都调用
while (!viewer.wasStopped ())
{
//在此处可以添加其他处理
//请注意,这是在viewerPsycho的单独线程中运行的
user_data++;
}
return 0;
}
设置编译文件CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(cloud_viewer)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable (cloud_viewer cloud_viewer.cpp)
target_link_libraries (cloud_viewer ${PCL_LIBRARIES})
编译
mkdir build
cd build/
cmake ..
make
执行程序
cd ..
./build/cloud_viewer
文件目录中含有一个maize.pcd
的点云文件
结果如下: