机载激光雷达电力线巡检点云分类第一步,将点云数据投影到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 }