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 } }