You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

371 lines
12 KiB

#ifndef CWFaceDefine_H
#define CWFaceDefine_H
#ifdef CWFACESDK_EXPORTS
#define CW_FACE_API __declspec(dllexport)
#else
#define CW_FACE_API
#endif
/***************
* 检测功能开关选项
*/
#define CW_OP_DET 0 // (1<<0)进行人脸检测,并返回人脸矩形位置,默认开启
#define CW_OP_TRACK 2 // (1<<1)进行人脸跟踪,并返回人脸跟踪的ID
#define CW_OP_KEYPT 4 // (1<<2)进行人脸关键点检测,并返回人脸上的关键点坐标信息
#define CW_OP_ALIGN 8 // (1<<3)进行人脸图像对齐,并返回对齐后的人脸图像,用来提取特征
#define CW_OP_QUALITY 16 // (1<<4)人脸质量评估开关(质量分子项开关在配置文件中配置)
#define CW_OP_ALL 30 // (所有开关综合)总开关
/***************
* 通用错误码
*/
typedef enum cw_errcode
{
CW_SDKLIT_OK = 0, // 成功 or 合法
CW_UNKNOWN_ERR = 20000, // 未知错误
CW_DETECT_INIT_ERR, // 初始化人脸检测器失败:如加载模型失败等
CW_KEYPT_INIT_ERR, // 初始化关键点检测器失败:如加载模型失败等
CW_QUALITY_INIT_ERR, // 初始化跟踪器失败:如加载模型失败等
CW_DET_ERR, // 检测失败
CW_TRACK_ERR, // 跟踪失败
CW_KEYPT_ERR, // 提取关键点失败
CW_ALIGN_ERR, // 对齐人脸失败
CW_QUALITY_ERR, // 质量评估失败
CW_EMPTY_FRAME_ERR, // 空图像
CW_UNSUPPORT_FORMAT_ERR, // 图像格式不支持
CW_ROI_ERR, // ROI设置失败
CW_UNINITIALIZED_ERR, // 尚未初始化
CW_MINMAX_ERR, // 最小最大人脸设置失败
CW_OUTOF_RANGE_ERR, // 数据范围错误
CW_UNAUTHORIZED_ERR, // 未授权
CW_PARAM_INVALID, // 参数无效
CW_METHOD_UNAVAILABLE, // 方法无效
CW_BUFFER_EMPTY, // 缓冲区空
CW_FILE_UNAVAILABLE, // 文件不存在:如加载的模型不存在等.
CW_DEVICE_UNAVAILABLE, // 设备不存在
CW_DEVICE_ID_UNAVAILABLE, // 设备id不存在
CW_EXCEEDMAXHANDLE_ERR, // 超过授权最大句柄数
CW_RECOG_FEATURE_MODEL_ERR, // 加载特征识别模型失败
CW_RECOG_ALIGNEDFACE_ERR, // 对齐图片数据错误
CW_RECOG_MALLOCMEMORY_ERR, // 预分配特征空间不足
CW_RECOG_FEATUREDATA_ERR, // 特征数据错误
CW_RECOG_EXCEEDMAXFEASPEED, // 超过授权最大提特征速度
CW_RECOG_EXCEEDMAXCOMSPEED, // 超过授权最大比对速度
CW_RECOG_GROUPSIZE_ERR, // 特征比对特征数N超过最大授权数
CW_RECOG_CONVERT_ERR, // 特征转换失败
CW_RECOG_NOFACEDET, // 未检测到人脸
CW_LICENCE_JSON_CREATE_ERR, // Json操作失败
CW_LICENCE_DECRYPT_ERR, // 加密失败
CW_LICENCE_HTTP_ERROR, // HTTP失败
CW_LICENCE_MALLOCMEMORY_ERR, // 授权内存分配不足
CW_LICENCE_KEY_DEVICE_ERR, // 获取设备文件错误
CW_LICENCE_KEY_LICENSE_ERR, // 获取授权文件错误
CW_LICENCE_KEY_INSTALL_ERR, // 安装授权文件错误
CW_ATTRI_AGEGENDER_MODEL_ERR, //加载年龄性别模型失败
CW_ATTRI_EVAL_AGE_ERR, //年龄识别失败
CW_ATTRI_EVAL_GENDER_ERR, //性别识别失败
CW_ATTRI_EVAL_RACE_ERR, //种族识别失败
} cw_errcode_t;
/***************
* 关键点信息
*/
#define CW_MAX_KEYPT_NUM 68
typedef struct cw_point
{
float x;
float y;
} cw_point_t;
typedef struct cw_keypt
{
cw_point_t points[CW_MAX_KEYPT_NUM]; // 关键点
int nkeypt; // 关键点个数
float keyptScore; // 关键点得分,推荐阈值为0.7
} cw_keypt_t;
/***************
* 质量分检测错误码
*/
typedef enum cw_quality_errcode
{
CW_QUALITY_OK = 0, // 质量分数据有效
CW_QUALITY_NO_DATA = 20150, // 质量分数据无效,原因:尚未检测
CW_QUALITY_ERROR_UNKNOWN, // 未知错误
} cw_quality_errcode_t;
/***************
* 接口功能参数
*/
typedef struct cw_det_param
{
int roiX; // roi, 默认整帧图像0, 0, 0, 0 若设置为异常值检测阶段将恢复默认
int roiY;
int roiWidth;
int roiHeight;
int minSize; // 检测人脸尺寸范围: pc端默认[48,600];移动端默认[100,400]
int maxSize;
const char* pConfigFile; // 内部参数配置文件路径,此参数只能设置(set);从句柄内部获取出来的一律无效
} cw_det_param_t;
/***************
* 图像旋转角度(逆时针)
*/
typedef enum cw_img_angle
{
CW_IMAGE_ANGLE_0 = 0,
CW_IMAGE_ANGLE_90,
CW_IMAGE_ANGLE_180,
CW_IMAGE_ANGLE_270
} cw_img_angle_t;
/***************
* 图像镜像
*/
typedef enum cw_img_mirror
{
CW_IMAGE_MIRROR_NONE = 0, // 不镜像
CW_IMAGE_MIRROR_HOR, // 水平镜像
CW_IMAGE_MIRROR_VER, // 垂直镜像
CW_IMAGE_MIRROR_HV // 垂直和水平镜像
} cw_img_mirror_t;
/***************
* 图像格式
*/
typedef enum cw_img_form
{
CW_IMAGE_GRAY8 = 0,
CW_IMAGE_BGR888,
CW_IMAGE_BGRA8888,
CW_IMAGE_RGB888,
CW_IMAGE_RGBA8888,
CW_IMAGE_YUV420P,
CW_IMAGE_YV12,
CW_IMAGE_NV12,
CW_IMAGE_NV21,
CW_IMAGE_BINARY,
} cw_img_form_t;
/***************
* 图像
*/
typedef struct cw_img
{
long long frameId; // 帧号
char* data; // 图像数据(必须预分配足够的空间)
int dataLen; // 数据长度,CW_IMAGE_BINARY格式必须设置,其他格式可不设
int width; // 宽, CW_IMAGE_BINARY格式可不设,其他格式必须设置
int height; // 高, CW_IMAGE_BINARY格式可不设,其他格式必须设置
cw_img_form_t format; // 图像格式
cw_img_mirror_t mirror; // 镜像
cw_img_angle_t angle; // 旋转角度
} cw_img_t;
/***************
* 人脸区域
*/
typedef struct cw_facepos_rect
{
int x;
int y;
int width;
int height;
} cw_facepos_rect_t;
/***************
* 对齐人脸图像结构
*/
#define CW_ALIGNED_SIZE 128
typedef struct cw_aligned_face
{
char data[CW_ALIGNED_SIZE * CW_ALIGNED_SIZE]; // 对齐人脸图像数据
int width; // 宽
int height; // 高
int nChannels; // 图像通道
} cw_aligned_face_t;
/***************
* 人脸质量分
*/
#define FACE_QUALITY_MAX_COUNT 20
typedef struct cw_quality
{
cw_quality_errcode_t errcode; // 质量分析错误码
float scores[FACE_QUALITY_MAX_COUNT]; /* 质量分分数项,具体含义(根据数据下标顺序):
* 0 - 人脸质量总分,0.72
* 1 - 清晰度,越大表示越清晰,推荐范围0.65-1.0(在启用第16个项mog分数的总分时,此分数为常数1.0,请忽略)
* 2 - 亮度,越大表示越亮,推荐范围0.2-0.8
* 3 - 人脸角度,左转为正,右转为负
* 4 - 人脸角度,抬头为正,低头为负
* 5 - 人脸角度,顺时针为正,逆时针为负
* 6 - 左右转程度,越大表示角度越正,推荐范围0.5-1.0
* 7 - 抬低头程度,越大表示角度越正,推荐范围0.5-1.0
* 8 - 肤色接近真人肤色程度,越大表示越真实,推荐范围0.5-1.0
* 9 - 张嘴分数, 越大表示越可能张嘴,推荐范围0.0-0.5
* 10 - 左眼睁眼分数, 越大表示左眼越可能是睁眼,推荐范围0.5-1.0
* 11 - 右眼睁眼分数, 越大表示右眼越可能是睁眼,推荐范围0.5-1.0
* 12 - 戴黑框眼镜置信度,越大表示戴黑框眼镜的可能性越大,推荐范围0.0-0.5
* 13 - 戴墨镜的置信分,越大表示戴墨镜的可能性越大,推荐范围0.0-0.5
* 14 - 左眼眼睛被遮挡的置信度,越大表示眼镜越可能被遮挡,目前只在睁眼分小于0.5时有意义,推荐范围0.0-0.5
* 15 - 右眼眼睛被遮挡的置信度,越大表示眼镜越可能被遮挡,目前只在睁眼分小于0.5时有意义,推荐范围0.0-0.5
* 16 - mog清晰度,返回0.0~1.0的分数,越大越清晰,阈值建议0.100001
* 17 - 口罩分,0.0~1.0,越大表示越不可能带口罩,建议阈值0.44左右.(注意要用支持口罩检测的检测模型)
*/
} cw_quality_t;
/***************
* 人脸综合信息
*/
typedef struct cw_face_res
{
long long frameId; // 人脸所在帧号
int detected; // 0: 跟踪到的人脸; 1: 检测到的人脸; 2:检测到但不会被进行后续计算(关键点)的人脸;
// 3: 可能是静态误检框;4:大角度人脸; 5:关键点错误; 6:不需再处理的人脸(只有标记为1的人脸,关键点、
// 对齐、质量分才有效;但除0之外其他都可能有口罩分)7:被估计为低质量人脸
int trackId; // 人脸ID(ID<0表示没有进入跟踪)
cw_facepos_rect_t faceRect; // 人脸框
cw_keypt_t keypt; // 关键点
cw_aligned_face_t faceAligned; // 对齐人脸
cw_quality_t quality; // 人脸质量
} cw_face_res_t;
/***************
* 人脸识别句柄模式
*/
typedef enum cw_recog_pattern
{
CW_FEATURE_EXTRACT = 0, // 特征提取
CW_RECOGNITION = 1 // 识 别
} cw_recog_pattern_t;
//////////////////////////////////////////////////////////////////////////红外活体
/***************
* 红外活体检测结果返回值
*/
typedef enum cw_nirliv_det_rst
{
CW_NIR_LIV_DET_LIVE = 0, // 以阈值0.5判断为活体
CW_NIR_LIV_DET_UNLIVE, // 以阈值0.5判断为非活体
CW_NIR_LIV_DET_DIST_FAILED, // 人脸距离检测未通过
CW_NIR_LIV_DET_SKIN_FAILED, // 人脸肤色检测未通过
CW_NIR_LIV_DET_NO_PAIR_FACE, // 未匹配到人脸
CW_NIR_LIV_DET_IS_INIT // 红外活体检测结果初始值
}cw_nirliv_det_rst_t;
/***************
* 红外活体检测错误码
*/
typedef enum cw_nirliveness_err
{
CW_NIRLIV_OK = 0, // 成功返回
CW_NIRLIV_ERR_CREATE_HANDLE = 26000, // 创建红外活体检测句柄失败
CW_NIRLIV_ERR_FREE_HANDLE, // 释放红外活体检测句柄失败
CW_NIRLIV_ERR_FACE_PAIR, // 人脸匹配初始化失败
CW_NIRLIV_ERR_CREAT_LOG_DIR, // 创建日志路径失败
CW_NIRLIV_ERR_MODEL_NOTEXIST, // 输入模型不存在
CW_NIRLIV_ERR_MODEL_FAILED, // 输入模型初始化失败
CW_NIRLIV_ERR_INPUT_UNINIT, // 输入未初始化
CW_NIRLIV_ERR_NIR_NO_FACE, // 输入红外图片没有人脸
CW_NIRLIV_ERR_VIS_NO_FACE, // 输入可见光图片没有人脸
CW_NIRLIV_ERR_NO_PAIR_FACE, // 输入可见光和红外图片人脸未能匹配
CW_NIRLIV_ERR_PUSH_DATA, // 输入数据失败
CW_NIRLIV_ERR_NUM_LANDMARKS, // 输入可见光图片和红外图片关键点个数不等
CW_NIRLIV_ERR_NO_LANDMARKS, // 输入红外图片没有人脸关键点
CW_NIRLIV_ERR_INPUT_IMAGE, // 输入红外图片或者可见光图片不是多通道
CW_NIRLIV_ERR_UNAUTHORIZED, // 没有license(未授权)
CW_NIRLIV_ERR_FACE_NUM_ERR, // 未开启人脸匹配开关时,可见光或红外图像人脸大于1
CW_NIRLIV_ERR_CAM_UNCW, // 非云从定制摄像头
CW_NIRLIV_ERR_UNKNOWN, // 未知结果
CW_NIRLIV_ERR_MAXHANDLE, // 超过最大红外活体最大授权句柄数
CW_NIRLIV_ERR_NIRIMAGE, // 输入红外图片数据错误
CW_NIRLIV_ERR_VISIMAGE, // 输入可见光图片数据错误
} cw_nirliveness_err_t;
/***************
* 红外活体图像数据
*/
typedef struct cw_nirliv_img
{
char* data; // 图像数据(必须预分配足够的空间)
int dataLen; // 数据长度,只有CW_IMAGE_BINARY格式需要设置
int width; // 宽, CW_IMAGE_BINARY格式可不设置,其他格式必须设置
int height; // 高, CW_IMAGE_BINARY格式可不设置,其他格式必须设置
cw_img_form_t format; // 图像格式,详情见cw_img_form_t
} cw_nirliv_img_t;
/***************
* 红外活体人脸相关信息
*/
typedef struct cw_nirliv_face_param
{
float fSkinScore; // 输入肤色置信分
float fKeyScore; // 输入关键点置信分
cw_point_t *pKeypoints; // 输入关键点信息
} cw_nirliv_face_param_t;
/***************
* 红外活体检测输入的人脸图片数据
*/
typedef struct cw_nirliv_detinfo
{
int nLandmarks; // 关键点个数
cw_nirliv_img_t *pNirImg; // NIR红外图片信息
cw_nirliv_img_t *pVisImg; // VIS可见光图片信息
cw_nirliv_face_param_t *pNirInfo; // NIR红外人脸信息
cw_nirliv_face_param_t *pVisInfo; // VIS可见光人脸信息
} cw_nirliv_detinfo_t;
/***************
* 红外活体检测结果
*/
typedef struct cw_nirliv_res
{
cw_nirliv_det_rst_t livRst; // 输出红外活体检测结果返回值
float score; // 输出红外活体检测得分,非活体的时候为0
} cw_nirliv_res_t;
#endif