点云数据x-y平面网格化(电力线巡检点云分类step1)

 机载激光雷达电力线巡检点云分类第一步,将点云数据投影到x-y平面网格划分,以下代码利用libLAS库读取las点云数据,利用pcl库对点云数据进行处理。
参考https://blog.csdn.net/ethan_guo/article/details/80621998
1
#include <vtkAutoInit.h> 2 #include <QCoreApplication> 3 #include <QDebug> 4 #include <iostream> 5 #include <QVector> 6 #include <liblas/liblas.hpp> 7 #include <pcl/io/pcd_io.h> 8 #include <pcl/point_cloud.h> 9 #include <pcl/point_types.h> 10 #include <pcl/console/print.h> 11 #include <pcl/filters/extract_indices.h> 12 #include <pcl/visualization/cloud_viewer.h> 13 #include <pcl/visualization/pcl_visualizer.h> 14 using namespace std; 15 VTK_MODULE_INIT(vtkRenderingOpenGL) 16 //定义一个网格类型 17 class Grid 18 { 19 public: 20 bool powerLine; //是否为电力线网格 21 float h_mean; //平均高程 22 float h_max; //最大高程 23 float h_min; //最小高程 24 int num; //点个数 25 pcl::PointCloud<pcl::PointXYZRGB>::Ptr grid_cloud {new pcl::PointCloud<pcl::PointXYZRGB>}; //网格内点云 26 pcl::PointIndices::Ptr grid_inliers {new pcl::PointIndices}; //网格内点云索引 27 }; 28 int main(int argc, char *argv[]) 29 { 30 QCoreApplication a(argc, argv); 31 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in (new pcl::PointCloud<pcl::PointXYZRGB>); //输入点云 32 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZRGB>); //输出点云 33 ifstream ifs("F:/lidar/powerLine/pointCloud/pt000001.las", std::ios::in | std::ios::binary); 34 liblas::ReaderFactory f; 35 liblas::Reader reader = f.CreateWithStream(ifs); 36 unsigned long intnPoints = reader.GetHeader().GetPointRecordsCount(); 37 double maxX = reader.GetHeader().GetMaxX(); 38 double maxY = reader.GetHeader().GetMaxY(); 39 double maxZ = reader.GetHeader().GetMaxZ(); 40 double minX = reader.GetHeader().GetMinX(); 41 double minY = reader.GetHeader().GetMinY(); 42 double minZ = reader.GetHeader().GetMinZ(); 43 printf("intnPoints is %ld\n", intnPoints); 44 printf("maxX is %lf\nmaxY is %lf\nmaxZ is %lf\nminX is %lf\nminY is %lf\nminZ is %lf\n", maxX, maxY, maxZ, minX, minY, minZ); 45 cloud_in->width = intnPoints; 46 cloud_in->height = 1; 47 cloud_in->is_dense = false; 48 cloud_in->resize(intnPoints); 49 int k = 0; 50 while(reader.ReadNextPoint()) 51 { 52 cloud_in->points[k].x = reader.GetPoint().GetX(); 53 cloud_in->points[k].y = reader.GetPoint().GetY(); 54 cloud_in->points[k].z = reader.GetPoint().GetZ(); 55 k++; 56 } 57 //定义一个抽取器 58 pcl::ExtractIndices<pcl::PointXYZRGB> extract; 59 float grid_size = 30.0; 60 QVector<QVector<Grid>> grid; 61 grid.resize(20); 62 for(int h = 0; h < 20; ++h) 63 { 64 grid[h].resize(20); 65 } 66 int j; 67 int i; 68 int l = 0; 69 for(size_t m = 0; m < cloud_in->size(); m++) 70 { 71 i = floor(fabs(cloud_in->points[m].x / grid_size)); 72 j = floor(fabs(cloud_in->points[m].y / grid_size)); 73 grid[i][j].grid_cloud->push_back(cloud_in->points[m]); 74 grid[i][j].grid_inliers->indices.push_back(m); 75 grid[i][j].grid_inliers->header = cloud_in->header; 76 } 77 std::cout << "grid.size() is "<<grid.size()<<std::endl; 78 std::cout << grid[4][5].grid_inliers->indices.size()<<std::endl; 79 pcl::PointIndices::Ptr Indices (new pcl::PointIndices); 80 for(int i = 0; i < grid.size(); ++i) 81 { 82 for(int j = 0; j < grid[i].size(); ++j) 83 { 84 if(grid[i][j].grid_inliers->indices.size() < 100) 85 { 86 std::cout<< "grid["<<i<<"]["<<j<<"]" << "is empty"<<std::endl; 87 }else { 88 std::cout<< "grid["<<i<<"]["<<j<<"]" << " has "<< grid[i][j].grid_inliers->indices.size() << " points!"<<std::endl; 89 Indices->indices.insert(Indices->indices.end(), grid[i][j].grid_inliers->indices.begin(), grid[i][j].grid_inliers->indices.end()); 90 if((i+j)%2 == 0) 91 { 92 for(int k = 0; k < grid[i][j].grid_cloud->width; ++k) 93 { 94 grid[i][j].grid_cloud->points[k].r = 127; 95 grid[i][j].grid_cloud->points[k].g = 255; 96 grid[i][j].grid_cloud->points[k].b = 0; 97 int indice = grid[i][j].grid_inliers->indices[k]; 98 cloud_in->points[indice].r = 127; 99 cloud_in->points[indice].g = 255; 100 cloud_in->points[indice].b = 0; 101 } 102 }else { 103 for(int k = 0; k < grid[i][j].grid_cloud->width; ++k) 104 { 105 grid[i][j].grid_cloud->points[k].r = 255; 106 grid[i][j].grid_cloud->points[k].g = 20; 107 grid[i][j].grid_cloud->points[k].b = 147; 108 int indice = grid[i][j].grid_inliers->indices[k]; 109 cloud_in->points[indice].r = 255; 110 cloud_in->points[indice].g = 20; 111 cloud_in->points[indice].b = 147; 112 } 113 } 114 } 115 } 116 } 117 extract.setInputCloud(cloud_in); 118 extract.setIndices(Indices); 119 extract.setNegative(false); 120 extract.filter(*cloud_out); 121 122 pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("powerLine")); 123 viewer->setBackgroundColor(0, 0, 0); 124 viewer->addCoordinateSystem(1.0); 125 pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud_out); 126 viewer->addPointCloud(cloud_out, rgb, "cloud grid"); 127 viewer->initCameraParameters(); 128 while(!viewer->wasStopped()) 129 { 130 viewer->spinOnce(100); 131 boost::this_thread::sleep(boost::posix_time::microseconds(100000)); 132 } 133 134 return a.exec(); 135 }

猜你喜欢

转载自www.cnblogs.com/yunliuh/p/13395687.html