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