ground_segmentation 1.0
Ground segmentation in pointcloud
Loading...
Searching...
No Matches
pointcloud_processor.hpp
Go to the documentation of this file.
1
12#pragma once
13
14#include <pcl/io/pcd_io.h>
15#include <pcl/common/common.h>
16#include <pcl/filters/extract_indices.h>
17#include <pcl/filters/voxel_grid.h>
18#include <pcl/filters/crop_box.h>
19#include <pcl/kdtree/kdtree.h>
20#include <pcl/segmentation/sac_segmentation.h>
21#include <pcl/segmentation/extract_clusters.h>
22#include <pcl/features/moment_of_inertia_estimation.h>
23#include <pcl/common/transforms.h>
24#include <iostream>
25#include <string>
26#include <vector>
27#include <ctime>
28#include <chrono>
29#include <unordered_set>
30
31namespace ground_segmentation
32{
33
34template<typename PointT>
36{
37
38public:
39 typename pcl::PointCloud<PointT>::Ptr filterCloud(
40 typename pcl::PointCloud<PointT>::Ptr cloud, bool downSampleInputCloud, float filterRes,
41 Eigen::Vector4f minPoint,
42 Eigen::Vector4f maxPoint,
43 bool invertCropBox);
44
45 std::vector<typename pcl::PointCloud<PointT>::Ptr> euclideanClustering(
46 typename pcl::PointCloud<PointT>::Ptr cloud,
47 float clusterTolerance, int minSize, int maxSize);
48
49 void savePcd(typename pcl::PointCloud<PointT>::Ptr cloud, std::string file);
50 typename pcl::PointCloud<PointT>::Ptr loadPcd(std::string file);
51};
52
53template<typename PointT>
54typename pcl::PointCloud<PointT>::Ptr ProcessCloudProcessor<PointT>::filterCloud(
55 typename pcl::PointCloud<PointT>::Ptr cloud,
56 bool downSampleInputCloud,
57 float filterRes,
58 Eigen::Vector4f minPoint,
59 Eigen::Vector4f maxPoint,
60 bool invertCropBox
61)
62{
63 typename pcl::PointCloud<PointT>::Ptr cloud_filtered(new pcl::PointCloud<PointT>());
64 pcl::CropBox<PointT> roi;
65 roi.setMin(minPoint);
66 roi.setMax(maxPoint);
67 roi.setNegative(invertCropBox);
68
69 if (downSampleInputCloud) {
70 pcl::VoxelGrid<PointT> sor;
71 sor.setInputCloud(cloud);
72 sor.setLeafSize(filterRes, filterRes, filterRes);
73 sor.filter(*cloud_filtered);
74 roi.setInputCloud(cloud_filtered);
75 } else {
76 roi.setInputCloud(cloud);
77 }
78 roi.filter(*cloud_filtered);
79 return cloud_filtered;
80}
81
82template<typename PointT>
83std::vector<typename pcl::PointCloud<PointT>::Ptr> ProcessCloudProcessor<PointT>::
85 typename pcl::PointCloud<PointT>::Ptr cloud,
86 float clusterTolerance, int minSize, int maxSize)
87{
88 std::vector<typename pcl::PointCloud<PointT>::Ptr> clusters;
89 typename pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
90 tree->setInputCloud(cloud);
91
92 std::vector<pcl::PointIndices> cluster_indices;
93 pcl::EuclideanClusterExtraction<PointT> ec;
94 ec.setClusterTolerance(clusterTolerance);
95 ec.setMinClusterSize(minSize);
96 ec.setMaxClusterSize(maxSize);
97 ec.setSearchMethod(tree);
98 ec.setInputCloud(cloud);
99 ec.extract(cluster_indices);
100
101 for (const auto & cluster : cluster_indices) {
102 typename pcl::PointCloud<PointT>::Ptr cloud_cluster(new pcl::PointCloud<PointT>);
103 for (const auto & idx : cluster.indices) {
104 cloud_cluster->push_back((*cloud)[idx]);
105 }
106 cloud_cluster->width = cloud_cluster->size();
107 cloud_cluster->height = 1;
108 cloud_cluster->is_dense = true;
109 clusters.push_back(cloud_cluster);
110 }
111 return clusters;
112}
113
114template<typename PointT>
116 typename pcl::PointCloud<PointT>::Ptr cloud,
117 std::string file)
118{
119 pcl::io::savePCDFileASCII(file, *cloud);
120}
121
122template<typename PointT>
123typename pcl::PointCloud<PointT>::Ptr ProcessCloudProcessor<PointT>::loadPcd(std::string file)
124{
125 typename pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
126 if (pcl::io::loadPCDFile<PointT>(file, *cloud) == -1) { //* load the file
127 std::cerr << "Failed to read PCD file: " << file << std::endl;
128 }
129 return cloud;
130}
131} //namespace ground_segmentation
pcl::PointCloud< PointT >::Ptr filterCloud(typename pcl::PointCloud< PointT >::Ptr cloud, bool downSampleInputCloud, float filterRes, Eigen::Vector4f minPoint, Eigen::Vector4f maxPoint, bool invertCropBox)
void savePcd(typename pcl::PointCloud< PointT >::Ptr cloud, std::string file)
pcl::PointCloud< PointT >::Ptr loadPcd(std::string file)
std::vector< typename pcl::PointCloud< PointT >::Ptr > euclideanClustering(typename pcl::PointCloud< PointT >::Ptr cloud, float clusterTolerance, int minSize, int maxSize)