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 63  
64 64 for (int b = 0; b < batchsize; b++) {
65 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 69 one_road.vec_direct = parse_direct(one_result, vec_img[b]);
70 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 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 152 int src_width = src.w_;
153 153 int src_height = src.h_;
154 154 float scale_w = src_width / 640.0;
155 155 float scale_h = src_height / 360.0;
156 156  
157   - std::vector<SegInfo> vec_road;
  157 + RoadInfo one_road;
158 158  
159 159 std::vector<std::pair<std::vector<cv::Point>, int>> combined;
160 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 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 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 195 for (int i = 0; i < poly_masks.size(); ++i) {
199 196 SegInfo seg_info;
200 197  
201 198 for (size_t j = 0; j < poly_masks[i].size(); j++) {
202 199 cv::Point pt;
203 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 202 clip_xy(pt.x, pt.y, src_width, src_height);
206 203 seg_info.vec_pt.push_back(pt);
207 204 }
208 205  
209 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 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 224 bool large_resolution = false;
230 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 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 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 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 247 return vec_road;
254 248 }
... ... @@ -679,4 +673,64 @@ cv::Mat RoadSegAnalysis::seg_post_process(bool large_resolution, unsigned char *
679 673 }
680 674 #endif
681 675 return mask_rmlane;
682   -}
683 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 33  
34 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 38 std::vector<SegInfo> parse_direct(rs_result one_result, sy_img src);
39 39  
... ... @@ -47,6 +47,8 @@ private:
47 47 int Mask2LanePoints(const cv::Mat& pred, std::vector<std::vector<cv::Point>>&lanes, std::vector<int>& cats);
48 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 52 private:
51 53 void* m_handle{nullptr};
52 54 aclrtContext ctx{nullptr};
... ...