Commit fd92595025a1432cbcc3a64cab95ff96c70a1d1f
1 parent
5fc0b809
修改 parse_line 实现
Showing
2 changed files
with
121 additions
and
23 deletions
src/ai_engine_module/RoadSegAnalysis.cpp
... | ... | @@ -35,7 +35,7 @@ int RoadSegAnalysis::init(int devId, std::string sdk_root){ |
35 | 35 | |
36 | 36 | std::vector<RoadInfo> RoadSegAnalysis::detect(vector<sy_img> vec_img){ |
37 | 37 | |
38 | - std::vector<RoadInfo> vec_road; | |
38 | + std::vector<RoadInfo> vec_road_info; | |
39 | 39 | |
40 | 40 | const int batchsize = vec_img.size(); |
41 | 41 | rs_result results[batchsize]; |
... | ... | @@ -63,9 +63,11 @@ 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 = parse_road(one_result, vec_img[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]); | |
67 | 69 | one_road.vec_direct = parse_direct(one_result, vec_img[b]); |
68 | - vec_road.push_back(one_road); | |
70 | + vec_road_info.push_back(one_road); | |
69 | 71 | } |
70 | 72 | |
71 | 73 | } while (0); |
... | ... | @@ -77,7 +79,7 @@ std::vector<RoadInfo> RoadSegAnalysis::detect(vector<sy_img> vec_img){ |
77 | 79 | results[b].direct_seg = NULL; |
78 | 80 | } |
79 | 81 | |
80 | - return vec_road; | |
82 | + return vec_road_info; | |
81 | 83 | } |
82 | 84 | |
83 | 85 | void test(vector<int> vec_type, std::vector<cv::Point> vec_pt, std::string file_name){ |
... | ... | @@ -93,9 +95,66 @@ void test(vector<int> vec_type, std::vector<cv::Point> vec_pt, std::string file_ |
93 | 95 | image.release(); |
94 | 96 | } |
95 | 97 | |
96 | -RoadInfo RoadSegAnalysis::parse_road(rs_result one_result, sy_img src) | |
98 | +void clip_xy(int& x, int& y, int width, int height){ | |
99 | + if (x < 0) { | |
100 | + x = 0; | |
101 | + } | |
102 | + | |
103 | + if (y < 0) { | |
104 | + y = 0; | |
105 | + } | |
106 | + | |
107 | + if (x >= width) { | |
108 | + x = width -1; | |
109 | + } | |
110 | + | |
111 | + if (y >= height) { | |
112 | + y = height -1; | |
113 | + } | |
114 | +} | |
115 | + | |
116 | +std::vector<LineInfo> RoadSegAnalysis::parse_line(rs_result one_result, sy_img src) { | |
117 | + float scale_w = src.w_ / 640.0; | |
118 | + float scale_h = src.h_ / 360.0; | |
119 | + std::vector<std::pair<std::vector<cv::Point>, int>> combined; | |
120 | + lanes_process(one_result.reg_array, one_result.lane_count, combined, scale_w, scale_h); | |
121 | + | |
122 | + std::vector<LineInfo> vec_line; | |
123 | + for (const auto& lane_info : combined) { | |
124 | + LineInfo info; | |
125 | + info.vec_pt = lane_info.first; | |
126 | + info.line_type = lane_info.second; | |
127 | + vec_line.push_back(info); | |
128 | + } | |
129 | + | |
130 | + return vec_line; | |
131 | +} | |
132 | + | |
133 | +cv::Mat mask_to_rgb(cv::Mat img, cv::Mat mask) { | |
134 | + cv::Mat masks = img.clone(); | |
135 | + int reg_cls = 9; | |
136 | + for (int i = 0; i < masks.rows; i++) { | |
137 | + for (int j = 0; j < masks.cols; j++) { | |
138 | + for (int k = 1; k < reg_cls; k++) { | |
139 | + if (mask.at<int>(i,j) == k) { | |
140 | + masks.at<cv::Vec3b>(i,j)[0] = seg_colors[k][0]; | |
141 | + masks.at<cv::Vec3b>(i,j)[1] = seg_colors[k][1]; | |
142 | + masks.at<cv::Vec3b>(i,j)[2] = seg_colors[k][2]; | |
143 | + } | |
144 | + } | |
145 | + } | |
146 | + } | |
147 | + return masks; | |
148 | +} | |
149 | + | |
150 | +std::vector<SegInfo> RoadSegAnalysis::parse_road(rs_result one_result, sy_img src) | |
97 | 151 | { |
98 | - RoadInfo one_road; | |
152 | + int src_width = src.w_; | |
153 | + int src_height = src.h_; | |
154 | + float scale_w = src_width / 640.0; | |
155 | + float scale_h = src_height / 360.0; | |
156 | + | |
157 | + std::vector<SegInfo> vec_road; | |
99 | 158 | |
100 | 159 | std::vector<std::pair<std::vector<cv::Point>, int>> combined; |
101 | 160 | lanes_process(one_result.reg_array, one_result.lane_count, combined); |
... | ... | @@ -103,25 +162,62 @@ RoadInfo RoadSegAnalysis::parse_road(rs_result one_result, sy_img src) |
103 | 162 | std::vector<int> region_classes, cats; |
104 | 163 | std::map<double, int> x_sort; |
105 | 164 | bool large_resolution = false; |
106 | - if (src.w_ > 1920) large_resolution = true; | |
165 | + if (src_width > 1920) large_resolution = true; | |
107 | 166 | |
108 | 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后的结果 |
109 | 168 | |
110 | - for (int i = 0; i < lanes.size(); ++i) { | |
111 | - LineInfo info; | |
112 | - info.vec_pt = lanes[i]; | |
113 | - info.line_type = cats[i]; | |
114 | - one_road.vec_line.push_back(info); | |
115 | - } | |
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 | + // } | |
183 | + | |
184 | + // } | |
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(); | |
116 | 196 | |
197 | + cv::Mat image(cv::Size(src_width, src_height), CV_8UC3, cv::Scalar(0, 0, 0)); | |
117 | 198 | for (int i = 0; i < poly_masks.size(); ++i) { |
118 | 199 | SegInfo seg_info; |
119 | - seg_info.vec_pt = poly_masks[i]; | |
200 | + | |
201 | + for (size_t j = 0; j < poly_masks[i].size(); j++) { | |
202 | + cv::Point pt; | |
203 | + pt.x = poly_masks[i][j].x * scale_w; | |
204 | + pt.x = poly_masks[i][j].y * scale_h; | |
205 | + clip_xy(pt.x, pt.y, src_width, src_height); | |
206 | + seg_info.vec_pt.push_back(pt); | |
207 | + } | |
208 | + | |
120 | 209 | seg_info.seg_type = region_classes[i]; |
121 | - one_road.vec_road.push_back(seg_info); | |
210 | + vec_road.push_back(seg_info); | |
211 | + | |
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); | |
122 | 215 | } |
123 | 216 | |
124 | - return one_road; | |
217 | + cv::imwrite("./image_road.jpg", image); | |
218 | + image.release(); | |
219 | + | |
220 | + return vec_road; | |
125 | 221 | } |
126 | 222 | |
127 | 223 | std::vector<SegInfo> RoadSegAnalysis::parse_direct(rs_result one_result, sy_img src) { |
... | ... | @@ -136,7 +232,7 @@ std::vector<SegInfo> RoadSegAnalysis::parse_direct(rs_result one_result, sy_img |
136 | 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后的结果 |
137 | 233 | |
138 | 234 | |
139 | - // cv::Mat image(cv::Size(640, 360), CV_8UC3, cv::Scalar(0, 0, 0)); | |
235 | + cv::Mat image(cv::Size(640, 360), CV_8UC3, cv::Scalar(0, 0, 0)); | |
140 | 236 | |
141 | 237 | std::vector<SegInfo> vec_road; |
142 | 238 | for (int i = 0; i < poly_masks.size(); ++i) { |
... | ... | @@ -146,13 +242,13 @@ std::vector<SegInfo> RoadSegAnalysis::parse_direct(rs_result one_result, sy_img |
146 | 242 | |
147 | 243 | vec_road.push_back(seg_info); |
148 | 244 | |
149 | - // int k = seg_info.seg_type; | |
150 | - // const cv::Scalar color(seg_colors[k][0], seg_colors[k][1], seg_colors[k][2]); | |
151 | - // polylines(image, seg_info.vec_pt, true, color, 3, cv::LINE_AA); | |
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); | |
152 | 248 | } |
153 | 249 | |
154 | - // cv::imwrite("./direct.jpg", image); | |
155 | - // image.release(); | |
250 | + cv::imwrite("./image_direct.jpg", image); | |
251 | + image.release(); | |
156 | 252 | |
157 | 253 | return vec_road; |
158 | 254 | } | ... | ... |
src/ai_engine_module/RoadSegAnalysis.h
... | ... | @@ -31,7 +31,9 @@ public: |
31 | 31 | private: |
32 | 32 | int release(); |
33 | 33 | |
34 | - RoadInfo parse_road(rs_result one_result, sy_img src); | |
34 | + std::vector<LineInfo> parse_line(rs_result one_result, sy_img src); | |
35 | + | |
36 | + std::vector<SegInfo> parse_road(rs_result one_result, sy_img src); | |
35 | 37 | |
36 | 38 | std::vector<SegInfo> parse_direct(rs_result one_result, sy_img src); |
37 | 39 | ... | ... |