123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- #ifndef _READING_RECOGNITION_H_
- #define _READING_RECOGNITION_H_
- #include "stdio.h"
- #include "math.h"
- #include "string.h"
- #include "stdint.h"
- #include "stdlib.h"
- //#include "aimr_config.h"
- //----------------------------------------------------------------------------------------
- #define IMPOSSIBLE_MAX_VALUE 99999999990000 //(uint64_t):水表永远不可能达到的最大值,99999999990000代表10位水表的最大值。为什么14位呢?因为在我们的计算中单位以公升计算,这样避免了浮点运行造成的精度损失
- #define IMPOSSIBLE_VALUE 888 //(int16_t):(1)数组中行数据无效标志值;(2)不可能出现的旋转角度(合理的角度=[-359,359]);(3)不可能出现的坐标值(合理的坐标值=[0,319])
- #define IMPOSSIBLE_NUM_NUMBER 88 //(uint8_t):水表中不可能出现的数字(指针)个数(合理的个数=[0,10])
- #define BMP_BRIGHT_FACTOR_DEFAULT (1.2f)
- #define ONE_STERE 10000 //1立方米 = 10000立方分升
- //320BMP的大小
- #if 0
- #define BMP_SIZE_320BMP (320*320*3)
- extern uint8_t runapp_buffer[1536*1024];
- uint8_t *mBuffer1_320BMP = runapp_buffer;
- uint8_t *mBuffer2_320BMP = runapp_buffer + BMP_SIZE_320BMP;
- uint8_t *mBuffer3_320BMP = runapp_buffer + BMP_SIZE_320BMP*2;
- #endif
- typedef int (*printf_ai_log)(const char *format, ...);
- #pragma pack(1)
- typedef struct
- {
- uint8_t METER_TYPE; //仪表类型,
- //
- uint8_t NUM_NUMBERS; //数字个数(黑色+红色)
- uint32_t UNIT_OF_THE_LAST_NUMBER; //最后一个数字的单位,最小单位1分升,1dL, 0.1L(万分之一立方)
- //
- uint8_t NUM_INDICATORS; //指针个数(黑色+红色)
- uint32_t UNIT_OF_THE_LAST_INDICATOR; //最后一个指针的单位,最小单位1分升,1dL, 0.1L(万分之一立方)
- //
- uint32_t HOURS_FORM_LAST_1278; //当前时间 离上一次1278结果的 间隔小时数
- uint64_t MAX_FLOW_THRESHOLD; //当前时间距离上次准确识别时间内的最大流量,最小单位0.1L(1m³/10000), (万分之一立方)
- //
- uint64_t AI_RESULT; //最终的、经过校正步骤的结果,单位分升dL。 IS_UPLOAD_RED_IND_PART决定:AI_RESULT 是否等于 AI_COMPLETE_RESULT
- uint64_t AI_COMPLETE_RESULT;//最终的、完整的、经过校正步骤的结果,单位分升dL。 所谓完整是指:数字+指针表=数字和指针部分的结果;全指针表=黑色指针和红色指针的结果
- //
- uint16_t CONFIG_NUM_REGION[8];//数字区域的左上角(x,y),左下角(x,y),右下角(x,y),右上角(x,y)
- //
- uint16_t CONFIG_TWO_IND[4];//配置的第一个指针、最后一个指针的坐标(x,y),(x,y)
- //
- uint16_t CONFIG_METER_REGION[4];//配置的表盘区域的xmin、ymin、xmax、ymax坐标值
- //
- float BRIGHT_FACTOR; //图片亮度
- //
- uint16_t BIG_JPG_SIZE; //大图JPG图像的最大字节数
- uint8_t USE_TEST_JPG_FLAG; //AI输出JPG图是,使用测试图标记,1:使用,0:不使用
- //
- uint8_t COMPRESS_JPG_INDEX;//上一次JPG的压缩索引
- //
- uint8_t IS_UPLOAD_RED_IND_PART; //是否上传红色指针部分的数据(0:不上传;1:上传;默认1)
- //
- uint8_t IS_NUM_IN_UPPER;//数字区域在图像的上半部分还是下半部分?(0:上半部分; 1:下半部分; 默认0)
- //
- printf_ai_log printfAiLog; //上传日志的printf回调函数
- }Before_AI_struct_RX;
- #pragma pack()
- // ----------调用----------------
- // AI程序内部可以这样处理(不是在这个头文件中)
- // 1.定义
- // #define printf PrintAiLog
- // printf_ai_log PrintAiLog;
- // 2.赋值
- // PrintfAiLog = before_AI.printfAiLog;
- // 3.
- // 正常调用printf即可
- // ----------------------------
- //----------------------------------------------------------------------------------------
- #pragma pack(1)
- typedef struct {
- uint8_t METER_TYPE; //仪表类型,模型类型
- uint8_t RESULT_TYPE; //结果类型
- //
- uint64_t AI_RESULT; //最终的、经过校正步骤的结果,单位分升dL。 IS_UPLOAD_RED_IND_PART决定:AI_RESULT 是否等于 AI_COMPLETE_RESULT
- uint64_t INIT_AI_RESULT; //网络直接输出的、没有经过校正的最初识别结果,单位分升dL
- uint64_t AI_COMPLETE_RESULT;//最终的、完整的、经过校正步骤的结果,单位分升dL。所谓完整是指:数字+指针表=数字和指针部分的结果;全指针表=黑色指针和红色指针的结果
- //
- uint8_t IS_VALUE_CHANGED; //与上一次比较,水表读数是否在变化?变化范围包括数字+指针部分,也就是比较上次和本次的 AI_COMPLETE_RESULT
- //
- uint8_t AI_RESULT_ARRAY[2][12]; //03(本次结果)int数组的识别结果(2维数组,第一行元素为类别、第二行为识别概率)
- //
- uint8_t COMPRESS_JPG_INDEX;//上一次JPG的压缩索引
- //
- uint8_t AI_VER[4]; //AI程序的数字版本号
- //--2025年4月25日新增---------------------------
- uint16_t CONFIG_NUM_REGION[8];//数字区域的左上角(x,y),左下角(x,y),右下角(x,y),右上角(x,y)
- //
- uint16_t CONFIG_TWO_IND[4];//配置的第一个指针、最后一个指针的坐标(x,y),(x,y)
- //
- uint16_t CONFIG_METER_REGION[4];//配置的表盘区域的xmin、ymin、xmax、ymax坐标值
- }After_AI_struct_TX;
- #pragma pack()
- #pragma pack(1)//水利所小图841RGB
- typedef struct
- {
- uint16_t size_of_JPEG_data; //01(本次结果)数字区域的JPG数据长度
- unsigned char JPEG_data[841]; //02(本次结果)数字区域的JPG数字部分
- uint8_t number_region_index_of_header; //03(本次结果)JPG压缩头编号 (如果此值0-9,说明是彩色图,JPG文件头589字节;10-19,说明是灰度图,JPG文件头514字节)
- int image_height;//04 (本次结果)图像高度
- int image_width;//05 (本次结果)图像宽度
- }Num_Region_Image_ShuiLiSuo_struct_TX;
- #pragma pack()
- //----------------------------------------------------------------------------------------
- #pragma pack(1)//大图5700RGB
- typedef struct
- {
- uint16_t size_of_JPEG_data ; //01(本次结果)JPG格式的整张图片数据长度 (包括JPG数据, 包括文件头)
- unsigned char JPEG_data[50*1024]; // 02(本次结果)JPG格式的整张图片(包括JPG数据, 包括文件头)
- uint8_t whole_image_index_of_header; //03(本次结果)JPG压缩头编号。(如果此值0-9,说明是彩色图,JPG文件头589字节;10-19,说明是灰度图,JPG文件头514字节)
- uint16_t image_height;//04 (本次结果)图像高度
- uint16_t image_width;//05 (本次结果)图像宽度
- }Whole_Image_struct_TX;
- #pragma pack()
- //----------------------------------------------------------------------------------------
- #pragma pack(1)//拷机平台显示的 JPG图像
- typedef struct
- {
- // JPG图像部分
- uint16_t size_of_JPEG_data; //01(本次结果)数字区域的JPG数据长度
- unsigned char JPEG_data[20000]; //02(本次结果)数字区域的JPG数据部分
- uint8_t number_region_index_of_header; //03(本次结果)JPG压缩头编号 (如果此值0-9,说明是彩色图,JPG文件头589字节;10-19,说明是灰度图,JPG文件头514字节)
- uint16_t image_height;//04 (本次结果)JPG图像高度
- uint16_t image_width;//05 (本次结果)JPG图像宽度
- }Num_Region_Image_KaoJiPingTai_struct_TX;
- #pragma pack()
- //----------------------------------------------------------------------------------------
- #pragma pack(1)//2022年10月20日廉永健为了作为训练数据集使用的 BMP图像
- typedef struct
- {
- uint16_t size_of_BMP_data; //01(本次结果)数字区域的BMP 数据长度
- unsigned short BMP_data[320*120]; //02(本次结果)数字区域的 BMP 565彩色图 数据部分
- }BMP_Image_struct_TX;
- #pragma pack()
- //----------------------------------------------------------------------------------------
- //函数名:readingRecognition():进行AI识别的入口参数
- //输入参数1:unsigned short bmp_320240_data[]:摄像机拍摄的水表图像,大小为320*240
- //输入参数2:Before_AI_struct_RX *param_before_AI: 水表配置信息,以及上次检测结果
- //输入参数3:After_AI_struct_TX *param_after_AI: 保存本次的检测结果
- //输入参数4: Num_Region_Image_ShuiLiSuo_struct_TX *param_num_region_image_ShuiLiSuo_AI:水利所上传JPEG小图像:841字节
- //输入参数6: Whole_Image_struct_TX *param_whole_image_AI:保存生成的完整的水表JPEG大图像:4860字节
- void readingRecognition(
- unsigned short bmp_320240_data[],//1
- Before_AI_struct_RX *p_before_AI,//2
- After_AI_struct_TX *p_after_AI, //3
- Num_Region_Image_ShuiLiSuo_struct_TX *p_num_region_image_ShuiLiSuo_AI,//4
- Num_Region_Image_KaoJiPingTai_struct_TX *p_num_region_image_KaoJiPingTai_AI,//5
- Whole_Image_struct_TX *p_whole_image_AI,//6
- BMP_Image_struct_TX *p_BMP_Image_TX //7
- );
- #endif /* _READING_RECOGNITION_H_ */
|