Files
arcs/arcs-sdk/components/acomp/fd/acomp_fd.h
2026-08-13 16:50:52 +08:00

372 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stdint.h>
#include "../utils/acomp_err.h"
#include "acomp_stream_ipc.h"
#include "acomp_fd_params.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifndef BIT
#define BIT(x) (1 << (x))
#endif
/* 人脸识别组件参数设置 */
/**
* @brief 人脸识别参数键值对
*/
typedef struct{
uint32_t key; /* 参数键(参见 acomp_fd_params.h的 acomp_fd_params_e枚举 */
float value; /* 参数值 */
}acomp_fd_param_t;
/**
* @brief 人脸识别的输入图片帧结构体
*/
typedef struct{
acomp_fd_pixel_format format; /* 像素格式(如 PIX_FMT_BGR888, PIX_FMT_YUV422 等) */
uint32_t index; /* 帧索引号 */
uint16_t width; /* 图像宽度(像素) */
uint16_t height; /* 图像高度(像素) */
uint32_t length; /* 图像数据长度(字节) */
uint32_t resv[4]; /* reserved */
uint8_t data[0]; /* 图像数据指针 */
} __attribute__((packed)) acomp_fd_input_frame_t;
/**
* @brief 活体检测模式配置
*/
typedef struct{
int enable; /* 是否启用活体检测0:禁用 1:启用) */
float score_threshold[2]; /* 活体检测阈值 [0]:假人阈值 [1]:真人阈值, 在真人得分 > 真人阈值的情况下才会进行人脸特征提取和人脸识别 */
}acomp_fd_live_detect_mode_t;
/* 人脸识别组件结果 */
/**
* @brief 人脸检测矩形框
*/
typedef struct{
int x; /* 矩形框左上角x坐标 */
int y; /* 矩形框左上角y坐标 */
int w; /* 矩形框宽度 */
int h; /* 矩形框高度 */
}acomp_fd_rect_t;
/**
* @brief 人脸头部姿态角度
*/
typedef struct{
float yaw; /* 偏航角(左右转头),范围 -90° ~ +90° */
float pitch; /* 俯仰角(上下点头),范围 -90° ~ +90° */
float roll; /* 翻滚角(左右歪头),范围 -180° ~ +180° */
}acomp_fd_head_pose_t;
/**
* @brief 人脸关键点(特征点)
*/
typedef struct{
int x; /* 关键点x坐标 */
int y; /* 关键点y坐标 */
float score; /* 关键点置信度得分 */
float visable; /* 关键点可见性0-11表示完全可见 */
}acomp_fd_align_point_t;
/**
* @brief 人脸活体检测结果
*/
typedef struct {
float scores[2]; /* 活体检测得分 [0]:假人得分 [1]:真人得分 */
int status; /* 活体检测状态0:假人 1:真人) */
}acomp_fd_live_detect_result_t;
typedef struct {
float features[ACOMP_FD_MAX_FEATURE_CNT]; /* 人脸特征点 */
int feature_cnt; /* 人脸特征点个数 */
}acomp_fd_feature_result_t;
/**
* @brief 人脸检测完整结果
*/
typedef struct {
acomp_fd_rect_t face_rect; /* 人脸检测矩形框 */
float face_score; /* 人脸检测得分 */
acomp_fd_align_point_t align_points[ACOMP_FD_MAX_ALIGN_CNT]; /* 人脸标定点 */
int n_align_point; /* 人脸标定点个数 */
acomp_fd_head_pose_t pose; /* 人脸头部姿势 */
acomp_fd_live_detect_result_t live_result; /* 活体检测结果 */
int face_id; /* 人脸id */
float features[ACOMP_FD_MAX_FEATURE_CNT]; /* 人脸特征点 */
int feature_cnt; /* 人脸特征点个数 */
float compare_scores[ACOMP_FD_MAX_RESULT_CNT];/* 输入图片和已注册人脸特征(最大10个人脸注册)的比较得分 */
int compare_cnt; /* 已经注册人脸特征个数 */
}acomp_fd_result_t;
typedef struct {
uint32_t results_cnt;
uint32_t max_area_results_index;
acomp_fd_result_t results[0];
}acomp_fd_result_info_t;
/*人脸识别组件回调事件定义*/
#define FD_CB_EVENT_ENGINE_RLT BIT(0) /*人脸识别引擎结果返回*/
#define FD_CB_EVENT_ENGINE_WR_ERR BIT(1) /*算法引擎数据写入出错*/
typedef void (*fd_event_cb_t)(uint32_t event, void *event_data, uint32_t event_data_len, void *priv);
/**
* @brief 初始化人脸识别组件FD
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_NO_MEM : 没有足够内存
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
* @retval ACOMP_ERR_NOT_FOUND : 设备未找到
*
*/
extern int acomp_fd_init(void);
// /**
// * @brief 逆初始化人脸识别组件FD
// *
// * @return GCL_OK : 成功
// * @retval -GCL_ERR_COMM_FAIL(209) : 通讯失败
// *
// */
// extern int acomp_fd_deinit(void);
/**
* @brief 就绪人脸识别组件FD
*
* @note 该函数会初始化内存块及算法资源在调用fd_gcl_start之前必须调用该函数让组件进入就绪状态。
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_NO_MEM : 没有足够内存
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_prepare(void);
/**
* @brief 复位人脸识别组件FD
*
* @note 该函数会释放内存块及算法资源。
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_cleanup(void);
/**
* @brief 启动人脸识别组件FD
*
* @note 该函数会启动人脸识别组件,之后用户可以向组件输入视频流
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_NO_MEM : 没有足够内存
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_start(void);
/**
* @brief 停止人脸识别组件FD
*
* @note 该函数会停止人脸识别组件,之后不会处理视频流数据
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_NO_MEM : 没有足够内存
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_stop(void);
/**
* @brief 设置组件参数
*
* @note 设置组件参数信息该参数项将在组件进入就绪态时生效调用fd_gcl_prepare
*
* @param params[in] 存储acomp_fd_param_t参数的结构指针
* @param params_cnt[in] acomp_fd_param_t的个数
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_params_set(const acomp_fd_param_t *params, uint32_t params_cnt);
/**
* @brief 获取组件参数
*
* @note 获取组件参数信息该参数项将在组件进入就绪态时生效调用fd_gcl_prepare
*
* @param params[out] 存储acomp_fd_param_t参数的结构指针
* @param params_cnt[out] acomp_fd_param_t的个数
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_params_get(const acomp_fd_param_t *params, uint32_t *params_cnt);
/**
* @brief 设置人脸标定的头部姿势的阈值
*
* @note 如果超过这些阈值,就不会进行活体检测和人脸特征获取
*
* @param params[in] 存储acomp_fd_head_pose_t参数的结构指针
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_align_threshold_set(const acomp_fd_head_pose_t *threshold);
/**
* @brief 设置人脸活体检测的模式
*
* @note 这个函数用来设置是否使能活体检测,以及设置活体检测的得分阈值
*
* @param params[in] 存储acomp_fd_live_detect_mode_t参数的结构指针
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_live_detect_mode_set(const acomp_fd_live_detect_mode_t *mode);
/**
* @brief 从外部导入人脸特征到注册库
*
* @note 导入外部特征到注册库,用于后续人脸识别
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_NO_MEM : 没有足够内存
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_features_load(const acomp_fd_feature_result_t *features, uint32_t count);
/**
* @brief 给组件增加事件回调函数
*
* @param events[in] 待增加的事件位,可以同步注册多个事件位;
* @param cb[in] 回调的函数指针;
* @param priv[in] 回调函数的私有数据指针;
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_NO_MEM : 没有足够内存
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
*
*/
extern int acomp_fd_add_callback(uint32_t events, fd_event_cb_t cb, void *priv);
/**
* @brief 移除组件的毁掉函数
*
* @param cb[in] 待移除的回调函数
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
* @retval ACOMP_ERR_NOT_SUPPORTED : 无效操作
*
*
*/
extern int acomp_fd_remove_callback(fd_event_cb_t cb);
/**
* @brief 使能流通道
*
* @param chn[in] 通道索引
* @param desc[in] 通道描述符指针
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
* @retval ACOMP_ERR_CREATE_STREAM_FAILED : 创建流失败
*
*/
extern int acomp_fd_stream_ch_enable(int chn, acomp_stream_chn_create_desc_t *desc);
/**
* @brief 禁用流通道
*
* @param chn[in] 通道索引
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
*
*/
extern int acomp_fd_stream_ch_disable(int chn);
/**
* @brief 获取RX流缓冲区
*
* @param chn[in] 通道索引
* @param len[out] 数据长度指针
* @param desc_idx[out] 描述符索引指针
*
* @return 缓冲区指针如果失败返回NULL
*
*/
extern void* acomp_fd_stream_rx_buffer_get(int chn, uint32_t* len, uint16_t* desc_idx);
/**
* @brief 释放RX流缓冲区
*
* @param chn[in] 通道索引
* @param desc_idx[in] 描述符索引
* @param len[in] 数据长度
* @param buffer[in] 缓冲区指针
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
*
*/
extern int acomp_fd_stream_rx_buffer_release(int chn, uint16_t desc_idx, uint32_t len, void* buffer);
/**
* @brief 分配TX流缓冲区用于向remote发送视频数据
*
* @param chn[in] 通道索引
* @param len[out] 可用缓冲区长度指针
* @param desc_idx[out] 描述符索引指针
*
* @return 缓冲区指针如果失败返回NULL
*
*/
extern void* acomp_fd_stream_tx_buffer_alloc(int chn, uint32_t* len, uint16_t* desc_idx);
/**
* @brief 提交TX流缓冲区发送视频数据到remote
*
* @param chn[in] 通道索引
* @param buffer[in] 缓冲区指针
* @param len[in] 数据长度
* @param desc_idx[in] 描述符索引
*
* @return ACOMP_ERR_OK : 成功
* @retval ACOMP_ERR_INVALID_STATE : 无效状态
* @retval ACOMP_ERR_INVALID_ARG : 错误参数
*
*/
extern int acomp_fd_stream_tx_buffer_submit(int chn, void* buffer, uint32_t len, uint16_t desc_idx);
#ifdef __cplusplus
}
#endif