车牌识别算法说明


REVISION HISTORY

Revision No.
Description
Date
1.0
  • First version
  • 03/05/2025

    1. 概述

    1.1. 算法说明

    车牌识别算法(License Plate Recognize, LPR)包括以下功能:车牌检测、车牌号识别、车牌颜色识别、车牌种类识别。所用模型及其功能如下:

    • 车牌检测模型(lpr_det48y.img)用于检测车牌,输出的类别共2类,分别单层车牌(class_id=0),双层车牌(class_id=1);

    • 车牌号识别模型(lpr_rec_s.img/lpr_rec_l.img)用于识别车牌号码;

    • 车牌颜色识别模型(lpr_cls.img)用于识别车牌颜色,蓝色(class_id=0),绿色(class_id=1),黄色(class_id=2),白色(class_id=3),黑色(class_id=4);

    2. API参考

    该功能模块提供以下API:

    API名称 功能
    ALGO_LPR_CreateHandle 创建句柄
    ALGO_LPR_InitHandle 初始化句柄
    ALGO_LPR_GetInputAttr 获取模型的属性信息
    ALGO_LPR_SetParams 设置算法运行参数
    ALGO_LPR_Detect 车牌检测
    ALGO_LPR_Recognize 在检测数据上进行车牌信息识别
    ALGO_LPR_DeInitHandle 反初始化句柄
    ALGO_LPR_ReleaseHandle 删除句柄

    2.1. ALGO_LPR_CreateHandle

    • 功能

      创建句柄

    • 语法

      MI_S32 ALGO_LPR_CreateHandle(void **handle);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
    • 返回值

      返回值 描述
      0 成功
      其他 失败(详见错误码
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    2.2. ALGO_LPR_InitHandle

    • 功能

      初始化句柄

    • 语法

      MI_S32 ALGO_LPR_InitHandle(void *handle, LprInitInfo_t *lpr_init_info);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
      lpr_init_info 配置ipu_firmware_path路径、模型文件夹路径、阈值 输入
    • 返回值

      返回值 描述
      0 成功
      其他 失败(详见错误码
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    2.3. ALGO_LPR_GetInputAttr

    • 功能

      获取模型的属性信息,包括模型输入分辨率以及输入数据的类型

    • 语法

      MI_S32 ALGO_LPR_GetInputAttr(void *handle, LprInputAttr_t *input_attr);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
      input_attr 输入属性 输出
    • 返回值

      返回值 描述
      0 成功
      其他 失败(详见错误码
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    2.4. ALGO_LPR_SetParams

    • 功能

      设置算法的可配置参数

    • 语法

      MI_S32 ALGO_LPR_SetParams(void *handle, const LprParams_t *params);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
      params 可配置参数 输入
    • 返回值

      返回值 描述
      0 成功
      其他 失败(详见错误码
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    2.5. ALGO_LPR_Detect

    • 功能

      运行车牌检测算法

    • 语法

      MI_S32 ALGO_LPR_Detect(void *handle, const LprInput_t *algo_input, LprResult_t lp_result[MAX_LPR_OBJECT], MI_S32 *lp_num);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
      algo_input 输入buffer 输入
      lp_result 车牌信息 输出
      lp_num 车牌数目 输出
    • 返回值

      返回值 描述
      0 成功
      其他 失败(详见错误码
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    2.6. ALGO_LPR_Recognize

    • 功能

      运行车牌信息识别算法

    • 语法

      MI_S32 ALGO_LPR_Recognize(void *handle, const LprInput_t *algo_input, LprInputAttr_t *input_attr, LprResult_t lp_result[MAX_LPR_OBJECT], MI_S32 *lp_num);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
      algo_input 原图输入buffer 输入
      input_attr 原图输入属性 输入
      lp_result 模型输出结构体 输出
      lp_num 车牌数目 输入
    • 返回值

      返回值 描述
      0 成功
      其他 失败(详见错误码
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    2.7. ALGO_LPR_DeInitHandle

    • 功能

      反初始化句柄

    • 语法

      MI_S32 ALGO_LPR_DeinitHandle(void *handle);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
    • 返回值

      返回值 描述
      0 成功
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    2.8. ALGO_LPR_ReleaseHandle

    • 功能

      删除句柄

    • 语法

      MI_S32 ALGO_LPR_ReleaseHandle(void *handle);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
    • 返回值

      返回值 描述
      0 成功
    • 依赖

      • 头文件:sgs_lpr_api.h

      • 库文件:libsgsalgo_lpr.a/libsgsalgo_lpr.so

    3. 结构体说明

    LPR相关数据类型定义如下:

    数据类型 定义
    LprInitInfo_t 算法初始化结构体
    LprInputAttr_t 算法输入属性结构体
    LprParams_t 算法运行参数结构体
    LprInput_t 算法输入结构体
    LprBox_t 算法检测框结构体
    LprQuality_t 算法车牌质量结构体
    LpColor_e 车牌颜色枚举变量
    LpType_e 车牌类别枚举变量
    LprInfo_t 车牌信息结构体
    LprResult_t 车牌识别结果结构体

    3.1 LprInitInfo_t

    • 说明

      算法初始化结构体

    • 定义

      typedef struct
      {
          char ipu_firmware_path[MAX_LPR_STRLEN];
          char det_model[MAX_LPR_STRLEN];
          char rec_model[MAX_LPR_STRLEN];
          char cls_model[MAX_LPR_STRLEN];
      
          MI_BOOL create_device;
          MI_BOOL destroy_device;
      } LprInitInfo_t;
      
    • 成员

      成员名称 描述
      ipu_firmware_path ipu_firmware_path路径
      det_model 车牌检测模型路径
      rec_model 车牌号识别模型路径
      cls_model 车牌颜色模型路径
      create_device 是否在算法库内进行IPU device的创建,默认为true,即在库内创建,在需同时调用算法库时可设置为false并在外部手动创建IPU device
      destroy_device 是否在算法库内进行IPU device的销毁,默认为true,即在库内销毁,在需同时调用算法库时可设置为false并在外部手动销毁IPU device
    • 相关数据类型及接口

      ALGO_LPR_InitHandle

    3.2 LprInputAttr_t

    • 说明

      算法输入属性结构体

    • 定义

      typedef struct
      {
          MI_U32 width;
          MI_U32 height;
          MI_IPU_ELEMENT_FORMAT format;
      }LprInputAttr_t;
      
    • 成员

      成员名称 描述
      width 模型输入数据的宽
      height 模型输入数据的高
      format 模型输入数据的类型
    • 相关数据类型及接口

      ALGO_LPR_GetInputAttr

    3.3 LprParams_t

    • 说明

      算法运行参数结构体

    • 定义

      typedef struct
      {
          MI_S32 disp_width;
          MI_S32 disp_height;
      
          MI_FLOAT det_threshold;
          MI_FLOAT rec_threshold;
          MI_FLOAT cls_threshold;
      
          MI_FLOAT quality_threshold;
          MI_FLOAT horizon_angle_threshold;
          MI_FLOAT vertical_angle_threshold;
          MI_FLOAT plate_area_threshold;
          MI_FLOAT keypoints_distance_threshold;
      }LprParams_t;
      
    • 成员

      成员名称 描述
      disp_width 显示码流的分辨率宽度(用于映射检测框位置)
      disp_height 显示码流的分辨率高度(用于映射检测框位置)
      det_threshold 车牌检测阈值
      rec_threshold 车牌号识别阈值
      color_threshold 车牌颜色识别阈值
      quality_threshold 车牌质量阈值
      horizon_angle_threshold 车牌水平倾角阈值
      vertical_angle_threshold 车牌垂直倾角阈值
      plate_area_threshold 车牌面积阈值
      keypoints_distance_threshold 车牌关键点偏移阈值
    • 相关数据类型及接口

      ALGO_LPR_SetParams

    3.4 LprInput_t

    • 说明

      算法输入结构体

    • 定义

      typedef struct
      {
          void *p_vir_addr;
          MI_PHY phy_addr;
          MI_U32 buf_size;
          MI_U64 pts;
          MI_U16 width;
          MI_U16 height;
          MI_BOOL filter;
      } LprInput_t;
      
    • 成员

      成员名称 描述
      p_vir_addr 输入buffer的虚拟地址
      phy_addr 输入buffer的物理地址
      buf_size 输入buffer的长度
      pts 输入buffer时间戳
      width 输入宽度
      height 输入高度
      filter 是否启用车牌质量过滤
    • 相关数据类型及接口

      ALGO_LPR_Detect

      ALGO_LPR_Recognize

    3.5 LprBox_t

    • 说明

      算法检测框结构体

    • 定义

      typedef struct
      {
          MI_U32 x;
          MI_U32 y;
          MI_U32 width;
          MI_U32 height;
          MI_S32 cls;
          MI_FLOAT det_score;
          MI_U64 pts;
          MI_FLOAT keypts[NUM_LPR_KEYPOINTS][2];
          MI_U64 track_id;
      } LprBox_t;
      
    • 成员

      成员名称 描述
      x,y, width, height 检测结果框的位置
      cls 检测结果框的类别ID
      det_score 检测结果框的分值
      pts 送入检测帧的时间戳
      keypts 车牌关键点
      track_id 车牌id
    • 相关数据类型及接口

      LprResult_t

    3.6 LprQuality_t

    • 说明

      算法车牌质量结构体

    • 定义

      typedef struct
      {
          MI_FLOAT quality_score;
          MI_FLOAT horizon_angle;
          MI_FLOAT vertical_angle;
          MI_FLOAT plate_area;
          MI_FLOAT keypoints_distance;
      } LprQuality_t;
      
    • 成员

      成员名称 描述
      quality_score 车牌质量得分
      horizon_angle 车牌水平倾角
      vertical_angle 车牌垂直倾角
      plate_area 车牌面积
      keypoints_distance 车牌关键点位移
    • 相关数据类型及接口

      ALGO_LPR_Detect

    3.7 LpColor_e

    • 说明

      车牌颜色枚举变量

    • 定义

      typedef enum
      {
          LP_COLOR_BLUE=0,
          LP_COLOR_GREEN,
          LP_COLOR_YELLOW,
          LP_COLOR_WHITE,
          LP_COLOR_BLACK
      }LpColor_e;
      
    • 成员

      成员名称 描述
      LP_COLOR_BLUE 蓝色车牌
      LP_COLOR_GREEN 绿色车牌
      LP_COLOR_YELLOW 黄色车牌
      LP_COLOR_WHITE 白色车牌
      LP_COLOR_BLACK 黑色车牌
    • 相关数据类型及接口

      LprResult_t

    3.8 LpType_e

    • 说明

      车牌类型枚举变量

    • 定义

      typedef enum
      {
          LP_TYPE_NORM=0,
          LP_TYPE_POLICE,
          LP_TYPE_ARMY,
          LP_TYPE_HONGKONG,
          LP_TYPE_MACAO,
          LP_TYPE_EMBASSY
      }LpType_e;
      
    • 成员

      成员名称 描述
      LP_TYPE_NORM 普通车牌
      LP_TYPE_POLICE 警用车牌
      LP_TYPE_ARMY 军用车牌
      LP_TYPE_HONGKONG 香港车牌
      LP_TYPE_MACAO 澳门车牌
      LP_TYPE_EMBASSY 大使馆车牌
    • 相关数据类型及接口

      LprResult_t

    3.9 LprInfo_t

    • 说明

      车牌信息结构体

    • 定义

      typedef struct
      {
          MI_FLOAT rec_score;
          char lp_number[MAX_LP_RESULT_LEN];
      
          MI_FLOAT cls_score;
          LpColor_e lp_color;
          LpType_e lp_type;
      } LprInfo_t;
      
    • 成员

      成员名称 描述
      rec_score 车牌号识别得分
      lp_number 车牌号码
      cls_score 车牌颜色识别得分
      lp_color 车牌颜色
      lp_type 车牌类别
    • 相关数据类型及接口

      LprResult_t

    3.10 LprResult_t

    • 说明

      车牌识别结果结构体

    • 定义

      typedef struct
      {
          LprBox_t box;
          LprQuality_t quality;
          LprInfo_t info;
      }LprResult_t;
      
    • 成员

      成员名称 描述
      LprBox_t 车牌检测结构体
      LprQuality_t 车牌质量结构体
      LprInfo_t 车牌信息结构体
    • 相关数据类型及接口

      ALGO_LPR_Detect

      ALGO_LPR_Recognize

    4. 错误码

    错误码 数值 描述
    E_ALGO_SUCCESS 0 操作成功
    E_ALGO_HANDLE_NULL 1 算法句柄为空
    E_ALGO_INVALID_PARAM 2 无效的输入参数
    E_ALGO_DEVICE_FAULT 3 硬件错误
    E_ALGO_LOADMODEL_FAIL 4 加载模型失败
    E_ALGO_INIT_FAIL 5 算法初始化失败
    E_ALGO_NOT_INIT 6 算法尚未初始化
    E_ALGO_INPUT_DATA_NULL 7 算法输入数据为空
    E_ALGO_INVALID_INPUT_SIZE 8 无效的算法输入数据维度
    E_ALGO_INVALID_LICENSE 9 无效的license许可
    E_ALGO_MEMORY_OUT 10 内存不足
    E_ALGO_FILEIO_ERROR 11 文件读写操作错误
    E_ALGO_INVALID_OUTPUT_SIZE 12 无效的算法输出数据维度
    E_ALGO_INVALID_DECODE_MODE 13 无效解码模式
    E_ALGO_MODEL_INVOKE_ERROR 14 Invoke失败