/// <summary> /// 人脸检测 /// </summary> /// <param name="width">图片宽度,必须为4的倍数</param> /// <param name="height">YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制</param> /// <param name="format">颜色空间格式</param> /// <param name="pImageData">图片数据</param> /// <param name="deepCopy">返回结果是否进行深拷贝,默认为true,若设置为false则每次调用会覆盖上一次的结果(内存覆盖)</param> /// <returns></returns> public MultiFaceModel FaceDetection(int width, int height, int format, IntPtr pImageData, bool deepCopy = true) { ResultCode resultCode = (ResultCode)ArcFaceApi.ASFDetectFaces(EngineHandle, width, height, format, pImageData, out AsfMultiFaceInfo multiFaceInfo); if (resultCode != ResultCode.成功) { throw new ResultCodeException(resultCode); } if (!deepCopy) { return(new MultiFaceModel(multiFaceInfo)); } int faceRectSize = Marshal.SizeOf <Mrect>() * multiFaceInfo.faceNum; int faceOrientSize = Marshal.SizeOf <int>() * multiFaceInfo.faceNum;; AsfMultiFaceInfo multiFaceInfoCopy = new AsfMultiFaceInfo() { faceRect = Marshal.AllocCoTaskMem(faceRectSize), faceOrient = Marshal.AllocCoTaskMem(faceOrientSize), faceNum = multiFaceInfo.faceNum }; CopyMemory(multiFaceInfoCopy.faceRect, multiFaceInfo.faceRect, faceRectSize); CopyMemory(multiFaceInfoCopy.faceOrient, multiFaceInfo.faceOrient, faceOrientSize); return(new MultiFaceModel(multiFaceInfoCopy)); }
/// <summary> /// 人脸信息检测(年龄/性别/人脸3D角度)最多支持4张人脸信息检测,超过部分返回未知 /// </summary> /// <param name="width">图片宽度为4的倍数且大于0</param> /// <param name="height">YUYV/I420/NV21/NV12格式的图片高度为2的倍数,BGR24格式的图片高度不限制</param> /// <param name="format">颜色空间格式</param> /// <param name="pImageData">图片数据</param> /// <param name="detectedFaces">检测到的人脸信息</param> /// <param name="combinedMask">初始化中参数combinedMask与ASF_AGE| ASF_GENDER| ASF_FACE3DANGLE的交集的子集</param> public void FaceProcess(int width, int height, int format, IntPtr pImageData, MultiFaceModel detectedFaces, uint combinedMask = ArcFaceFunction.AGE | ArcFaceFunction.FACE_3DANGLE | ArcFaceFunction.GENDER) { //取交集 combinedMask = combinedMask & this.CombinedMask; AsfMultiFaceInfo multiFaceInfo = detectedFaces.MultiFaceInfo; ResultCode result = (ResultCode)ArcFaceApi.ASFProcess(EngineHandle, width, height, format, pImageData, ref multiFaceInfo, combinedMask); if (result != ResultCode.成功) { throw new ResultCodeException(result); } }
public MultiFaceModel(AsfMultiFaceInfo multiFaceInfo) { this.MultiFaceInfo = multiFaceInfo; this.FaceInfoList = new List <AsfSingleFaceInfo>(); Mrect[] faceRects = multiFaceInfo.faceRect.ToStructArray <Mrect>(multiFaceInfo.faceNum); int[] faceOrient = multiFaceInfo.faceOrient.ToStructArray <int>(multiFaceInfo.faceNum); for (int i = 0; i < multiFaceInfo.faceNum; i++) { AsfSingleFaceInfo faceInfo = new AsfSingleFaceInfo { faceOrient = faceOrient[i], faceRect = faceRects[i] }; FaceInfoList.Add(faceInfo); } }