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"); }
|