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 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&lt;RoadInfo&gt; RoadSegAnalysis::detect(vector&lt;sy_img&gt; 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&lt;RoadInfo&gt; RoadSegAnalysis::detect(vector&lt;sy_img&gt; 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&lt;int&gt; vec_type, std::vector&lt;cv::Point&gt; 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&lt;SegInfo&gt; 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&lt;SegInfo&gt; 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  
... ...