1
z8018
2025-06-06 ee5e3a086a5dc145e7f5df3de32e0e072c183949
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
using System.Runtime.InteropServices;
 
namespace WIDESEAWCS_Common.Face
{
    public class TH_Faces // 人脸检测及识别SDK接口,可参见 IdFaceSdk.h(内含所有接口的功能、参数、返回值的具体描述)
    {
        #region 结构体定义
 
        public struct RECT
        {
            public Int32 left;
            public Int32 top;
            public Int32 right;
            public Int32 bottom;
        };
 
        public struct POINT
        {
            public Int32 x;
            public Int32 y;
        };
 
        // 人脸检测返回的人脸坐标参数
        public struct FACE_DETECT_RESULT
        {
            public RECT rcFace;//coordinate of face
            public POINT ptLeftEye;//coordinate of left eye
            public POINT ptRightEye;//coordinate of right eye
            public POINT ptMouth;//coordinate of mouth
            public POINT ptNose;//coordinate of nose                                
            public Int32 nAngleYaw, nAnglePitch, nAngleRoll;//value of face angle
            public Int32 nQuality;//quality of face(from 0 to 100)
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
            public Byte[] FaceData;
        };
 
        // 人脸质量检测返回的人脸质量参数
        public struct FACE_QUALITY_LEVEL
        {
            public Int32 nHalf; // 人脸完整性: 0-正常,1-人脸不太完整,2-人脸非常不完整
            public Int32 nSmall; // 人脸大小:0-正常,1-人脸较小,2-人脸太小
            public Int32 nPosture; // 姿态:0-正常,1-偏头较多,2-偏头太多
            public Int32 nMask; // 脸部遮挡: 0-正常,1-人脸有遮挡,2-人脸遮挡太多
            public Int32 nFaceMask; // 口罩:0-正常,1-有戴口罩,2-确认戴口罩
            public Int32 nHat; // 帽子:0-正常,1-有戴帽,2-帽子遮挡脸部
            public Int32 nGlasses; // 眼镜: 0-正常,1-有戴眼镜,2-确认戴眼镜
            public Int32 nGape; // 张嘴: 0-正常,1-张嘴,2-张大嘴
            public Int32 nBlur; // 模糊度:0-正常,1-较模糊,2-太模糊
            public Int32 nBright; // 脸部曝光度:0-正常,1-太暗,2-过爆
            public Int32 nLight; // 光源方向: 0-正常,1-侧光,2-顶光, 3-逆光       
        };
 
        #endregion
 
        #region 初始化及基本功能
 
        // 返回SDK版本号(随时可调用)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkVer", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkVer();
 
        // 返回设备运行码
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkGetRunCode", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkGetRunCode([Out] IntPtr pStrRunCode);
 
        // SDK初始化,成功返回0(后面除辅助接口外的所有功能接口都必须是SDK初始化成功后才有用)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkInit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkInit();
 
        // SDK反初始化(后面除辅助接口外的所有功能接口在调用反初始化后均不可用,除非再次初始化)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkUninit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern void IdFaceSdkUninit();
 
        // 设置检测大小(针对高分辨率且人脸占比较小时设置检测大小,通常不必调用)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkSetDetectSize", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern void IdFaceSdkSetDetectSize(Int32 nDetectSize);
 
        // 返回特征码大小
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkFeatureSize", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkFeatureSize();
 
        // 返回当前的授权是否支持活体检测
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkGetLiveFaceStatus", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkGetLiveFaceStatus();
 
        #endregion
 
        #region 单人脸检测
 
        // 检测最大人脸
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkDetectFace", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkDetectFace(IntPtr pImage, Int32 nWidth, Int32 nHeight, ref FACE_DETECT_RESULT Face);
 
        #endregion
 
        #region 多人脸检测并提取特征
 
        // 检测多人脸同时提取各人脸的特征(nMaxFace 表示最多要检测的人脸个数,Faces 必须按最大人脸个数分配人脸坐标空间, pFeatures 必须按最大人脸个数分配特征码空间,pFeatures 参数传 0 时则只检测人脸不提特征)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkFaceFeature", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkFaceFeature(IntPtr pImage, Int32 nWidth, Int32 nHeight, Int32 nMaxFace, [Out] FACE_DETECT_RESULT[] Faces, [Out] IntPtr pFeatures);
 
        #endregion
 
        #region 人脸质量检测
 
        // 检测人脸质量(需输入人脸检测返回的人脸坐标)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkFaceQualityLevel", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkFaceQualityLevel(IntPtr pImage, Int32 nWidth, Int32 nHeight, ref FACE_DETECT_RESULT Face, ref FACE_QUALITY_LEVEL FaceQualityLevel);
 
        #endregion
 
        #region SDK特征提取
 
        // 提取人脸特征(需输入人脸检测返回的人脸坐标,pFeature需分配不小于一个人脸特征的空间)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkFeatureGet", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkFeatureGet(IntPtr pImage, Int32 nWidth, Int32 nHeight, ref FACE_DETECT_RESULT Face, [Out] IntPtr pFeature);
 
        #endregion
 
        #region 一对一比对(1:1,多用于人证核验)
 
        // 两个人脸特征比对出相似度
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkFeatureCompare", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Byte IdFaceSdkFeatureCompare(IntPtr pFeature1, IntPtr pFeature2);
 
        #endregion
 
        #region 一对多比对(1:N,多用于服务器识别)
 
        // 创建一对多人脸比对列表
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkListCreate", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr IdFaceSdkListCreate(Int32 nMaxFeatureNum);
 
        // 向人脸比对列表中增加/插入模板的人脸特征
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkListInsert", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkListInsert(IntPtr hList, [In, Out] ref Int32 nPos, IntPtr pFeatures, Int32 nFeatureNum);
 
        // 从人脸比对列表中删除部分人脸特征
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkListRemove", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkListRemove(IntPtr hList, Int32 nPos, Int32 nFeatureNum);
 
        // 清空人脸比对列表中的所有人脸特征
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkListClearAll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern void IdFaceSdkListClearAll(IntPtr hList);
 
        // 一对多人脸比对,返回参与比对的特征数,pnScores 需分配不小于模板特征数的空间,调用后将输出与每个模板特征比对的结果(特征相似度)
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkListCompare", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkListCompare(IntPtr hList, IntPtr pFeature, Int32 nPosBegin, Int32 nFeatureNum, [Out] IntPtr pnScores);
 
        // 销毁一对多特征比对列表
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkListDestroy", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern void IdFaceSdkListDestroy(IntPtr hList);
 
        #endregion
 
        #region 活体检测
 
        // 活体检测(返回1表示活体),需传入人脸检测返回的人脸坐标,pImageColor 与 pImageBW 均有效则进行双目活体检测,如 pImageBW 为 0 则进行彩色单目活体检测,pImageColor 为 0 则进行红外双目活体检测
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkLiveFaceDetect", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkLiveFaceDetect(Int32 nWidth, Int32 nHeight, IntPtr pImageColor, ref FACE_DETECT_RESULT FaceColor, IntPtr pImageBW, ref FACE_DETECT_RESULT FaceBW);
 
        // 活体检测并输出活检分数(可根据活检分数是否达到阈值判别是否为活体),需传入人脸检测返回的人脸坐标,pImageColor 与 pImageBW 均有效则进行双目活体检测,如 pImageBW 为 0 则进行彩色单目活体检测,pImageColor 为 0 则进行红外双目活体检测
        [DllImport("IdFaceSdk.dll", EntryPoint = "IdFaceSdkLiveFaceDetectEx", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 IdFaceSdkLiveFaceDetectEx(Int32 nWidth, Int32 nHeight, IntPtr pImageColor, ref FACE_DETECT_RESULT FaceColor, IntPtr pImageBW, ref FACE_DETECT_RESULT FaceBW, ref Int32 nScore);
 
        #endregion
 
        #region 辅助接口
 
        // 读图象文件到RGB24图象数据缓冲区,支持BMP、JPG、PNG图象文件,pRgbBuf 必须分配足够的缓冲区(不小于 nWidth * nHeight * 3),如不知道图象分辨率可将此参数传 0 则本次调用只返回图象分辨率,然后分配足够的缓冲区再次调用读出图象数据
        [DllImport("IdFaceSdk.dll", EntryPoint = "ReadImageFile", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 ReadImageFile(IntPtr filename, [Out] IntPtr pRgbBuf, Int32 nBufSize, ref Int32 nWidth, ref Int32 nHeight, Int32 nDepth);
 
        // 读图象文件数据到RGB图象数据缓冲区,支持BMP、JPG、PNG图象文件,pRgbBuf 必须分配足够的缓冲区(不小于 nWidth * nHeight * 3),如不知道图象分辨率可将此参数传 0 则本次调用只返回图象分辨率,然后分配足够的缓冲区再次调用读出图象数据
        [DllImport("IdFaceSdk.dll", EntryPoint = "ReadImageFileData", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 ReadImageFileData(IntPtr pFileData, Int32 nFileDataSize, [Out] IntPtr pRgbBuf, Int32 nBufSize, ref Int32 nWidth, ref Int32 nHeight, Int32 nDepth);
 
        // 旋转RGB24图象数据,nDegree为旋转角度(支持0、90、180、270),nMirror为0表示不镜象,为1表示左右镜象
        [DllImport("IdFaceSdk.dll", EntryPoint = "RotateRgb24Data", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 RotateRgb24Data(IntPtr pSrc, Int32 nWidth, Int32 nHeight, Int32 nDegree, Int32 nMirror, [Out] IntPtr pDst);
 
        // 从RGB24图象数据裁剪出小图
        // 输入参数:
        //           pSrc ---- 原图数据(RGB24格式)
        //           nSrcWidth ---- 原图宽度
        //           nSrcHeight ---- 原图高度
        //           nLeft ---- 裁剪区域左上角X坐标
        //           nTop ---- 裁剪区域左上角Y坐标
        //           nWidth ---- 裁剪区域宽度
        //           nHeight ---- 裁剪区域高度
        //           nRate ---- 裁剪图象缩小倍数(0-不缩小,1-宽高缩小至原来的1/2,2-宽高缩小至原来的1/3,...)
        // 输出参数:
        //           pDst ---- 小图数据(RGB24格式,调用前需分析足够的缓冲区)
        // 返回值:
        //        0 ---- 成功
        //       -1 ---- 参数错误
        // 备注:裁剪后的图象分辨率为:宽度 = nWidth / (nRate + 1), 高度 = nHeight / (nRate + 1)
        [DllImport("IdFaceSdk.dll", EntryPoint = "CropImage", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 CropImage(IntPtr pSrc, Int32 nSrcWidth, Int32 nSrcHeight, [Out] IntPtr pDst, int nLeft, int nTop, int nWidth, int nHeight, int nRate);
 
        // 将RGB24图象数据保存为JPEG文件
        [DllImport("IdFaceSdk.dll", EntryPoint = "SaveJpegFile", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 SaveJpegFile(IntPtr filename, IntPtr pRgbData, Int32 nWidth, Int32 nHeight, Int32 nDepth, Int32 nQuality);
 
        // 将RGB24图象数据保存为JPEG文件数据
        [DllImport("IdFaceSdk.dll", EntryPoint = "SaveJpegFileData", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern Int32 SaveJpegFileData(IntPtr pRgbData, Int32 nWidth, Int32 nHeight, Int32 nDepth, Int32 nQuality, [Out] IntPtr pFileDataBuf, Int32 nBufSize, ref Int32 nFileDataSize);
 
        #endregion
    }
}