官网:https://pcl.readthedocs.io/projects/tutorials/en/master/#visualization
对于PCL可视化这一部分,是将点云数据转化为三维可视化图像,PCL提供的库,让你用更少的代码呈现更直观的可视化图像,主要有:
(1)渲染和设置视觉特性的方法(如颜色、大小、透明度等)在PCL任意n维的点云数据集pcl::PointCloud<T> format
(2)在屏幕上绘制基本的3D形状的方法(例如,圆柱体,球体,线,多边形等),无论是从点集或参数方程;
(3)一个直方图可视化模块(pclhistogramvisualizer)的二维图;
(4)大量的几何和颜色处理pcl::PointCloud<T> datasets
(5)a pcl::RangeImage 可视化模块
第一部分:如何使用几行代码实现点云的可视化
官网给出了以下代码去实现,并没有交代更多的东西,有很多不懂的地方。
提出疑问:
1、首先,我不知道如何去运行这个程序,需不需要cmake文件?
2、//...populate cloud处应该用什么函数调用?
3、调用的这个库应该放在什么位置?
#include <pcl/visualization/cloud_viewer.h>
//...
void
foo ()
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
//... populate cloud(此处为cloud添加对应的场景)
pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
viewer.showCloud (cloud);
while (!viewer.wasStopped ())
{
}
}
第二部分:具体实现简单点云的可视化
#include <pcl/visualization/cloud_viewer.h>//可视化头文件声明
#include <iostream>
#include <pcl/common/io.h>
#include <pcl/io/pcd_io.h>//文件读取头文件声明
int user_data;
void
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)//pcl..命名空间下,访问对象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 ("my_point_cloud.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//blocks until the cloud is actually rendered
viewer.showCloud(cloud);
//use the following functions to get access to the underlying more advanced/powerful
//PCLVisualizer
//This will only get called once
viewer.runOnVisualizationThreadOnce (viewerOneOff);
//This will get called once per visualization iteration
viewer.runOnVisualizationThread (viewerPsycho);
while (!viewer.wasStopped ())
{
//you can also do cool processing here
//FIXME: Note that this is running in a separate thread from viewerPsycho
//and you should guard against race conditions yourself...
user_data++;
}
return 0;
}
操作到这里,上面问题3迎刃而解,这个pcd文件放在build文件夹里面。当我运行程序后,报了这样一个错误:Failed to find match for field 'rgba'.(希望有大佬可以指点一下)
最后得到图像:
有可能因为比例原因,得不到想要的图像。可以拖动一下鼠标滚轮,检查一下是否图像太大导致显示不全面。