Commit fd92595025a1432cbcc3a64cab95ff96c70a1d1f

Authored by Hu Chunming
1 parent 5fc0b809

修改 parse_line 实现

src/ai_engine_module/RoadSegAnalysis.cpp
@@ -35,7 +35,7 @@ int RoadSegAnalysis::init(int devId, std::string sdk_root){ @@ -35,7 +35,7 @@ int RoadSegAnalysis::init(int devId, std::string sdk_root){
35 35
36 std::vector<RoadInfo> RoadSegAnalysis::detect(vector<sy_img> vec_img){ 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 const int batchsize = vec_img.size(); 40 const int batchsize = vec_img.size();
41 rs_result results[batchsize]; 41 rs_result results[batchsize];
@@ -63,9 +63,11 @@ std::vector&lt;RoadInfo&gt; RoadSegAnalysis::detect(vector&lt;sy_img&gt; vec_img){ @@ -63,9 +63,11 @@ std::vector&lt;RoadInfo&gt; RoadSegAnalysis::detect(vector&lt;sy_img&gt; 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 = 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 one_road.vec_direct = parse_direct(one_result, vec_img[b]); 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 } while (0); 73 } while (0);
@@ -77,7 +79,7 @@ std::vector&lt;RoadInfo&gt; RoadSegAnalysis::detect(vector&lt;sy_img&gt; vec_img){ @@ -77,7 +79,7 @@ std::vector&lt;RoadInfo&gt; RoadSegAnalysis::detect(vector&lt;sy_img&gt; vec_img){
77 results[b].direct_seg = NULL; 79 results[b].direct_seg = NULL;
78 } 80 }
79 81
80 - return vec_road; 82 + return vec_road_info;
81 } 83 }
82 84
83 void test(vector<int> vec_type, std::vector<cv::Point> vec_pt, std::string file_name){ 85 void test(vector<int> vec_type, std::vector<cv::Point> vec_pt, std::string file_name){
@@ -93,9 +95,66 @@ void test(vector&lt;int&gt; vec_type, std::vector&lt;cv::Point&gt; vec_pt, std::string file_ @@ -93,9 +95,66 @@ void test(vector&lt;int&gt; vec_type, std::vector&lt;cv::Point&gt; vec_pt, std::string file_
93 image.release(); 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 std::vector<std::pair<std::vector<cv::Point>, int>> combined; 159 std::vector<std::pair<std::vector<cv::Point>, int>> combined;
101 lanes_process(one_result.reg_array, one_result.lane_count, combined); 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,25 +162,62 @@ RoadInfo RoadSegAnalysis::parse_road(rs_result one_result, sy_img src)
103 std::vector<int> region_classes, cats; 162 std::vector<int> region_classes, cats;
104 std::map<double, int> x_sort; 163 std::map<double, int> x_sort;
105 bool large_resolution = false; 164 bool large_resolution = false;
106 - if (src.w_ > 1920) large_resolution = true; 165 + if (src_width > 1920) large_resolution = true;
107 166
108 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后的结果
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 for (int i = 0; i < poly_masks.size(); ++i) { 198 for (int i = 0; i < poly_masks.size(); ++i) {
118 SegInfo seg_info; 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 seg_info.seg_type = region_classes[i]; 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 std::vector<SegInfo> RoadSegAnalysis::parse_direct(rs_result one_result, sy_img src) { 223 std::vector<SegInfo> RoadSegAnalysis::parse_direct(rs_result one_result, sy_img src) {
@@ -136,7 +232,7 @@ std::vector&lt;SegInfo&gt; RoadSegAnalysis::parse_direct(rs_result one_result, sy_img @@ -136,7 +232,7 @@ std::vector&lt;SegInfo&gt; RoadSegAnalysis::parse_direct(rs_result one_result, sy_img
136 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后的结果 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 std::vector<SegInfo> vec_road; 237 std::vector<SegInfo> vec_road;
142 for (int i = 0; i < poly_masks.size(); ++i) { 238 for (int i = 0; i < poly_masks.size(); ++i) {
@@ -146,13 +242,13 @@ std::vector&lt;SegInfo&gt; RoadSegAnalysis::parse_direct(rs_result one_result, sy_img @@ -146,13 +242,13 @@ std::vector&lt;SegInfo&gt; RoadSegAnalysis::parse_direct(rs_result one_result, sy_img
146 242
147 vec_road.push_back(seg_info); 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 return vec_road; 253 return vec_road;
158 } 254 }
src/ai_engine_module/RoadSegAnalysis.h
@@ -31,7 +31,9 @@ public: @@ -31,7 +31,9 @@ public:
31 private: 31 private:
32 int release(); 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 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);
37 39