手势识别算法
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
101 | 03/22/2024 |
1. 算法描述¶
手势识别算法主要对13种手势进行识别:
- 静态手势(10类):L、dislike、ok、fist、stop、like、yes、one、call、rock
- 动态手势(3类):wave_up、wave_down、grip
- 使用时请遵照如下图所示的标准手势,以保证算法的识别效果:
2. 接口调用流程¶
算法接口调用流程为 ALGO_HandPose_CreateHandle->ALGO_HandPose_InitHandle->ALGO_HandPose_GetInputAttr->ALGO_HandPose_SetParams->ALGO_HandPose_Detect->ALGO_HandPose_Cls->ALGO_HandPose_DeinitHandle->ALGO_HandPose_ReleaseHandle.
3. 功能模块API¶
API名 | 功能 |
---|---|
ALGO_HandPose_CreateHandle | 创建句柄 |
ALGO_HandPose_InitHandle | 初始化句柄 |
ALGO_HandPose_GetInputAttr | 获取输入属性 |
ALGO_HandPose_SetParams | 设置参数 |
ALGO_HandPose_Detect | 人手部检测 |
ALGO_HandPose_Cls | 手势识别 |
ALGO_HandPose_DeinitHandle | 句柄反初始化 |
ALGO_HandPose_ReleaseHandle | 释放句柄 |
3.1. ALGO_HandPose_CreateHandle¶
-
功能
创建句柄
-
语法
MI_S32 ALGO_HandPose_CreateHandle(void** handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.2. ALGO_HandPose_InitHandle¶
-
功能
初始化句柄
-
语法
MI_S32 ALGO_HandPose_InitHandle(void *handle, const PoseInit_t *init);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 init 初始化参数 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.3. ALGO_HandPose_GetInputAttr¶
-
功能
获取输入属性
-
语法
MI_S32 ALGO_HandPose_GetInputAttr(void *handle, PoseInputAttr_t *det_input_attr, PoseInputAttr_t *cls_input_attr);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 det_input_attr 检测模型输入属性(宽、高、图像格式) 输出 cls_input_attr 识别模型输入属性(宽、高、图像格式) 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.4. ALGO_HandPose_SetParams¶
-
功能
设置参数
-
语法
MI_S32 ALGO_HandPose_SetParams(void *handle, const PoseParams_t* params);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 params 参数 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.5. ALGO_HandPose_Detect¶
-
功能
人手部检测
-
语法
MI_S32 ALGO_HandPose_Detect(void *handle, const PoseInput_t *input, PoseBox_t boxes[MAX_POSE_OBJECT], MI_S32 *num_boxes);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input 检测模型输入数据800*480 yuv420_nv12 输入 boxes 检测框结果 输出 num_boxes 检测框个数 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.6. ALGO_HandPose_Cls¶
-
功能
手部姿态识别,识别13种手势中的哪种手势
-
语法
MI_S32 ALGO_HandPose_Cls(void *handle, const PoseInput_t *input, PoseBox_t* box, PoseCls_t* cls);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input 识别模型输入数据224*224 yuv420_nv12 输入 box 手部检测框 输入 cls 手部姿态结果 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.7. ALGO_HandPose_DeinitHandle¶
-
功能
句柄反初始化
-
语法
MI_S32 ALGO_HandPose_DeinitHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.8. ALGO_HandPose_ReleaseHandle¶
-
功能
释放句柄
-
语法
MI_S32 ALGO_HandPose_ReleaseHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
4. 数据类型¶
数据类型 | 定义 |
---|---|
PoseInit_t | 初始化参数结构体 |
PoseInput_t | 输入图像属性结构体 |
PoseInputAttr_t | 模型输入数据结构体 |
PoseCls_t | 手势识别结果结构体 |
PoseBox_t | 手部检测框结构体 |
PoseParams_t | 输入参数结构体 |
HandPoseClass_e | 手势类别信息 |
HandKeyPoint_e | 手部关键点类别信息 |
4.1. PoseInit_t¶
-
说明
初始化参数结构体
-
定义
typedef struct { char ipu_firmware_path[MAX_POSE_STRLEN]; char pose_model[MAX_POSE_STRLEN]; char cls_model[MAX_POSE_STRLEN]; MI_BOOL create_device; MI_BOOL destroy_device; } PoseInit_t;
-
成员
成员名称 描述 ipu_firmware_path ipu_firmware_bin路径 pose_model 检测模型路径(如: ./models/handpose_det48y_20240313.img) cls_model 识别模型路径(如:./models/handpose_cls_20240222.img) create_device 是否创建device:若为false,需要在算法库外自行创建device;若为true,在算法库内部自动创建device destroy_device 是否销毁device:若为false,需要在算法库外自行销毁device,若为true,在算法库内部自动销毁device -
相关接口
4.2. PoseInput_t¶
-
说明
输入图像数据结构体
-
定义
typedef struct { void *p_vir_addr; MI_PHY phy_addr; MI_U32 buf_size; MI_U64 pts; MI_U16 width; MI_U16 height; } PoseInput_t;
-
成员
成员名称 描述 p_vir_addr 虚拟地址 phy_addr 物理地址 buf_size 数据大小 pts 时间戳可不赋值 width 图片宽 height 图片高 -
相关数据类型及接口
4.3. PoseInputAttr_t¶
-
说明
模型输入属性结构体
-
定义
typedef struct { MI_U32 width; MI_U32 height; MI_IPU_ELEMENT_FORMAT format; } PoseInputAttr_t;
-
成员
成员名称 描述 width 输入图片宽 height 输入图片高 format 输入图片格式 -
相关数据类型及接口
4.4. PoseCls_t¶
-
说明
手势识别结果结构体
-
定义
typedef struct { MI_S32 cls; MI_FLOAT score; } PoseCls_t;
-
成员
成员名称 描述 cls 手势类别(对应关系见HandPoseClass_e) score 手势类别得分 -
相关数据类型及接口
4.5. PoseBox_t¶
-
说明
手部检测框结构体
-
定义
typedef struct { MI_U32 x; MI_U32 y; MI_U32 width; MI_U32 height; MI_S32 cls; MI_FLOAT score; MI_U64 pts; MI_FLOAT keypts[MAX_POSE_NUM_KEYPTS][2]; MI_U64 track_id; } PoseBox_t;
-
成员
成员名称 描述 x 框的左上横坐标 y 框的左上纵坐标 width 框的宽 height 框的高 cls 框的类别 score 框的分值 pts 时间戳可不赋值 keypts 关键点序列 track_id 跟踪id -
相关数据类型及接口
4.6. PoseParams_t¶
-
说明
输入参数结构体
-
定义
typedef struct { MI_S32 disp_width; MI_S32 disp_height; MI_FLOAT min_width; MI_FLOAT min_height; MI_FLOAT det_threshold; MI_FLOAT cls_threshold; MI_FLOAT attr_threshold[MAX_POSE_NUM_ATTR]; } PoseParams_t;
-
成员
成员名称 描述 disp_width 显示宽度 disp_height 显示高度 min_width 检测的最小宽度 min_height 检测的最小高度 det_threshold 检测阈值 cls_threshold 识别阈值(阈值越高识别标准越严格) attr_threshold 属性阈值(手势识别中无用) -
相关数据类型及接口
4.7. HandPoseClass_e¶
-
说明
手势类别信息
-
定义
typedef enum { E_HAND_POSE_NONE = 0, E_HAND_POSE_CALL, E_HAND_POSE_DISLIKE, E_HAND_POSE_FIST, E_HAND_POSE_FOUR, E_HAND_POSE_LIKE, E_HAND_POSE_MUTE, E_HAND_POSE_OK, E_HAND_POSE_ONE, E_HAND_POSE_PALM, E_HAND_POSE_PEACE, E_HAND_POSE_ROCK, E_HAND_POSE_STOP, E_HAND_POSE_STOP_INV, E_HAND_POSE_THREE, E_HAND_POSE_TWO_UP, E_HAND_POSE_TWO_UP_INV, E_HAND_POSE_THREE2, E_HAND_POSE_PEACE_INV, E_HAND_POSE_DOWN_INV, E_HAND_POSE_L, E_HAND_POSE_WAVE_UP, E_HAND_POSE_WAVE_DOWN, E_HAND_POSE_GRIP, E_NUM_HAND_POSE } HandPoseClass_e;
-
相关数据类型及接口
4.8. HandKeyPoint_e¶
-
说明
手部关键点类别信息
-
定义
typedef enum { E_WRIST = 0, E_THUMB_CMC, E_THUMB_MCP, E_THUMB_IP, E_THUMB_TIP, E_INDEX_FINGER_MCP, E_INDEX_FINGER_PIP, E_INDEX_FINGER_DIP, E_INDEX_FINGER_TIP, E_MIDDLE_FINGER_MCP, E_MIDDLE_FINGER_PIP, E_MIDDLE_FINGER_DIP, E_MIDDLE_FINGER_TIP, E_RING_FINGER_MCP, E_RING_FINGER_PIP, E_RING_FINGER_DIP, E_RING_FINGER_TIP, E_PINKY_MCP, E_PINKY_PIP, E_PINKY_DIP, E_PINKY_TIP, E_NUM_HAND_KEYPTS } HandKeyPoint_e;
-
图例
-
相关数据类型及接口