点云的简单可视化CloudViewer

本教程展示了如何使用CloudViewer进行点点可视化。
CloudViewer是一种直接、简单的点云可视化程序,旨在使用尽可能少的代码来查看点云数据,需要注意的是,CloudViewer不能在多线程中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>

int user_data;

//创建一个立方体用于查看,如果我们有.pcd文件,则可以注释掉调用该函数的地方
void viewOneOff(pcl::visualization::PCLVisualizer &viewer){
viewer.setBackgroundColor(0,0,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);
user_data++;
}

int main(){
//Ptr是C++的智能指针,在对象消亡后自动执行delete操作
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
//对于指针类型,前置*表示其内容,因此,下面这句就是将文件读取到cloud的内容中;如果在下面这一句去掉*,则会报错,
// 文件怎么可能放到一个长度为4的对象中呢?
//相应的,前置&表示取对象的地址
pcl::io::loadPCDFile("my_point_cloud.pcd",*cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//查看文档,我们发现showCloud可以最多有两个参数,第一为一个点云的指针,第二为一个字符串;在这里,如果第一个参数写成
//*cloud,那就会报错,我们尝试一下别的写法,看能不能实现这样的功能
viewer.showCloud(cloud,"cloud");
// viewer.runOnVisualizationThreadOnce(viewOneOff);
// viewer.runOnVisualizationThread(viewerPsycho);
while (!viewer.wasStopped()){
user_data++;
}
return 0;
}
//我们来尝试一下非指针的cloud应该怎么可视化,虽然我们将cloudPtr设为了cloud的指针,但是showCloud不接受这种指针,看来只有
//pcl中的Ptr指针才能被使用在这个函数中
int mainFun1(){
pcl::PointCloud<pcl::PointXYZRGBA> cloud;
pcl::PointCloud<pcl::PointXYZRGBA>* cloudPointer;
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudPtr(new pcl::PointCloud<pcl::PointXYZRGBA>);
cloudPointer=&cloud;
//cloudPtr=&cloud;这里不能通过地址将cloud给到cloudPtr,似乎我们只能通过读入点云数据时才能将内容给到Ptr指针
pcl::io::loadPCDFile("my_point_cloud.pcd",*cloudPtr);
pcl::io::loadPCDFile("my_point_cloud.pcd",cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//viewer.showCloud(cloudPointer,"cloud");//这里即使使用非Ptr类型的指针,也不能作为showCloud的参数,使用&前置符亦然
viewer.showCloud(cloudPtr,"cloud");
}

感谢您的阅读。 🙏 关于转载请看这里