Blame view

src/ai_engine_module/VehiclePlate.cpp 2.94 KB
6fdcb6a5   Hu Chunming   初次提交,代码大体完成编写,完善中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  #include "VehiclePlate.h"
  #include "vehicle_plate_dr.h"
  
  
  VehiclePlate::VehiclePlate(/* args */)
  {
  }
  
  VehiclePlate::~VehiclePlate()
  {
      release();
  }
  
  int VehiclePlate::init(int dev_id, string model_dir){
  
      string model_path = model_dir + "/models/vp2/yolo_plate_det310p.om" ;
      string cls_model_path = model_dir + "/models/vp2/plate3cls_310p.om" ;
      string reg_model_path = model_dir + "/models/vp2/plate_reg230316_310p.om" ;
  
      LOG_INFO("hp 版本:{}  模型路径:{}", vpdr_get_version(), model_path);
  
      vpd_param dparam;
      char modelNames[100];
      strcpy(modelNames, model_path.c_str());
      dparam.modelNames = modelNames;
      dparam.thresld = 0.2;
      dparam.devId = dev_id;
  
      vpr_param rparam;
      char cls_modelNames[100];
      strcpy(cls_modelNames, cls_model_path.c_str());
      rparam.cls_modelNames = cls_modelNames;
      char reg_modelNames[100];
      strcpy(reg_modelNames, reg_model_path.c_str());
      rparam.reg_modelNames = reg_modelNames;
  
      m_devId = dev_id;
      ACL_CALL(aclrtSetDevice(m_devId), ACL_SUCCESS, -1);
      ACL_CALL(aclrtCreateContext(&m_algorthim_ctx, m_devId), ACL_SUCCESS, -1);
  
      int ret = vpdr_init(&m_handle, dparam, rparam);
      if(ret != 0){
          LOG_ERROR("vc_init error.");
          return -1;
      }
  
      return 0;
  }
  
881ac79d   Hu Chunming   代码调通,结果正常输出
50
51
52
53
  vector<VehiclePlateResult> VehiclePlate::process(vector<DeviceMemory*> vec_gpuMem) 
  { // 每个 DeviceMemory 只包含一辆车
  
      int ret = aclrtSetCurrentContext(m_algorthim_ctx);
6fdcb6a5   Hu Chunming   初次提交,代码大体完成编写,完善中
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  
      vector<VehiclePlateResult> vec_res;
  
      int batchsize = vec_gpuMem.size();
  
      vector<sy_img> batch_img;
      for (int i = 0; i < vec_gpuMem.size(); i++) {
          DeviceMemory* mem = vec_gpuMem[i];
  
          sy_img img;
          img.w_ = mem->getWidth();     
          img.h_ = mem->getHeight();
          img.c_ = mem->getChannel();   
          img.data_ = mem->getMem();
          batch_img.push_back(img);
      }
  
      vector<vplates_result> vec_result;
      vec_result.resize(batchsize);
881ac79d   Hu Chunming   代码调通,结果正常输出
73
      ret = vpdr_batch(m_handle, batch_img.data(), batchsize, vec_result.data());
6fdcb6a5   Hu Chunming   初次提交,代码大体完成编写,完善中
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
      if (SY_SUCCESS != ret) {
          printf("vpr detection process failed!");
          return vec_res;
      }
  
      for(int batchIdx = 0; batchIdx < batchsize; batchIdx ++){
          auto& plate_info = vec_result[batchIdx].vehicle_plate_infos[0];
  
          VehiclePlateResult res;
          res.left_ = plate_info.rect.left_;
          res.top_ = plate_info.rect.top_;
          res.width_ = plate_info.rect.width_;
          res.height_ = plate_info.rect.height_;
          memcpy(res.recg, plate_info.recg, sizeof(PlateNum) * 8);
          res.num_score = plate_info.num_score;
          res.type = plate_info.type;
          res.state = plate_info.state;
          res.state_score = plate_info.state_score;
  
          vec_res.push_back(res);
      }
  
      return vec_res;
  }
  
  void VehiclePlate::release(){
      if (m_handle){
          vpdr_release(&m_handle);
          m_handle = NULL;
      }
      if(m_algorthim_ctx){
          aclrtDestroyContext(m_algorthim_ctx);
881ac79d   Hu Chunming   代码调通,结果正常输出
106
          m_algorthim_ctx = nullptr;
6fdcb6a5   Hu Chunming   初次提交,代码大体完成编写,完善中
107
108
      }
  }