houxiao
2017-04-06 63d598d4443f906b34bedaf49e870b7a2be1a5c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
 
#ifndef INCLUDE_CVFACE_API_CV_FACE_EXTERNAL_H_
#define INCLUDE_CVFACE_API_CV_FACE_EXTERNAL_H_
 
 
#include "cv_common.h"
/// @defgroup cvface_common cvface common
/// @brief Common definitions for cvface
/// @{
 
/// @brief 人脸信息结构体
typedef struct cv_face_t {
    cv_rect_t rect;                        ///< 代表面部的矩形区域
    float score;                        ///< 置信度,用于筛除负例,与人脸照片质量无关,值越高表示置信度越高。
    int points_count;                    ///< 人脸关键点数组的长度,如果没有计算关键点,则为0
    float yaw;                            ///< 水平转角,真实度量的左负右正
    float pitch;                            ///< 俯仰角,真实度量的上负下正
    float roll;                            ///< 旋转角,真实度量的左负右正
    float eye_dist;                        ///< 两眼间距
    int ID;                                ///< faceID,用于表示在实时人脸跟踪中的相同人脸在不同帧多次出现,在人脸检测的结果中无实际意义
    cv_pointf_t points_array[256];        ///< 人脸关键点的数组支持21点,106点,以及为将来预留的空间
} cv_face_t;
 
/// 人脸检测、跟踪配置选项
#define CV_FACE_DEFAULT_CONFIG        0x00000000        ///< 默认选项,不设置任何开关
#define CV_FACE_RESIZE_IMG_320W        0x00000002        ///< resize图像为长边320的图像
#define CV_FACE_RESIZE_IMG_640W        0x00000004        ///< resize图像为长边640的图像
#define CV_FACE_RESIZE_IMG_1280W    0x00000008        ///< resize图像为长边1280的图像
 
/// detect config flags, 0x----00-- ~ 0x----FF--
#define CV_DETECT_ENABLE_ALIGN_21                0x00000100  ///< 开启面部关键21点检测选项
#define CV_DETECT_ENABLE_ALIGN_106                0x00000200  ///< 开启面部关键106点检测选项
 
/// 该版本sdk未开启此功能(如:面部关键21点检测版本传入了面部关键106点检测参数)
#define CV_E_UNSURPPORTED    (-1000)
/// 指定位置未找到license.lic文件
#define CV_E_MISSLICENSE    (-1001)
/// cv_face_init_license_config 函数被重复调用
#define  CV_E_MULTI_CALLS    (-1002)
 
/// @brief  人脸朝向
typedef enum {
    CV_FACE_UP        = 0x0000001,        ///< 人脸向上,即人脸朝向正常
    CV_FACE_LEFT    = 0x0000002,        ///< 人脸向左,即人脸被逆时针旋转了90度
    CV_FACE_DOWN    = 0x0000004,        ///< 人脸向下,即人脸被逆时针旋转了180度
    CV_FACE_RIGHT    = 0x0000008,        ///< 人脸向右,即人脸被逆时针旋转了270度
    CV_FACE_UNKNOWN = 0xf                ///< 人脸朝向未知,API自动判断人脸朝向,耗时增加。face_track不支持此参数,等同于CV_FACE_UP
} cv_face_orientation;
 
/// @brief  输出当前SDK所支持的算法及内置模型信息
CV_SDK_API
void
cv_face_algorithm_info();
 
/// @brief  手动加载license文件,除IOS,Android平台外,都可以不主动调用此函数(但需要将license文件放在可执行程序同一目录,名称命名为license.lic),该函数只能被成功调用一次
/// param[in]    szLicense 授权文件中的字符串,license文件的全部内容
CV_SDK_API
cv_result_t
cv_face_init_license_config(const char* szLicense);
 
 
/// @defgroup cvface_detect cvface detect
/// @brief face position detection interfaces
///
/// This set of interfaces processing face position & 21 or 106 points landmark detection routines
///
/// @{
 
/// @brief 创建人脸检测句柄
/// @param[out] handle函数成功时被设置为有效的detector handle
/// @param[in] model_path 模型文件的绝对路径或相对路径,若不指定模型可为NULL
/// @param[in] config 配置选项,默认配置为CV_DETECT_ENABLE_ALIGN_21(21关键点检测)。支持106关键点检测CV_DETECT_ENABLE_ALIGN_106和自动缩放CV_FACE_RESIZE_IMG_XXXX。
/// @return 返回CV_OK 失败返回错误码
CV_SDK_API
cv_result_t
cv_face_create_detector(
    cv_handle_t *handle,
    const char *model_path,
    unsigned int config
);
 
/// @brief 获取当前人脸检测的默认阀值
/// @param[in]    handle 人脸检测句柄
/// @param[out]    threshold 人脸检测的默认阀值
CV_SDK_API
cv_result_t cv_face_detect_get_threshold(
    cv_handle_t detector_handle,
    float *threshold
    );
 
/// @brief 设置当前人脸检测的阀值,需要在调用cv_face_detect之前调用此函数,阈值需大于0,设置后调用cv_face_detect_get_threshold为新设置后的值)
/// @param[in] handle 人脸检测句柄
/// @param[in] threshold 人脸检测新阀值
CV_SDK_API
cv_result_t cv_face_detect_set_threshold(
    cv_handle_t detector_handle,
    float threshold
    );
 
/// @brief 销毁已初始化的人脸检测句柄
/// @param[in] detector_handle 已初始化的人脸检测句柄
CV_SDK_API
void cv_face_destroy_detector(
    cv_handle_t detector_handle
);
 
/// @brief 人脸检测
/// @param[in]    detector_handle 已初始化的人脸检测句柄
/// @param[in]    image 用于检测的图像数据
/// @param[in]    piexl_format 用于检测的图像数据的像素格式
/// @param[in]    image_width 用于检测的图像的宽度(以像素为单位)
/// @param[in]    image_height 用于检测的图像的高度(以像素为单位)
/// @param[in]    image_stride 用于检测的图像中每一行的跨度(以像素为单位) 图像跨度=图像宽度*图像维度
/// @param[in]    orientation 图片中人脸的方向
/// @param[out]    p_faces_array 检测到的人脸信息数组,api负责分配内存,需要调用cv_face_release_detector_result函数释放
/// @param[out]    p_faces_count 检测到的人脸数量
/// @return 成功返回CV_OK,否则返回错误类型
CV_SDK_API
cv_result_t
cv_face_detect(
    cv_handle_t detector_handle,
    const unsigned char *image,
    cv_pixel_format pixel_format,
    int image_width,
    int image_height,
    int image_stride,
    cv_face_orientation orientation,
    cv_face_t **p_faces_array,
    int *p_faces_count
);
 
/// @brief 释放人脸检测返回结果时分配的空间
/// @param[in] faces_array 检测到的人脸信息数组
/// @param[in] faces_count 检测到的人脸数量
CV_SDK_API
void
cv_face_release_detector_result(
    cv_face_t *faces_array,
    int faces_count
);
 
 
/// @}
 
 
/// @defgroup cvface_track cvface track
/// @brief face tracking interfaces
///
/// This set of interfaces processing face tracking routines
///
/// @{
 
#define CV_FACE_TRACKING_TWO_THREAD        0x00110000    ///< 开启双线程人脸跟踪,建议低配置环境开启此选项。
 
/// @brief 创建实时人脸跟踪句柄。可以调用cv_face_track_set_detect_face_cnt_limit设置检测的最大人脸数目,默认为不限制人脸检测数量。
/// @param[out]    handle函数成功时被设置为有效的tracker handle
/// @param[in]    model_path 模型文件的绝对路径或相对路径,若不指定模型可为NULL
/// @param[in]    config 默认配置为CV_DETECT_ENABLE_ALIGN_21(21关键点检测)。支持106关键点检测CV_DETECT_ENABLE_ALIGN_106、自动缩放CV_FACE_RESIZE_IMG_XXXX和双线程跟踪CV_FACE_TRACKING_TWO_THREAD。
/// @return 返回CV_OK 失败返回错误码
CV_SDK_API
cv_result_t
cv_face_create_tracker(
    cv_handle_t *handle,
    const char *model_path,
    unsigned int config
);
 
/// @brief 销毁已初始化的实时人脸跟踪句柄
/// @param[in] tracker_handle 已初始化的实时人脸跟踪句柄
CV_SDK_API
void
cv_face_destroy_tracker(
    cv_handle_t tracker_handle
);
 
/// @brief 对连续视频帧进行实时快速人脸跟踪
/// @param[in]    tracker_handle 已初始化的实时人脸跟踪句柄
/// @param[in]    image 用于检测的图像数据
/// @param[in]    piexl_format 用于检测的图像数据的像素格式
/// @param[in]    image_width 用于检测的图像的宽度(以像素为单位)
/// @param[in]    image_height 用于检测的图像的高度(以像素为单位)
/// @param[in]    image_stride 用于检测的图像中每一行的跨度(以像素为单位),图像跨度=图像宽度*图像维度
/// @param[in]    orientation 视频中人脸的方向
/// @param[out]    p_faces_array 检测到的人脸信息数组,api负责分配内存,需要调用cv_facesdk_release_tracker_result函数释放
/// @param[out]    p_faces_count 检测到的人脸数量
/// @return 成功返回CV_OK,否则返回错误类型
CV_SDK_API
cv_result_t
cv_face_track(
    cv_handle_t tracker_handle,
    const unsigned char *image,
    cv_pixel_format pixel_format,
    int image_width,
    int image_height,
    int image_stride,
    cv_face_orientation orientation,
    cv_face_t **p_faces_array,
    int *p_faces_count
);
 
/// @brief 重置人脸跟踪检测器
/// @param[in] tracker_handle 已初始化的实时人脸跟踪句柄
CV_SDK_API
void
cv_face_reset_tracker(
    cv_handle_t tracker_handle
);
 
/// @brief 释放实时人脸跟踪返回结果时分配的空间
/// @param[in] faces_array 检测到的人脸信息数组
/// @param[in] faces_count 检测到的人脸数量
CV_SDK_API
void
cv_face_release_tracker_result(
    cv_face_t *faces_array,
    int faces_count
);
 
/// @brief 设置检测到的最大人脸数目N,持续track已检测到的N个人脸直到人脸数小于N再继续做detect,如果未调用则不对检测人脸数量做限制
/// @param[in]    tracker_handle 已初始化的实时人脸跟踪句柄
/// @param[in]    detect_face_cnt_limit 最大人脸数目N,-1表示不设上限
/// @param[out]    val 如果为非空指针,则返回采用的新的值,注意,由于内部的限制, 实际采用的值并不一定等于detect_face_cnt_limit
/// @return 成功返回CV_OK,否则返回错误类型 (实际设置检测到的最大目标数目N可能小于detect_face_cnt_limit)
CV_SDK_API
cv_result_t
cv_face_track_set_detect_face_cnt_limit(
    cv_handle_t tracker_handle,
    int detect_face_cnt_limit,
    int* val
);
 
/// @}
 
 
#endif  // INCLUDE_CVFACE_API_CV_FACE_H_