Commit cd05f4c68f8fcf129b1f94894eb7242d0b869093

Authored by Hu Chunming
1 parent 01b357d4

完善pase_road

src/ai_engine_module/RoadSegAnalysis.cpp
@@ -63,9 +63,9 @@ std::vector<RoadInfo> RoadSegAnalysis::detect(vector<sy_img> vec_img){ @@ -63,9 +63,9 @@ std::vector<RoadInfo> RoadSegAnalysis::detect(vector<sy_img> vec_img){
63 63
64 for (int b = 0; b < batchsize; b++) { 64 for (int b = 0; b < batchsize; b++) {
65 auto one_result = results[b]; 65 auto one_result = results[b];
66 - RoadInfo one_road;  
67 - one_road.vec_line = parse_line(one_result, vec_img[b]);  
68 - one_road.vec_road = parse_road(one_result, vec_img[b]); 66 + RoadInfo one_road = parse_road(one_result, vec_img[b]);
  67 + // one_road.vec_line = parse_line(one_result, vec_img[b]);
  68 + // one_road.vec_road = parse_road(one_road, one_result, vec_img[b]);
69 one_road.vec_direct = parse_direct(one_result, vec_img[b]); 69 one_road.vec_direct = parse_direct(one_result, vec_img[b]);
70 vec_road_info.push_back(one_road); 70 vec_road_info.push_back(one_road);
71 } 71 }
@@ -147,14 +147,14 @@ cv::Mat mask_to_rgb(cv::Mat img, cv::Mat mask) { @@ -147,14 +147,14 @@ cv::Mat mask_to_rgb(cv::Mat img, cv::Mat mask) {
147 return masks; 147 return masks;
148 } 148 }
149 149
150 -std::vector<SegInfo> RoadSegAnalysis::parse_road(rs_result one_result, sy_img src) 150 +RoadInfo RoadSegAnalysis::parse_road(rs_result one_result, sy_img src)
151 { 151 {
152 int src_width = src.w_; 152 int src_width = src.w_;
153 int src_height = src.h_; 153 int src_height = src.h_;
154 float scale_w = src_width / 640.0; 154 float scale_w = src_width / 640.0;
155 float scale_h = src_height / 360.0; 155 float scale_h = src_height / 360.0;
156 156
157 - std::vector<SegInfo> vec_road; 157 + RoadInfo one_road;
158 158
159 std::vector<std::pair<std::vector<cv::Point>, int>> combined; 159 std::vector<std::pair<std::vector<cv::Point>, int>> combined;
160 lanes_process(one_result.reg_array, one_result.lane_count, combined); 160 lanes_process(one_result.reg_array, one_result.lane_count, combined);
@@ -167,88 +167,82 @@ std::vector&lt;SegInfo&gt; RoadSegAnalysis::parse_road(rs_result one_result, sy_img sr @@ -167,88 +167,82 @@ std::vector&lt;SegInfo&gt; RoadSegAnalysis::parse_road(rs_result one_result, sy_img sr
167 cv::Mat seg_output = seg_post_process(large_resolution, one_result.seg_array, combined, poly_masks, region_classes, lanes, cats, x_sort); //m_masks:mask前的结果 poly_masks后的结果 167 cv::Mat seg_output = seg_post_process(large_resolution, one_result.seg_array, combined, poly_masks, region_classes, lanes, cats, x_sort); //m_masks:mask前的结果 poly_masks后的结果
168 168
169 // cv::Mat image_lane(cv::Size(src_width, src_height), CV_8UC3, cv::Scalar(0, 0, 0)); 169 // cv::Mat image_lane(cv::Size(src_width, src_height), CV_8UC3, cv::Scalar(0, 0, 0));
170 - // for (int i = 0; i < lanes.size(); ++i) {  
171 - // LineInfo info;  
172 - // const cv::Scalar color(seg_colors[i][0], seg_colors[i][1], seg_colors[i][2]);  
173 - // for (size_t j = 0; j < lanes[i].size(); j++) {  
174 - // cv::Point pt;  
175 - // pt.x = lanes[i][j].x * scale_w;  
176 - // pt.x = lanes[i][j].y * scale_h;  
177 - // clip_xy(pt.x, pt.y, src_width, src_height);  
178 - // info.vec_pt.push_back(pt);  
179 -  
180 - // if (j > 0) {  
181 - // cv::line(image_lane, info.vec_pt[j-1], info.vec_pt[j], color, 2, 8);  
182 - // } 170 + for (int i = 0; i < lanes.size(); ++i) {
  171 + LineInfo info;
  172 + const cv::Scalar color(seg_colors[i][0], seg_colors[i][1], seg_colors[i][2]);
  173 + for (size_t j = 0; j < lanes[i].size(); j++) {
  174 + cv::Point pt;
  175 + pt.x = lanes[i][j].x * scale_w;
  176 + pt.y = lanes[i][j].y * scale_h;
  177 + clip_xy(pt.x, pt.y, src_width, src_height);
  178 + info.vec_pt.push_back(pt);
  179 +
  180 + // if (j > 0) {
  181 + // cv::line(image_lane, info.vec_pt[j-1], info.vec_pt[j], color, 2, 8);
  182 + // }
183 183
184 - // } 184 + }
185 185
186 - // info.line_type = cats[i];  
187 - // one_road.vec_line.push_back(info);  
188 - // }  
189 - cv::Mat cvImg(cv::Size(src_width, src_height), CV_8UC3, cv::Scalar(0, 0, 0));  
190 - cv::Mat tmp;  
191 - cv::resize(cvImg, tmp, cv::Size(640,360), 0, 0, cv::INTER_LINEAR);  
192 - cv::Mat vis_image = mask_to_rgb(tmp, seg_output);  
193 - cv::imwrite("./image_lane.jpg", vis_image);  
194 - seg_output.release();  
195 - cvImg.release(); 186 + info.line_type = cats[i];
  187 + one_road.vec_line.push_back(info);
  188 + }
  189 +
  190 + // cv::imwrite("./image_lane.jpg", image_lane);
  191 + // seg_output.release();
  192 + // image_lane.release();
196 193
197 - cv::Mat image(cv::Size(src_width, src_height), CV_8UC3, cv::Scalar(0, 0, 0)); 194 + // cv::Mat image(cv::Size(src_width, src_height), CV_8UC3, cv::Scalar(0, 0, 0));
198 for (int i = 0; i < poly_masks.size(); ++i) { 195 for (int i = 0; i < poly_masks.size(); ++i) {
199 SegInfo seg_info; 196 SegInfo seg_info;
200 197
201 for (size_t j = 0; j < poly_masks[i].size(); j++) { 198 for (size_t j = 0; j < poly_masks[i].size(); j++) {
202 cv::Point pt; 199 cv::Point pt;
203 pt.x = poly_masks[i][j].x * scale_w; 200 pt.x = poly_masks[i][j].x * scale_w;
204 - pt.x = poly_masks[i][j].y * scale_h; 201 + pt.y = poly_masks[i][j].y * scale_h;
205 clip_xy(pt.x, pt.y, src_width, src_height); 202 clip_xy(pt.x, pt.y, src_width, src_height);
206 seg_info.vec_pt.push_back(pt); 203 seg_info.vec_pt.push_back(pt);
207 } 204 }
208 205
209 seg_info.seg_type = region_classes[i]; 206 seg_info.seg_type = region_classes[i];
210 - vec_road.push_back(seg_info); 207 + one_road.vec_road.push_back(seg_info);
211 208
212 - int k = seg_info.seg_type;  
213 - const cv::Scalar color(seg_colors[k][0], seg_colors[k][1], seg_colors[k][2]);  
214 - polylines(image, seg_info.vec_pt, true, color, 3, cv::LINE_AA); 209 + // int k = seg_info.seg_type;
  210 + // const cv::Scalar color(seg_colors[k][0], seg_colors[k][1], seg_colors[k][2]);
  211 + // polylines(image, seg_info.vec_pt, true, color, 3, cv::LINE_AA);
215 } 212 }
216 213
217 - cv::imwrite("./image_road.jpg", image);  
218 - image.release(); 214 + // cv::imwrite("./image_road.jpg", image);
  215 + // image.release();
219 216
220 - return vec_road; 217 + return one_road;
221 } 218 }
222 219
223 std::vector<SegInfo> RoadSegAnalysis::parse_direct(rs_result one_result, sy_img src) { 220 std::vector<SegInfo> RoadSegAnalysis::parse_direct(rs_result one_result, sy_img src) {
224 - std::vector<std::pair<std::vector<cv::Point>, int>> combined;  
225 - lanes_process(one_result.reg_array, one_result.lane_count, combined);  
226 - std::vector<std::vector<cv::Point>> poly_masks, lanes;  
227 - std::vector<int> region_classes, cats;  
228 - std::map<double, int> x_sort; 221 +
  222 + std::vector<std::vector<cv::Point>> direct_masks;
  223 + std::vector<int> direct_classes;
229 bool large_resolution = false; 224 bool large_resolution = false;
230 if (src.w_ > 1920) large_resolution = true; 225 if (src.w_ > 1920) large_resolution = true;
231 -  
232 - cv::Mat seg_output = seg_post_process(large_resolution, one_result.direct_seg, combined, poly_masks, region_classes, lanes, cats, x_sort); //m_masks:mask前的结果 poly_masks后的结果 226 + cv::Mat direct_output = direct_post_process(large_resolution, one_result.direct_seg, direct_masks, direct_classes);
233 227
234 228
235 - cv::Mat image(cv::Size(640, 360), CV_8UC3, cv::Scalar(0, 0, 0)); 229 + // cv::Mat image(cv::Size(640, 360), CV_8UC3, cv::Scalar(0, 0, 0));
236 230
237 std::vector<SegInfo> vec_road; 231 std::vector<SegInfo> vec_road;
238 - for (int i = 0; i < poly_masks.size(); ++i) { 232 + for (int i = 0; i < direct_masks.size(); ++i) {
239 SegInfo seg_info; 233 SegInfo seg_info;
240 - seg_info.seg_type = region_classes[i];  
241 - seg_info.vec_pt = poly_masks[i]; 234 + seg_info.seg_type = direct_classes[i];
  235 + seg_info.vec_pt = direct_masks[i];
242 236
243 vec_road.push_back(seg_info); 237 vec_road.push_back(seg_info);
244 238
245 - int k = seg_info.seg_type;  
246 - const cv::Scalar color(seg_colors[k][0], seg_colors[k][1], seg_colors[k][2]);  
247 - polylines(image, seg_info.vec_pt, true, color, 3, cv::LINE_AA); 239 + // int k = seg_info.seg_type;
  240 + // const cv::Scalar color(seg_colors[k][0], seg_colors[k][1], seg_colors[k][2]);
  241 + // polylines(image, seg_info.vec_pt, true, color, 3, cv::LINE_AA);
248 } 242 }
249 243
250 - cv::imwrite("./image_direct.jpg", image);  
251 - image.release(); 244 + // cv::imwrite("./image_direct.jpg", image);
  245 + // image.release();
252 246
253 return vec_road; 247 return vec_road;
254 } 248 }
@@ -679,4 +673,64 @@ cv::Mat RoadSegAnalysis::seg_post_process(bool large_resolution, unsigned char * @@ -679,4 +673,64 @@ cv::Mat RoadSegAnalysis::seg_post_process(bool large_resolution, unsigned char *
679 } 673 }
680 #endif 674 #endif
681 return mask_rmlane; 675 return mask_rmlane;
682 -}  
683 \ No newline at end of file 676 \ No newline at end of file
  677 +}
  678 +
  679 +cv::Mat RoadSegAnalysis::direct_post_process(bool large_resolution, unsigned char *direct_array, std::vector<std::vector<cv::Point>> &poly_masks, std::vector<int> &region_classes) {
  680 + std::vector<int> pred_cls;
  681 + int h = 360, w = 640, step_size = h*w, seg_min_region_area = 512;
  682 + cv::Mat mask_rmlane = cv::Mat_<int>(h,w); //车道线区域置为背景
  683 + for (int i = 0; i < h; ++i) {
  684 + for (int j = 0; j < w; ++j) {
  685 + int max_cls = direct_array[(i * w + j)];
  686 + pred_cls.push_back(max_cls);
  687 + mask_rmlane.ptr<int>(i)[j] = max_cls;
  688 + }
  689 + }
  690 +
  691 +#if 1 /*mask远处区域*/
  692 + cv::Mat mask_black = mask_rmlane.clone();
  693 + if (large_resolution) mask_black(cv::Rect(0, 0, w, int(h * 0.14))) = 0;
  694 + else mask_black(cv::Rect(0, 0, w, int(h * 0.22))) = 0;
  695 + mask_black(cv::Rect(0, int(h * 0.95), w, int(h * 0.05))) = 0;
  696 + mask_black(cv::Rect(0, 0, int(w * 0.02), h)) = 0;
  697 + mask_black(cv::Rect(int(w * 0.95), 0, int(w * 0.05), h)) = 0;
  698 + mask_rmlane = mask_black;
  699 +#endif
  700 + //去重获取预测到的类别
  701 + std::vector<int> labels(pred_cls);
  702 + std::sort(labels.begin(),labels.end());
  703 + labels.erase(std::unique(labels.begin(),labels.end()),labels.end());
  704 +
  705 + //求道路区域
  706 + for(auto cat: labels) {
  707 + cv::Mat b_masks, measure_labels, stats, centroids;
  708 + cv::Mat n_masks = cv::Mat_<int>(h,w); n_masks = cv::Scalar(255);
  709 + cv::compare(mask_rmlane, cat, b_masks, cv::CMP_EQ); //将mask_rmlane元素逐个和cat比较,相同255,不同0
  710 + //连通域计算
  711 + int nccomps = cv::connectedComponentsWithStats (b_masks, measure_labels, stats, centroids, 8);
  712 + for(int i = 1; i < nccomps; i++ ) { //跳过背景信息0
  713 + if (stats.at<int>(i, cv::CC_STAT_AREA) < seg_min_region_area) { //移除过小的区域,并将对应位置置为0
  714 + cv::Mat comparison_result;
  715 + cv::compare(measure_labels, cv::Scalar(i), comparison_result, cv::CMP_EQ); //相等为255不等为0
  716 + n_masks.setTo(0, comparison_result); // 将comparison_result中非零区域置为0
  717 + cv::bitwise_and(mask_rmlane,n_masks,mask_rmlane);
  718 + continue;
  719 + }
  720 +
  721 + cv::Mat region_mask;
  722 + cv::bitwise_and(measure_labels,n_masks,measure_labels);/////
  723 + cv::compare(measure_labels, i, region_mask, cv::CMP_EQ);
  724 +
  725 + std::vector<std::vector<cv::Point>> contours;
  726 + cv::findContours(region_mask,contours,cv::noArray(),cv::RETR_TREE,cv::CHAIN_APPROX_SIMPLE);
  727 + std::vector<cv::Point> contours_poly;
  728 + for (int j = 0; j < contours.size();j++) {
  729 + cv::approxPolyDP(cv::Mat(contours[j]), contours_poly, 10, true);
  730 + if (contours_poly.size() <= 2) continue;
  731 + poly_masks.push_back(contours_poly);
  732 + region_classes.push_back(cat);
  733 + }
  734 + }
  735 + }
  736 + return mask_rmlane;
  737 +}
src/ai_engine_module/RoadSegAnalysis.h
@@ -33,7 +33,7 @@ private: @@ -33,7 +33,7 @@ private:
33 33
34 std::vector<LineInfo> parse_line(rs_result one_result, sy_img src); 34 std::vector<LineInfo> parse_line(rs_result one_result, sy_img src);
35 35
36 - std::vector<SegInfo> parse_road(rs_result one_result, sy_img src); 36 + RoadInfo parse_road(rs_result one_result, sy_img src);
37 37
38 std::vector<SegInfo> parse_direct(rs_result one_result, sy_img src); 38 std::vector<SegInfo> parse_direct(rs_result one_result, sy_img src);
39 39
@@ -47,6 +47,8 @@ private: @@ -47,6 +47,8 @@ private:
47 int Mask2LanePoints(const cv::Mat& pred, std::vector<std::vector<cv::Point>>&lanes, std::vector<int>& cats); 47 int Mask2LanePoints(const cv::Mat& pred, std::vector<std::vector<cv::Point>>&lanes, std::vector<int>& cats);
48 cv::Mat seg_post_process(bool large_resolution, unsigned char *seg_array, std::vector<std::pair<std::vector<cv::Point>, int>> combined, std::vector<std::vector<cv::Point>> &poly_masks, std::vector<int> &region_classes, std::vector<std::vector<cv::Point>> &lanes, std::vector<int> &cats, std::map<double, int> &x_sort); 48 cv::Mat seg_post_process(bool large_resolution, unsigned char *seg_array, std::vector<std::pair<std::vector<cv::Point>, int>> combined, std::vector<std::vector<cv::Point>> &poly_masks, std::vector<int> &region_classes, std::vector<std::vector<cv::Point>> &lanes, std::vector<int> &cats, std::map<double, int> &x_sort);
49 49
  50 + cv::Mat direct_post_process(bool large_resolution, unsigned char *direct_array, std::vector<std::vector<cv::Point>> &poly_masks, std::vector<int> &region_classes);
  51 +
50 private: 52 private:
51 void* m_handle{nullptr}; 53 void* m_handle{nullptr};
52 aclrtContext ctx{nullptr}; 54 aclrtContext ctx{nullptr};