pcl::visualization::CloudViewer 与 pcl::visualization::PCLVisualizer的区别
-
pcl::visualization::CloudViewer
是一个简单的点云查看器类,提供了一个简单的接口来在窗口中显示点云数据。它可以快速地显示点云,并且只需要几行代码即可实现简单的点云查看功能。它通常用于快速的点云展示和可视化需求较简单的场景。 -
pcl::visualization::PCLVisualizer
是一个更为灵活和强大的点云可视化工具类。它提供了更多的功能和选项,可以进行更复杂的点云可视化和交互操作。通过PCLVisualizer,可以实现添加多个点云,设置不同的渲染属性(颜色、大小、透明度等),添加文本标签,显示坐标轴,添加法线、曲线、平面等等。它可以满足更高级和更定制化的点云可视化需求。
总结起来,pcl::visualization::CloudViewer
适用于简单的点云查看和快速的可视化需求,而pcl::visualization::PCLVisualizer
则适用于更复杂、灵活和定制化的点云可视化和交互需求,它提供了更多的选项和功能,但也需要更多的代码来实现。
#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 = 1.0;
o.z = 1.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); // 添加文字
user_data++;
}
int main(){
// 从文件中加载点云数据
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::io::loadPCDFile("/home/jason/file/pcl-learning/data/room_scan1.pcd", *cloud);
//
pcl::visualization::CloudViewer viewer("cloud Viewer"); // 也可以pcl::visualization::PCLVisualizer,这个支持自定义一些东西
viewer.showCloud(cloud);
// 该注册函数在渲染输出时只执行一次
viewer.runOnVisualizationThreadOnce(viewerOneOff); // 只运行一次的业务逻辑i可以放在viewerOneOff函数里,比如设置背景、画各三维球等等
// 该注册函数在渲染输出时每次都调用
viewer.runOnVisualizationThread(viewerPsycho); // 需要每轮渲染的业务逻辑可以放在viewerPsycho
// 现在的业务逻辑仅仅是完成用户数据的单调增加,此处还可以完成更多丰富的操作
while (!viewer.wasStopped()) {
//此处可以添加其他处理
user_data++;
}
return 0;
}