点云双窗口显示

来源:互联网 发布:js 字符串split 编辑:程序博客网 时间:2024/06/05 02:19
#include <pcl/point_cloud.h>#include <pcl/kdtree/kdtree_flann.h>#include<pcl/point_types.h>#include <pcl/io/pcd_io.h>#include <iostream>#include <vector>#include <ctime>#include<pcl/visualization/cloud_viewer.h>#include <boost/thread/thread.hpp>#include <pcl/common/common_headers.h>#include <pcl/common/common_headers.h>#include <pcl/features/normal_3d.h>#include <pcl/console/parse.h>#include "las_file.h"//加入自己的数据类型using namespace std;////void viewOneOff(pcl::visualization::PCLVisualizer& viewer)//{//viewer.setBackgroundColor(1,1,1);//}//可视化单个点云boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud){//创建3D窗口并添加点云boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->setBackgroundColor (0.5,0.5,0.5);viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");viewer->addCoordinateSystem (0.1);viewer->initCameraParameters ();return (viewer);}//可视化点云颜色特征boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud){//创建3D窗口并添加点云boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->setBackgroundColor (1, 1, 1);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");//viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");//viewer->addCoordinateSystem (1.0);viewer->initCameraParameters ();return (viewer);}//boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud){//创建3D窗口并添加点云boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->setBackgroundColor (1, 1, 1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ> (cloud, single_color, "sample cloud");//viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");//viewer->addCoordinateSystem (1.0);viewer->initCameraParameters ();return (viewer);}boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud){//创建3D窗口并添加点云    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->setBackgroundColor (255, 255, 255);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");//viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem (0.05);viewer->initCameraParameters ();//在点云上添加直线和球体模型viewer->addLine<pcl::PointXYZRGB> (cloud->points[0],cloud->points[cloud->size() - 1], "line");//0.2为半径  后面为颜色viewer->addSphere (cloud->points[0], 0.02, 0.5, 0.5, 0.0, "sphere");//在其他位置添加基于模型参数的平面及圆锥体pcl::ModelCoefficients coeffs;//values为一个矩阵coeffs.values.push_back (0.0);coeffs.values.push_back (0.0);coeffs.values.push_back (0.02);coeffs.values.push_back (0.0);viewer->addPlane (coeffs, "plane");coeffs.values.clear ();coeffs.values.push_back (0.3);coeffs.values.push_back (0.3);coeffs.values.push_back (0.0);coeffs.values.push_back (0.0);coeffs.values.push_back (1.0);coeffs.values.push_back (0.0);coeffs.values.push_back (5.0);viewer->addCone (coeffs, "cone");return (viewer);}//显示法向量boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals){//创建3D窗口并添加点云其包括法线  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->setBackgroundColor (255, 255, 255);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");//viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");//法向量可以显示颜色吗?viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 500, 0.005, "normals");//viewer->addCoordinateSystem (1.0);viewer->initCameraParameters ();return (viewer);}//重头戏   用kdtree来搜索半径,boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2){// 创建3D窗口并添加显示点云其包括法线boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->initCameraParameters ();int v1(0);viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);cout<<v1<<endl;viewer->setBackgroundColor (0, 0, 0, v1);viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);int v2(0);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);cout<<v2<<endl;viewer->setBackgroundColor (0.3, 0.3, 0.3, v2);viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZRGB> (cloud, single_color, "sample cloud2", v2);viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");viewer->addCoordinateSystem (1.0);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, 10, 0.05, "normals1", v1);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, 10, 0.05, "normals2", v2);return (viewer);}int main(){int i = 0;CLasOperator clas;clas.readLasFile("dragon.las");std::vector<Point3D> &point3d = clas.getPointData();//pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);//使用智能指针效果最好boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB>> cloud(new pcl::PointCloud<pcl::PointXYZRGB>);boost::shared_ptr<pcl::PointCloud<pcl::Normal>> normals(new pcl::PointCloud<pcl::Normal>);//pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);cloud->points.resize (point3d.size());normals->points.resize(point3d.size());for(i = 0;i < point3d.size();i++){cloud->points[i].x = point3d[i].x;cloud->points[i].y = point3d[i].y;cloud->points[i].z = point3d[i].z;cloud->points[i].r = 255;normals->points[i].normal_x = 1;normals->points[i].normal_y = 1;normals->points[i].normal_z = 1;}cout<<cloud->size()<<endl;// 0.05为搜索半径获取点云法线pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;ne.setInputCloud (cloud);pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB>);ne.setSearchMethod (tree);pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);cloud_normals1->points.resize(point3d.size());ne.setRadiusSearch (0.005);//ne.compute (*cloud_normals1);//  0.1为搜索半径获取点云法线pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);cloud_normals2->points.resize(point3d.size());ne.setRadiusSearch (0.001);//ne.compute (*cloud_normals2);boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;viewer = viewportsVis(cloud,cloud_normals1,cloud_normals2);//viewer = shapesVis(cloud);//viewer = rgbVis(cloud);//viewer = simpleVis(cloud);//viewer = customColourVis(cloud);//viewer = normalsVis(cloud,normals);/*pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");viewer.showCloud(cloud);*///viewer.runOnVisualizationThreadOnce(viewOneOff);//while(!viewer.wasStopped())//{//}while (!viewer->wasStopped ()){   viewer->spinOnce(100);  // boost::this_thread::sleep (boost::posix_time::microseconds (100000));}}

0 0
原创粉丝点击