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 size_t min_cluster_size_ = 0;
76 size_t 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 ||
115 nn_indices[nii] >= static_cast<int>(processed.size()) ||
116 processed[nn_indices[nii]]) {
119 if (condition_function_(cloud_->at(current_cluster[cii]),
120 cloud_->at(nn_indices[nii]),
122 current_cluster.push_back(nn_indices[nii]);
123 processed[nn_indices[nii]] =
true;
129 if (extract_removed_clusters_ ||
130 (current_cluster.size() >= min_cluster_size_ &&
131 current_cluster.size() <= max_cluster_size_)) {
133 pi.
indices.resize(current_cluster.size());
134 for (
int ii = 0; ii < static_cast<int>(current_cluster.size()); ++ii) {
135 pi.
indices[ii] = current_cluster[ii];
138 if (extract_removed_clusters_ &&
139 current_cluster.size() < min_cluster_size_) {
140 small_clusters_->push_back(pi);
141 }
else if (extract_removed_clusters_ &&
142 current_cluster.size() > max_cluster_size_) {
143 large_clusters_->push_back(pi);
145 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
virtual ~ConditionClustering()=default
std::vector< int > indices
Definition: point.h:75
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
std::vector< base::PointIndices > IndicesClusters
Definition: conditional_clustering.h:34
Definition: conditional_clustering.h:32
Definition: point_cloud.h:37
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_max_cluster_size(size_t size)
Definition: conditional_clustering.h:68
void Segment(IndicesClusters *xy_clusters)
Definition: conditional_clustering.h:89
void set_min_cluster_size(size_t size)
Definition: conditional_clustering.h:66