40#ifndef PCL_UNARY_CLASSIFIER_HPP_
41#define PCL_UNARY_CLASSIFIER_HPP_
44#include <flann/flann.hpp>
45#include <flann/algorithms/dist.h>
46#include <flann/algorithms/linear_index.h>
47#include <flann/util/matrix.h>
49#include <pcl/segmentation/unary_classifier.h>
50#include <pcl/common/io.h>
53template <
typename Po
intT>
57 normal_radius_search_ (0.01f),
58 fpfh_radius_search_ (0.05f),
59 feature_threshold_ (5.0)
64template <
typename Po
intT>
70template <
typename Po
intT>
void
76 std::vector<pcl::PCLPointField> fields;
86template <
typename Po
intT>
void
91 out->points.resize (
in->
size ());
92 out->width = out->size ();
94 out->is_dense =
false;
96 for (std::size_t i = 0; i <
in->
size (); i++)
100 point.x = (*in)[i].x;
101 point.y = (*in)[i].y;
102 point.z = (*in)[i].z;
107template <
typename Po
intT>
void
114 out->points.resize (
in->
size ());
115 out->width = out->size ();
117 out->is_dense =
false;
119 for (std::size_t i = 0; i <
in->
size (); i++)
123 point.x = (*in)[i].x;
124 point.y = (*in)[i].y;
125 point.z = (*in)[i].z;
134template <
typename Po
intT>
void
139 std::vector <pcl::PCLPointField> fields;
146 for (
const auto& point: *
in)
150 memcpy (&label,
reinterpret_cast<const char*
> (&point) + fields[
label_idx].offset,
sizeof(std::uint32_t));
169template <
typename Po
intT>
void
175 std::vector <pcl::PCLPointField> fields;
181 for (
const auto& point : (*in))
185 memcpy (&label,
reinterpret_cast<const char*
> (&point) + fields[
label_idx].offset,
sizeof(std::uint32_t));
187 if (
static_cast<int> (label) ==
label_num)
194 out->push_back (
tmp);
197 out->width = out->size ();
199 out->is_dense =
false;
204template <
typename Po
intT>
void
217 n3d.setInputCloud (
in);
218 n3d.compute (*normals);
223 fpfh.setInputNormals (normals);
226 fpfh.setSearchMethod (tree);
233template <
typename Po
intT>
void
239 kmeans.setClusterSize (k);
242 for (
const auto &point :
in->points)
244 std::vector<float> data (33);
245 for (
int idx = 0; idx < 33; idx++)
246 data[idx] = point.histogram[idx];
247 kmeans.addDataPoint (data);
259 out->is_dense =
false;
265 for (
int idx = 0; idx < 33; idx++)
272template <
typename Po
intT>
void
276 std::vector<float> &
dist)
289 const auto c = hist->size ();
290 for (std::size_t i = 0; i <
c; ++i)
291 for (std::size_t j = 0; j < data.cols; ++j)
292 data[(k *
c) + i][j] = (*hist)[i].histogram[j];
301 index->buildIndex ();
315 index->knnSearch (p, indices, distances, k, flann::SearchParams (512));
317 indi[i] = indices[0][0];
318 dist[i] = distances[0][0];
325 delete[] data.ptr ();
329template <
typename Po
intT>
void
331 std::vector<float> &
dist,
338 for (std::size_t i = 0; i < out->size (); i++)
342 float l =
static_cast<float> (
indi[i]) /
nfm;
346 int label =
static_cast<int> (
intpart);
348 (*out)[i].label = label+2;
355template <
typename Po
intT>
void
364 computeFPFH (
tmp_cloud, feature, normal_radius_search_, fpfh_radius_search_);
369 kmeansClustering (feature,
output, cluster_size_);
373template <
typename Po
intT>
void
380 std::cout <<
"cluster numbers: ";
383 std::cout << std::endl;
393 computeFPFH (
label_cloud, feature, normal_radius_search_, fpfh_radius_search_);
404template <
typename Po
intT>
void
407 if (!trained_features_.empty ())
419 std::vector<float> distance;
424 convertCloud (input_cloud_, out);
425 assignLabels (indices, distance,
n_feature_means, feature_threshold_, out);
429 PCL_ERROR (
"no training features set \n");
433#define PCL_INSTANTIATE_UnaryClassifier(T) template class pcl::UnaryClassifier<T>;
Iterator class for point clouds with or without given indices.
std::size_t size() const
Size of the range the iterator is going through.
std::vector< Point > Centroids
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< PointT > > Ptr
void segment(pcl::PointCloud< pcl::PointXYZRGBL >::Ptr &out)
void setInputCloud(typename pcl::PointCloud< PointT >::Ptr input_cloud)
This method sets the input cloud.
void train(pcl::PointCloud< pcl::FPFHSignature33 >::Ptr &output)
void queryFeatureDistances(std::vector< pcl::PointCloud< pcl::FPFHSignature33 >::Ptr > &trained_features, pcl::PointCloud< pcl::FPFHSignature33 >::Ptr query_features, pcl::Indices &indi, std::vector< float > &dist)
void assignLabels(pcl::Indices &indi, std::vector< float > &dist, int n_feature_means, float feature_threshold, pcl::PointCloud< pcl::PointXYZRGBL >::Ptr out)
void computeFPFH(pcl::PointCloud< pcl::PointXYZ >::Ptr in, pcl::PointCloud< pcl::FPFHSignature33 >::Ptr out, float normal_radius_search, float fpfh_radius_search)
UnaryClassifier()
Constructor that sets default values for member variables.
void findClusters(typename pcl::PointCloud< PointT >::Ptr in, std::vector< int > &cluster_numbers)
~UnaryClassifier()
This destructor destroys the cloud...
void trainWithLabel(std::vector< pcl::PointCloud< pcl::FPFHSignature33 >, Eigen::aligned_allocator< pcl::PointCloud< pcl::FPFHSignature33 > > > &output)
void getCloudWithLabel(typename pcl::PointCloud< PointT >::Ptr in, pcl::PointCloud< pcl::PointXYZ >::Ptr out, int label_num)
void convertCloud(typename pcl::PointCloud< PointT >::Ptr in, pcl::PointCloud< pcl::PointXYZ >::Ptr out)
void kmeansClustering(pcl::PointCloud< pcl::FPFHSignature33 >::Ptr in, pcl::PointCloud< pcl::FPFHSignature33 >::Ptr out, int k)
search::KdTree is a wrapper class which inherits the pcl::KdTree class for performing search function...
shared_ptr< KdTree< PointT, Tree > > Ptr
IndicesAllocator<> Indices
Type used for indices in PCL.
A point structure representing the Fast Point Feature Histogram (FPFH).
A point structure representing Euclidean xyz coordinates.
A point structure representing Euclidean xyz coordinates, and the RGB color.