MediaInfAiDataVehicleRecognition.hpp
1 //
2 // Created by tangfahong on 2024/4/10.
3 //
4 
5 #ifndef EMX_MediaInfAiDataVehicleRecognition_HPP
6 #define EMX_MediaInfAiDataVehicleRecognition_HPP
7 
8 #include "MediaInfAiData.hpp"
9 #include "MediaRegion.hpp"
10 #include <cstring>
11 
12 namespace Emx {
18  public:
20  memset(&fullPic, 0, sizeof(MediaInfAiPic));
21  }
22 
24 
25  public:
26  struct DataMsg {
29  uint64_t id;
30  uint64_t plateId;
33  /*目标类型*/
34  enum class TypeE : uint32_t {
35  LightCar,
36  HeavyCar,
37  Sedan,
38  SUV,
39  Van,
40  Truck,
41  Motorcycle,
42  SportsCar,
43  Pickup
44  } type;
45  uint32_t color;
46  uint32_t isRun;
47  char brand[16];
48  /*车牌颜色*/
49  enum class PlateColorE : uint32_t {
50  Blue,
51  Yellow,
52  White,
53  Black,
54  Green
56  uint8_t score;
57  uint8_t attrScore;
58  uint8_t plateScore;
59  uint8_t plateLine;
60  uint8_t plateNumber[2][32];
61  float plateAngleH;
62  float plateAngleV;
63  float plateArea;
65 
66  int imgOff;
67  };
68 
69  void Alloc(int n) {
70  Free();
71  array = (DataMsg *) EP_MALLOC(n * (int) sizeof(DataMsg));
72  if (array) { memset((void *) array, 0, n * sizeof(DataMsg)); }
73  memset(&fullPic, 0, sizeof(MediaInfAiPic));
74  }
75 
76  void Free() {
77  if (array) {
78  for (int i = 0; i < num; i++) {
79  if ((array[i].pic.size > 0) && array[i].pic.img) {
80  free(array[i].pic.img);
81  array[i].pic.img = nullptr;
82  array[i].pic.size = 0;
83  }
84  if ((array[i].platePic.size > 0) && array[i].platePic.img) {
85  free(array[i].platePic.img);
86  array[i].platePic.img = nullptr;
87  array[i].platePic.size = 0;
88  }
89  }
90  if ((fullPic.size > 0) && fullPic.img) {
91  free(fullPic.img);
92  fullPic.img = nullptr;
93  }
94  free(array);
95  array = nullptr;
96  }
97  }
98 
99  int GetSerializeSize() override {
100  int totalImgSize = 0;
101  totalImgSize += sizeof(MediaInfAiPic);
102  totalImgSize += fullPic.size;
103  for (int i = 0; i < num; i++) {
104  totalImgSize += array[i].pic.size;
105  totalImgSize += array[i].platePic.size;
106  }
107  return (int) sizeof(num) + num * (int) sizeof(DataMsg) + totalImgSize;
108  }
109 
110  void Serialize(uint8_t *buffer) override {
111  int off = 0;
112  memcpy(buffer + off, &num, sizeof(num));
113  off += (int) sizeof(num);
114  memcpy(buffer + off, &fullPic, sizeof(MediaInfAiPic));
115  int fullImgOff = off + (int) sizeof(MediaInfAiPic);
116  if (fullPic.img && fullPic.size > 0) { memcpy(buffer + fullImgOff, fullPic.img, fullPic.size); }
117  off += (fullPic.size + sizeof(MediaInfAiPic));
118 
119  int imgOff = off + num * (int) sizeof(DataMsg);
120  for (int i = 0; i < num; i++) {
121  array[i].imgOff = imgOff;
122  if (array[i].pic.img && array[i].pic.size > 0) {
123  memcpy(buffer + imgOff, array[i].pic.img, array[i].pic.size);
124  }
125  imgOff += array[i].pic.size;
126  if (array[i].platePic.img && array[i].platePic.size > 0) {
127  memcpy(buffer + imgOff, array[i].platePic.img, array[i].platePic.size);
128  }
129  imgOff += array[i].platePic.size;
130  memcpy(buffer + off, array + i, (int) sizeof(DataMsg));
131  off += (int) sizeof(DataMsg);
132  }
133  }
134 
135  void Parse(const uint8_t *buffer, int size) override {
136  int off = 0;
137  memcpy(&num, buffer + off, sizeof(num));
138  off += sizeof(num);
139  Alloc(num);
140  memcpy(&fullPic, buffer + off, (int) sizeof(MediaInfAiPic));
141  off += (int) sizeof(MediaInfAiPic);
142  if (fullPic.size > 0) {
143  fullPic.img = (uint8_t *) EP_MALLOC(fullPic.size);
144  if (fullPic.img) { memcpy(fullPic.img, buffer + off, fullPic.size); }
145  }
146  off += fullPic.size;
147  if (num * (int) sizeof(DataMsg) + off <= size) {
148  memcpy(array, buffer + off, num * (int) sizeof(DataMsg));
149  for (int i = 0; i < num; i++) {
150  int imgOff = array[i].imgOff;
151  if (array[i].pic.size) {
152  array[i].pic.img = (uint8_t *) EP_MALLOC(array[i].pic.size);
153  if (array[i].pic.img) memcpy(array[i].pic.img, buffer + imgOff, array[i].pic.size);
154  imgOff += array[i].pic.size;
155  }
156  if (array[i].platePic.size) {
157  array[i].platePic.img = (uint8_t *) EP_MALLOC(array[i].platePic.size);
158  if (array[i].platePic.img)
159  memcpy(array[i].platePic.img, buffer + imgOff, array[i].platePic.size);
160  }
161  }
162  }
163  }
164 
165  public:
166  int num;
168  MediaInfAiPic fullPic;//背景图,根据配置决定是否有截图
169  };
171 }// namespace Emx
172 
173 #endif//EMX_MediaInfAiDataVehicleRecognition_HPP
Definition: MediaInfAiDataVehicleRecognition.hpp:17
void Serialize(uint8_t *buffer) override
Definition: MediaInfAiDataVehicleRecognition.hpp:110
DataMsg * array
Definition: MediaInfAiDataVehicleRecognition.hpp:167
MediaInfAiDataVehicleRecognition()
Definition: MediaInfAiDataVehicleRecognition.hpp:19
void Parse(const uint8_t *buffer, int size) override
Definition: MediaInfAiDataVehicleRecognition.hpp:135
virtual ~MediaInfAiDataVehicleRecognition()
Definition: MediaInfAiDataVehicleRecognition.hpp:23
int num
Definition: MediaInfAiDataVehicleRecognition.hpp:166
void Alloc(int n)
Definition: MediaInfAiDataVehicleRecognition.hpp:69
int GetSerializeSize() override
Definition: MediaInfAiDataVehicleRecognition.hpp:99
void Free()
Definition: MediaInfAiDataVehicleRecognition.hpp:76
MediaInfAiPic fullPic
Definition: MediaInfAiDataVehicleRecognition.hpp:168
Definition: MediaInfAiData.hpp:29
Definition: EmxGpio.hpp:10
Definition: MediaInfAiDataVehicleRecognition.hpp:26
uint32_t isRun
运行中
Definition: MediaInfAiDataVehicleRecognition.hpp:46
uint32_t color
目标rgb颜色
Definition: MediaInfAiDataVehicleRecognition.hpp:45
uint64_t plateId
目标车牌id
Definition: MediaInfAiDataVehicleRecognition.hpp:30
PlateColorE
Definition: MediaInfAiDataVehicleRecognition.hpp:49
enum Emx::MediaInfAiDataVehicleRecognition::DataMsg::PlateColorE plateColor
float plateKeyPointsDistance
车牌关键点距离
Definition: MediaInfAiDataVehicleRecognition.hpp:64
enum Emx::MediaInfAiDataVehicleRecognition::DataMsg::TypeE type
uint64_t id
目标车辆id
Definition: MediaInfAiDataVehicleRecognition.hpp:29
MediaInfAiPic platePic
车牌抠图,根据配置参数决定是否有截图
Definition: MediaInfAiDataVehicleRecognition.hpp:28
int imgOff
私有数据,记录内存偏移
Definition: MediaInfAiDataVehicleRecognition.hpp:66
Rect plateRect
当前车牌位置信息
Definition: MediaInfAiDataVehicleRecognition.hpp:32
MediaInfAiPic pic
车辆抠图,根据配置参数决定是否有截图
Definition: MediaInfAiDataVehicleRecognition.hpp:27
TypeE
Definition: MediaInfAiDataVehicleRecognition.hpp:34
uint8_t plateScore
车牌识别置信度0~100,值越大越准确
Definition: MediaInfAiDataVehicleRecognition.hpp:58
float plateAngleH
车牌水平方向角度
Definition: MediaInfAiDataVehicleRecognition.hpp:61
float plateArea
车牌面积
Definition: MediaInfAiDataVehicleRecognition.hpp:63
uint8_t plateNumber[2][32]
车牌号码,一行占用一个下标,统一UTF-8编码
Definition: MediaInfAiDataVehicleRecognition.hpp:60
uint8_t attrScore
车辆属性置信度0~100,值越大越准确
Definition: MediaInfAiDataVehicleRecognition.hpp:57
float plateAngleV
车牌垂直方向角度
Definition: MediaInfAiDataVehicleRecognition.hpp:62
uint8_t plateLine
车牌行数,一般是1,个别车是2行
Definition: MediaInfAiDataVehicleRecognition.hpp:59
char brand[16]
品牌
Definition: MediaInfAiDataVehicleRecognition.hpp:47
uint8_t score
车辆置信度0~100,值越大越准确
Definition: MediaInfAiDataVehicleRecognition.hpp:56
Rect rect
当前车辆位置信息
Definition: MediaInfAiDataVehicleRecognition.hpp:31
Definition: MediaInfAiData.hpp:16
uint8_t * img
Definition: MediaInfAiData.hpp:26
int32_t size
Definition: MediaInfAiData.hpp:25
矩形框
Definition: MediaRegion.hpp:35