From 06e0182f466c906d909eb525c56f939bc29c5bfc Mon Sep 17 00:00:00 2001 From: cmhu <2657262686@qq.com> Date: Tue, 7 Jan 2025 19:15:58 +0800 Subject: [PATCH] 修复src图片alignWidth为0导致崩溃的问题; 完善road_seg返回结果 --- src/PicAnalysis.cpp | 16 ++++++++++++---- src/PicAnalysis.h | 1 - src/ai_engine_module/RoadSegAnalysis.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ src/ai_engine_module/RoadSegAnalysis.h | 15 ++++++++++++++- src/demo/main.cpp | 2 +- src/village_inc.h | 14 +++++++++++++- 6 files changed, 146 insertions(+), 14 deletions(-) diff --git a/src/PicAnalysis.cpp b/src/PicAnalysis.cpp index f7f80bb..f0d9558 100644 --- a/src/PicAnalysis.cpp +++ b/src/PicAnalysis.cpp @@ -182,23 +182,31 @@ vector PicAnalysis::analysis_img(vector vec_img){ } va_result* result = m_vehicle_analysis.detect(vec_img); - if (result) { - vec_result = va_result2AnalysisResult(result, batch_size); m_vehicle_analysis.release_result(result, vec_img.size()); } - m_road_seg_algorithm.detect(vec_img); + std::vector vec_road = m_road_seg_algorithm.detect(vec_img); + if (vec_road.size() == batch_size && vec_result.size() == batch_size) { + for (size_t i = 0; i < batch_size; i++) { + vec_result[i].vec_line = vec_road[i].vec_line; + vec_result[i].vec_road = vec_road[i].vec_road; + } + } for (int b = 0; b < vec_result.size(); b++) { vector& vec_info = vec_result[b].info; sy_img img = vec_img[b]; + ImageData src; src.width = img.w_; src.height = img.h_; + src.alignWidth = ALIGN_UP16(img.w_); + src.alignHeight = ALIGN_UP2(img.h_); + src.size = YUV420SP_SIZE(src.alignWidth, src.alignHeight); src.data_naked = img.data_; for(int c=0;c PicAnalysis::analysis_img(vector vec_img){ // head_tail_result.clear(); // } - LOG_INFO("analysis_sync finished!"); + LOG_INFO("analysis finished!"); return vec_result; } diff --git a/src/PicAnalysis.h b/src/PicAnalysis.h index c355c73..cb19b45 100644 --- a/src/PicAnalysis.h +++ b/src/PicAnalysis.h @@ -23,7 +23,6 @@ public: int init(VillageParam param); - // todo 接口定义是二进制流的,这个地方有待修改 vector analysis_file(vector file_path); vector analysis_img(vector vec_img); diff --git a/src/ai_engine_module/RoadSegAnalysis.cpp b/src/ai_engine_module/RoadSegAnalysis.cpp index c2d9d08..f8f3ca0 100644 --- a/src/ai_engine_module/RoadSegAnalysis.cpp +++ b/src/ai_engine_module/RoadSegAnalysis.cpp @@ -1,5 +1,36 @@ #include "RoadSegAnalysis.h" -#include "road_seg.h" + +uint8_t seg_colors[][3] = { {0, 0, 0}, {0, 255, 255}, {128, 255, 0}, {255, 128, 0}, {128, 0, 255}, {255, 0, 128}, {0, 128, 255}, {0, 255, 128}, {128, 255, 255}}; +uint8_t lane_colors[][3] = { {0, 0, 0}, {255, 0, 0}, {0, 255, 0}, {0, 0, 255}, {255, 255, 0}, {255, 0, 255}, {0, 255, 255}, {128, 255, 0}, {255, 128, 0}}; + +void lanes_process(const rs_lane* lanes, int lane_count, std::vector, int>>& combined, float scale_w = 1.0, float scale_h = 1.0) { + std::vector > lanes_xys; + std::vector lanes_cls; + for (int i = 0; i < lane_count; i++) { + std::vector xys; + for (int j = 0; j < lanes[i].num_points; j++) { + int x = static_cast(lanes[i].points[j].x_ * scale_w); + int y = static_cast(lanes[i].points[j].y_ * scale_h); + if (x > 0 && y > 0) { + xys.emplace_back(x, y); + } + } + if (!xys.empty()) { + lanes_xys.push_back(xys); + lanes_cls.push_back(lanes[i].cls); + } + } + + for (size_t i = 0; i < lanes_xys.size(); ++i) { + combined.push_back(std::make_pair(lanes_xys[i], lanes_cls[i])); + } + if (!combined.empty()) { + //按车道线起点坐标排序,相应的类别顺序也会变化以保证标签对齐 + std::sort(combined.begin(), combined.end(), [](const std::pair, int>& a, const std::pair, int>& b) { + return a.first[0].x < b.first[0].x; + }); + } +} RoadSegAnalysis::RoadSegAnalysis(/* args */) { @@ -29,9 +60,9 @@ int RoadSegAnalysis::init(int devId){ return SY_SUCCESS; } -int RoadSegAnalysis::detect(vector vec_img){ +std::vector RoadSegAnalysis::detect(vector vec_img){ - ACL_CALL(aclrtSetCurrentContext(ctx), SY_SUCCESS, SY_FAILED); + std::vector vec_road; const int batchsize = vec_img.size(); rs_result results[batchsize]; @@ -45,13 +76,38 @@ int RoadSegAnalysis::detect(vector vec_img){ do { + ret = aclrtSetCurrentContext(ctx); + if (SY_SUCCESS != ret) { + printf("aclrtSetCurrentContext failed!"); + break; + } + ret = rs_batch(m_handle, vec_img.data(), batchsize, results); if (SY_SUCCESS != ret) { - printf("mrc_batch failed!"); + printf("rs_batch failed!"); break; } - // todo 结果处理 + for (int b = 0; b < batchsize; b++) { + auto one_result = results[b]; + RoadInfo one_road; + for (size_t i = 0; i < one_result.lane_count; i++) + { + auto one_lane = one_result.reg_array[i]; + LineInfo info; + for (size_t j = 0; j < one_lane.num_points; j++) + { + info.vec_pt.push_back(one_lane.points[j]); + } + info.line_type = one_lane.cls; + one_road.vec_line.push_back(info); + } + + one_road.vec_road = parse_seg(one_result, vec_img[b]); + + vec_road.push_back(one_road); + } + } while (0); for (int b = 0; b < batchsize; b++) { @@ -61,7 +117,7 @@ int RoadSegAnalysis::detect(vector vec_img){ results[b].direct_seg = NULL; } - return ret; + return vec_road; } int RoadSegAnalysis::release() { @@ -78,4 +134,48 @@ int RoadSegAnalysis::release() { } return SY_SUCCESS; +} + +std::vector RoadSegAnalysis::parse_seg(rs_result one_result, sy_img src) { + int w = 640; + int h = 360; + float alpha = 0.75; + cv::Mat overlayed_img(cv::Size(w,h), CV_8UC3, cv::Scalar(0, 0, 0)); + // 将车道线标签转换为彩色图像 + for (int i = 0; i < h; ++i) { + for (int j = 0; j < w; ++j) { + int idx = one_result.seg_array[(i * w + j)]; + overlayed_img.at(i, j)[0] = seg_colors[idx][0]; // R通道; + overlayed_img.at(i, j)[1] = seg_colors[idx][1]; // G通道 + overlayed_img.at(i, j)[2] = seg_colors[idx][2]; // B通道 + } + } + + cv::resize(overlayed_img, overlayed_img, cv::Size(src.w_,src.h_), 0, 0, cv::INTER_LINEAR); + // 将原始图像和彩色车道线图进行混合 + // cv::addWeighted(cvImg, alpha, overlayed_img, 1 - alpha, 0, overlayed_img); + + float scale_w = src.w_ / 640.0; + float scale_h = src.h_ / 360.0; + std::vector, int>> combined; + lanes_process(one_result.reg_array, one_result.lane_count, combined, scale_w, scale_h); + + std::vector vec_seg; + for (const auto& lane_info : combined) { + const auto& xys = lane_info.first; + int cls = lane_info.second; + SegInfo info; + info.seg_type = cls; + // cv::Scalar color(lane_colors[cls][0],lane_colors[cls][1],lane_colors[cls][2]); + for (size_t i = 1; i < xys.size(); ++i) { + // cv::line(overlayed_img, xys[i - 1], xys[i], color, 4); + sy_point pt; + pt.x_ = xys[i].x; + pt.y_ = xys[i].y; + info.vec_pt.push_back(pt); + } + vec_seg.push_back(info); + } + + return vec_seg; } \ No newline at end of file diff --git a/src/ai_engine_module/RoadSegAnalysis.h b/src/ai_engine_module/RoadSegAnalysis.h index f3271bd..3234093 100644 --- a/src/ai_engine_module/RoadSegAnalysis.h +++ b/src/ai_engine_module/RoadSegAnalysis.h @@ -1,4 +1,15 @@ #include "include.h" +#include "../village_inc.h" +#include "road_seg.h" + +#include + +using namespace std; + +struct RoadInfo{ + std::vector vec_line; + std::vector vec_road; +}; class RoadSegAnalysis { @@ -8,11 +19,13 @@ public: int init(int devId); - int detect(vector vec_img); + std::vector detect(vector vec_img); private: int release(); + std::vector parse_seg(rs_result one_result, sy_img src); + private: void* m_handle{nullptr}; aclrtContext ctx{nullptr}; diff --git a/src/demo/main.cpp b/src/demo/main.cpp index 2b091fd..ea623a6 100644 --- a/src/demo/main.cpp +++ b/src/demo/main.cpp @@ -13,7 +13,7 @@ int main() { vector vec_path; for (size_t i = 0; i < 1; i++) { - vec_path.push_back("./test_all.jpg"); + vec_path.push_back("./img/test_road1.jpg"); } pic_analysis.analysis_file(vec_path); diff --git a/src/village_inc.h b/src/village_inc.h index 80178e3..b5b0fb8 100644 --- a/src/village_inc.h +++ b/src/village_inc.h @@ -45,8 +45,20 @@ typedef struct VehicleInfo { } VehicleInfo; +struct LineInfo{ + int line_type; + std::vector vec_pt; +}; + +struct SegInfo { + int seg_type; + std::vector vec_pt; +}; + typedef struct AnalysisResult { - std::vector info; + std::vector info; + std::vector vec_line; + std::vector vec_road; } AnalysisResult; #endif // __VILLAGE_INC_H__ \ No newline at end of file -- libgit2 0.21.4