27 namespace perception {
31 template <
typename Po
intT>
38 : min_cluster_size_(1),
39 max_cluster_size_(std::numeric_limits<int>::max()),
40 extract_removed_clusters_(extract_removed_clusters),
54 int (*candidate_function)(
const PointT&,
void*, std::vector<int>*)) {
55 candidate_function_ = candidate_function;
63 condition_function_ = condition_function;
74 typename std::shared_ptr<base::PointCloud<PointT>> cloud_;
75 int min_cluster_size_ = 0;
76 int max_cluster_size_ = 0;
77 bool extract_removed_clusters_ =
true;
78 std::shared_ptr<IndicesClusters> small_clusters_;
79 std::shared_ptr<IndicesClusters> large_clusters_;
80 bool (*condition_function_)(
const PointT&,
const PointT&,
81 void* param) =
nullptr;
82 int (*candidate_function_)(
const PointT&,
void*,
83 std::vector<int>* nn_indices_ptr) =
nullptr;
84 void* candidate_param_ =
nullptr;
85 void* condition_param_ =
nullptr;
88 template <
typename Po
intT>
90 std::vector<int> nn_indices;
91 nn_indices.reserve(200);
92 std::vector<bool> processed(cloud_->size(),
false);
94 for (std::size_t iii = 0; iii < cloud_->size(); ++iii) {
99 std::vector<int> current_cluster;
100 current_cluster.reserve(200);
102 current_cluster.push_back(static_cast<int>(iii));
103 processed[iii] =
true;
106 while (cii < current_cluster.size()) {
108 if (candidate_function_(cloud_->at(current_cluster[cii]),
109 candidate_param_, &nn_indices) < 1) {
113 for (std::size_t nii = 1; nii < nn_indices.size(); ++nii) {
114 if (nn_indices[nii] < 0 || nn_indices[nii] >= processed.size() ||
115 processed[nn_indices[nii]]) {
118 if (condition_function_(cloud_->at(current_cluster[cii]),
119 cloud_->at(nn_indices[nii]),
121 current_cluster.push_back(nn_indices[nii]);
122 processed[nn_indices[nii]] =
true;
128 if (extract_removed_clusters_ ||
129 (current_cluster.size() >= min_cluster_size_ &&
130 current_cluster.size() <= max_cluster_size_)) {
132 pi.
indices.resize(current_cluster.size());
133 for (
int ii = 0; ii < static_cast<int>(current_cluster.size()); ++ii) {
134 pi.
indices[ii] = current_cluster[ii];
137 if (extract_removed_clusters_ &&
138 current_cluster.size() < min_cluster_size_) {
139 small_clusters_->push_back(pi);
140 }
else if (extract_removed_clusters_ &&
141 current_cluster.size() > max_cluster_size_) {
142 large_clusters_->push_back(pi);
144 xy_clusters->push_back(pi);
void set_cloud(typename std::shared_ptr< base::PointCloud< PointT >> cloud)
Definition: conditional_clustering.h:46
void set_condition_param(void *param)
Definition: conditional_clustering.h:58
void set_max_cluster_size(int size)
Definition: conditional_clustering.h:68
virtual ~ConditionClustering()=default
std::vector< int > indices
Definition: point.h:76
std::vector< base::PointIndices > IndicesClusters
Definition: conditional_clustering.h:34
Definition: conditional_clustering.h:32
Definition: point_cloud.h:33
void set_candidate_function(int(*candidate_function)(const PointT &, void *, std::vector< int > *))
Definition: conditional_clustering.h:53
void set_candidate_param(void *param)
Definition: conditional_clustering.h:51
ConditionClustering()=default
void set_condition_function(bool(*condition_function)(const PointT &, const PointT &, void *param))
Definition: conditional_clustering.h:60
ConditionClustering(bool extract_removed_clusters=false)
Definition: conditional_clustering.h:37
void set_min_cluster_size(int size)
Definition: conditional_clustering.h:66
void Segment(IndicesClusters *xy_clusters)
Definition: conditional_clustering.h:89