點雲雙窗口顯示

http://blog.csdn.net/u013682388/article/details/41084467


  1. #include <pcl/point_cloud.h>  
  2. #include <pcl/kdtree/kdtree_flann.h>  
  3. #include<pcl/point_types.h>  
  4. #include <pcl/io/pcd_io.h>  
  5. #include <iostream>  
  6. #include <vector>  
  7. #include <ctime>  
  8. #include<pcl/visualization/cloud_viewer.h>  
  9. #include <boost/thread/thread.hpp>  
  10. #include <pcl/common/common_headers.h>  
  11. #include <pcl/common/common_headers.h>  
  12. #include <pcl/features/normal_3d.h>  
  13. #include <pcl/console/parse.h>  
  14. #include "las_file.h"  
  15.   
  16. //加入自己的數據類型  
  17.   
  18. using namespace std;  
  19.   
  20. //  
  21. //void viewOneOff(pcl::visualization::PCLVisualizer& viewer)  
  22. //{  
  23. //  viewer.setBackgroundColor(1,1,1);  
  24. //}  
  25.   
  26. //可視化單個點雲  
  27. boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)  
  28. {  
  29.     //創建3D窗口並添加點雲  
  30.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  
  31.     viewer->setBackgroundColor (0.5,0.5,0.5);  
  32.     viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");  
  33.     viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");  
  34.     viewer->addCoordinateSystem (0.1);  
  35.     viewer->initCameraParameters ();  
  36.     return (viewer);  
  37. }  
  38.   
  39. //可視化點雲顏色特徵  
  40. boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)  
  41. {  
  42.     //創建3D窗口並添加點雲     
  43.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  
  44.     viewer->setBackgroundColor (1, 1, 1);  
  45.     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);  
  46.     viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");  
  47.     //viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");  
  48.     //viewer->addCoordinateSystem (1.0);  
  49.     viewer->initCameraParameters ();  
  50.     return (viewer);  
  51. }  
  52.  
  53. boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)  
  54. {  
  55.     //創建3D窗口並添加點雲  
  56.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  
  57.     viewer->setBackgroundColor (1, 1, 1);  
  58.     pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);  
  59.     viewer->addPointCloud<pcl::PointXYZ> (cloud, single_color, "sample cloud");  
  60.     //viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");  
  61.     //viewer->addCoordinateSystem (1.0);  
  62.     viewer->initCameraParameters ();  
  63.     return (viewer);  
  64. }  

  65. boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)  
  66. {  
  67.     //創建3D窗口並添加點雲      
  68.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  
  69.     viewer->setBackgroundColor (255, 255, 255);  
  70.     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);  
  71.     viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");  
  72.     //viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");  
  73.     viewer->addCoordinateSystem (0.05);  
  74.     viewer->initCameraParameters ();  
  75.     //在點雲上添加直線和球體模型  
  76.       
  77.     viewer->addLine<pcl::PointXYZRGB> (cloud->points[0],  
  78.         cloud->points[cloud->size() - 1], "line");  
  79.     //0.2爲半徑  後面爲顏色  
  80.     viewer->addSphere (cloud->points[0], 0.02, 0.5, 0.5, 0.0, "sphere");  
  81.     //在其他位置添加基於模型參數的平面及圓錐體  
  82.     pcl::ModelCoefficients coeffs;  
  83.     //values爲一個矩陣  
  84.     coeffs.values.push_back (0.0);  
  85.     coeffs.values.push_back (0.0);  
  86.     coeffs.values.push_back (0.02);  
  87.     coeffs.values.push_back (0.0);  
  88.     viewer->addPlane (coeffs, "plane");  
  89.     coeffs.values.clear ();  
  90.     coeffs.values.push_back (0.3);  
  91.     coeffs.values.push_back (0.3);  
  92.     coeffs.values.push_back (0.0);  
  93.     coeffs.values.push_back (0.0);  
  94.     coeffs.values.push_back (1.0);  
  95.     coeffs.values.push_back (0.0);  
  96.     coeffs.values.push_back (5.0);  
  97.     viewer->addCone (coeffs, "cone");  
  98.   
  99.     return (viewer);  
  100. }  
  101.   
  102. //顯示法向量  
  103. boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud,   
  104.     pcl::PointCloud<pcl::Normal>::ConstPtr normals)  
  105. {  
  106.     //創建3D窗口並添加點雲其包括法線    
  107.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  
  108.     viewer->setBackgroundColor (255, 255, 255);  
  109.     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);  
  110.     viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");  
  111.     //viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");  
  112.     //法向量可以顯示顏色嗎?  
  113.     viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 500, 0.005, "normals");  
  114.     //viewer->addCoordinateSystem (1.0);  
  115.     viewer->initCameraParameters ();  
  116.     return (viewer);  
  117. }  
  118.   
  119. //重頭戲   用kdtree來搜索半徑,  
  120. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud,   
  121.     pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)  
  122. {  
  123.     // 創建3D窗口並添加顯示點雲其包括法線  
  124.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  
  125.     viewer->initCameraParameters ();  
  126.     int v1(0);  
  127.     viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);  
  128.     cout<<v1<<endl;  
  129.     viewer->setBackgroundColor (0, 0, 0, v1);  
  130.     viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);  
  131.     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);  
  132.     viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);  
  133.     int v2(0);  
  134.     viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);  
  135.     cout<<v2<<endl;  
  136.     viewer->setBackgroundColor (0.3, 0.3, 0.3, v2);  
  137.     viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);  
  138.     pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);  
  139.     viewer->addPointCloud<pcl::PointXYZRGB> (cloud, single_color, "sample cloud2", v2);  
  140.   
  141.     viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");  
  142.     viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");  
  143.     viewer->addCoordinateSystem (1.0);  
  144.   
  145.     viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, 10, 0.05, "normals1", v1);  
  146.     viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, 10, 0.05, "normals2", v2);  
  147.   
  148.     return (viewer);  
  149. }  

  150. int main()  
  151. {  
  152.     int i = 0;  
  153.     CLasOperator clas;  
  154.     clas.readLasFile("dragon.las");  
  155.     std::vector<Point3D> &point3d = clas.getPointData();  
  156.   
  157.     //pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);  
  158.     //使用智能指針效果最好  
  159.     boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB>> cloud(new pcl::PointCloud<pcl::PointXYZRGB>);  
  160.     boost::shared_ptr<pcl::PointCloud<pcl::Normal>> normals(new pcl::PointCloud<pcl::Normal>);  
  161.     //pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);  
  162.     cloud->points.resize (point3d.size());  
  163.     normals->points.resize(point3d.size());  
  164.     for(i = 0;i < point3d.size();i++)  
  165.     {  
  166.         cloud->points[i].x = point3d[i].x;  
  167.         cloud->points[i].y = point3d[i].y;  
  168.         cloud->points[i].z = point3d[i].z;  
  169.         cloud->points[i].r = 255;  
  170.         normals->points[i].normal_x = 1;  
  171.         normals->points[i].normal_y = 1;  
  172.         normals->points[i].normal_z = 1;  
  173.     }  
  174.       
  175.     cout<<cloud->size()<<endl;  
  176.     // 0.05爲搜索半徑獲取點雲法線  
  177.     pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;  
  178.   
  179.     ne.setInputCloud (cloud);  
  180.     pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB>);  
  181.     ne.setSearchMethod (tree);  
  182.   
  183.     pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);  
  184.     cloud_normals1->points.resize(point3d.size());  
  185.     ne.setRadiusSearch (0.005);  
  186.     //ne.compute (*cloud_normals1);  
  187.     //  0.1爲搜索半徑獲取點雲法線  
  188.     pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);  
  189.     cloud_normals2->points.resize(point3d.size());  
  190.     ne.setRadiusSearch (0.001);  
  191.     //ne.compute (*cloud_normals2);  
  192.   
  193.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;  
  194.       
  195.     viewer = viewportsVis(cloud,cloud_normals1,cloud_normals2);  
  196.   
  197.   
  198.     //viewer = shapesVis(cloud);  
  199.     //viewer = rgbVis(cloud);  
  200.     //viewer = simpleVis(cloud);  
  201.     //viewer = customColourVis(cloud);  
  202.     //viewer = normalsVis(cloud,normals);  
  203.   
  204.   
  205.     /*pcl::visualization::CloudViewer viewer("Simple Cloud Viewer"); 
  206.     viewer.showCloud(cloud);*/  
  207.   
  208.     //viewer.runOnVisualizationThreadOnce(viewOneOff);  
  209.     //while(!viewer.wasStopped())  
  210.     //{  
  211.   
  212.     //}  
  213.     while (!viewer->wasStopped ())  
  214.     {  
  215.        viewer->spinOnce(100);  
  216.       // boost::this_thread::sleep (boost::posix_time::microseconds (100000));  
  217.     }  
  218. }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章