Ejemplo n.º 1
0
        /// <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));
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
0
 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);
     }
 }