95 {
96 std::vector<algorithm::Edge> edge_set;
97 edge_set.clear();
98 algorithm::Edge edge;
99 for (int x = 0; x < grid_height_; ++x) {
100 for (int y = 0; y < grid_width_; ++y) {
101 int grid_idx = x * grid_width_ + y;
102 if (!bg_map_.
bg_nodes_.at(grid_idx).is_valid) {
103 continue;
104 }
105
106 edge.a = bg_map_.
bg_nodes_.at(grid_idx).id;
107 BgNode n1 = bg_map_.
bg_nodes_.at(grid_idx);
108
109
110 for (int ny = y; ny < grid_width_ && ny <= y + search_radius_; ++ny) {
111 int grid_ny = x * grid_width_ + ny;
112 if (bg_map_.
bg_nodes_.at(grid_ny).is_valid) {
113 edge.b = bg_map_.
bg_nodes_.at(grid_ny).id;
114 BgNode n2 = bg_map_.
bg_nodes_.at(grid_ny);
116 edge_set.push_back(edge);
117 }
118 }
119
120 for (int nx = x + 1; nx < grid_height_ && nx <= x + search_radius_; ++nx) {
121 for (int ny = y; ny < grid_width_ && ny < y + search_radius_; ++ny) {
122 int grid_nxny = nx * grid_width_ + ny;
123 if (bg_map_.
bg_nodes_.at(grid_nxny).is_valid) {
124 edge.b = bg_map_.
bg_nodes_.at(grid_nxny).id;
125 BgNode n2 = bg_map_.
bg_nodes_.at(grid_nxny);
127 edge_set.push_back(edge);
128 }
129 }
130 }
131 }
132 }
133
134 if (edge_set.size() == 0) {
135 AINFO <<
"Graph segmentation, edges are empty.";
136 return true;
137 }
138
139
140 graph_segmentor_.
SegmentGraph(bg_map_.
id(), edge_set.size(), edge_set.data());
142 std::vector<size_t> mapping(bg_map_.
id(), 0);
143 std::map<size_t, size_t> label_map;
144 size_t label = 0;
145 for (
int i = 0; i < bg_map_.
id(); ++i) {
146 mapping[i] = universe->Find(i);
147 auto iter = label_map.find(mapping[i]);
148 if (iter == label_map.end()) {
149
150 label_map.emplace(mapping[i], label);
151 mapping[i] = label;
152 label++;
153 } else {
154 mapping[i] = iter->second;
155 }
156 }
157
158
159 auto original_cloud = frame->cloud;
160
162 clusters_.
resize(label_map.size());
163 for (
size_t i = 0; i < bg_map_.
point_mask_.size(); ++i) {
165 continue;
166 }
168 size_t cluster_label = mapping.at(bg_map_.
bg_nodes_.at(index).id);
169 clusters_.
AddPointSample(cluster_label, original_cloud->at(i), original_cloud->points_height(i), i);
170 }
172
173 for (
int i = 0; i <= clusters_.
size() - 1; i++) {
174 clusters_[i]->clear();
175 }
177
178 return true;
179}
Universe * mutable_universe()
void SegmentGraph(const int num_vertices, const int num_edges, Edge *edges, bool need_sort=true)
std::vector< size_t > point_idx_
int id()
Get valid node number
std::vector< BgNode > bg_nodes_
std::vector< bool > point_mask_
float NodeDistance(BgNode n1, int x1, int y1, BgNode n2, int x2, int y2)
Compute node distance
void GetObjectsFromClusters(LidarFrame *frame)
Get the Objects From Clusters
void AddPointSample(size_t cluster_id, const base::PointF &point, float height, uint32_t point_id)