Commit cd05f4c68f8fcf129b1f94894eb7242d0b869093
1 parent
01b357d4
完善pase_road
Showing
2 changed files
with
112 additions
and
56 deletions
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<SegInfo> RoadSegAnalysis::parse_road(rs_result one_result, sy_img sr | @@ -167,88 +167,82 @@ std::vector<SegInfo> 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> ®ion_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> ®ion_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> ®ion_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> ®ion_classes); | ||
51 | + | ||
50 | private: | 52 | private: |
51 | void* m_handle{nullptr}; | 53 | void* m_handle{nullptr}; |
52 | aclrtContext ctx{nullptr}; | 54 | aclrtContext ctx{nullptr}; |