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 | 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<SegInfo> 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> ®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 | 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> ®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 | 52 | private: |
51 | 53 | void* m_handle{nullptr}; |
52 | 54 | aclrtContext ctx{nullptr}; | ... | ... |