/// <summary> /// 释放引擎Handler /// </summary> /// <returns></returns> public static bool DisposeEngine() { if (hEngine != null) { try { ResultCode result = (ResultCode)ASFAPI.ASFUninitEngine(hEngine); if (result == ResultCode.成功) { return(true); } else { throw new Exception(result.ToString()); } } catch (Exception ex) { throw ex; } finally { //Marshal.FreeHGlobal(hEngine); } } return(true); }
/// <summary> /// 人脸比对 /// </summary> /// <param name="data1">第一张人脸数据</param> /// <param name="data2">第二张人脸数据</param> /// <returns></returns> public float Compare(byte[] data1, byte[] data2) { try { FaceFeature feature1 = new FaceFeature(); feature1.feature = Marshal.AllocHGlobal(data1.Length); Marshal.Copy(data1, 0, feature1.feature, data1.Length); feature1.featureSize = data1.Length; IntPtr pLocalFeature1 = Marshal.AllocHGlobal(Marshal.SizeOf(feature1)); Marshal.StructureToPtr(feature1, pLocalFeature1, false); FaceFeature feature2 = new FaceFeature(); feature2.feature = Marshal.AllocHGlobal(data2.Length); Marshal.Copy(data2, 0, feature2.feature, data2.Length); feature2.featureSize = data2.Length; IntPtr pLocalFeature2 = Marshal.AllocHGlobal(Marshal.SizeOf(feature2)); Marshal.StructureToPtr(feature2, pLocalFeature2, false); float similar = 0.0f; ASFAPI.ASFFaceFeatureCompare(hEngine, pLocalFeature1, pLocalFeature2, out similar); return(similar); } catch (Exception ex) { return(0.0f); } }
/// <summary> /// 获取年龄信息 /// </summary> /// <returns></returns> public int GetAge() { var faceinfo = DetectFaces(); if (faceinfo.faceOrient == IntPtr.Zero || faceinfo.faceRect == IntPtr.Zero) { return(0); } var processResult = ASFAPI.ASFProcess(hEngine, bitmapImage.Width, bitmapImage.Height, bitmapImage.Format, bitmapImage.ImageData, faceinfo, (int)(EngineMode.年龄识别)); if (processResult != (int)ResultCode.成功) { return(0); } AgeInfo age = new AgeInfo(); var ageResult = ASFAPI.ASFGetAge(hEngine, ref age); if (ageResult != (int)ResultCode.成功) { return(0); } int[] ageArray = new int[age.num]; Marshal.Copy(age.ageArray, ageArray, 0, ageArray.Length); return(ageArray[0]); }
/// <summary> /// 获取年龄信息 /// </summary> /// <returns></returns> public int GetAge() { var faceinfo = DetectFaces(); ASFAPI.ASFProcess(hEngine, bitmapImage.Width, bitmapImage.Height, bitmapImage.Format, bitmapImage.ImageData, faceinfo, (int)(EngineMode.年龄识别)); AgeInfo age = new AgeInfo(); ASFAPI.ASFGetAge(hEngine, ref age); int[] ageArray = new int[age.num]; Marshal.Copy(age.ageArray, ageArray, 0, ageArray.Length); return(ageArray[0]); }
/// <summary> /// 获取人脸特征 /// </summary> /// <returns></returns> public byte[] getFaceFeature(Bitmap image) { BitmapImage bitmapImage = null; var multiFaceInfo = DetectFaces(image, out bitmapImage); if (multiFaceInfo.faceNum == 0 || multiFaceInfo.faceOrient == IntPtr.Zero || multiFaceInfo.faceRect == IntPtr.Zero) { return(null); } SingleFaceInfo info = new SingleFaceInfo(); Mrect mrect = new Mrect(); int[] orientArray = new int[multiFaceInfo.faceNum]; Marshal.Copy(multiFaceInfo.faceOrient, orientArray, 0, orientArray.Length); info.faceOrient = orientArray[0]; byte[] byteArray = new byte[4 * 4]; Marshal.Copy(multiFaceInfo.faceRect, byteArray, 0, byteArray.Length); int size = Marshal.SizeOf(mrect); IntPtr buffer = Marshal.AllocHGlobal(size); try { Marshal.Copy(byteArray, 0, buffer, size); mrect = (Mrect)Marshal.PtrToStructure(buffer, typeof(Mrect)); } finally { Marshal.FreeHGlobal(buffer); } info.faceRect = mrect; FaceFeature feature = new FaceFeature(); IntPtr ptr1 = Marshal.AllocHGlobal(Marshal.SizeOf(info)); Marshal.StructureToPtr(info, ptr1, false); var result = ASFAPI.ASFFaceFeatureExtract(hEngine, bitmapImage.Width, bitmapImage.Height, bitmapImage.Format, bitmapImage.ImageData, ptr1, ref feature); Marshal.FreeHGlobal(ptr1); byte[] data = null; if (result == 0 && feature.featureSize > 0 && feature.feature != IntPtr.Zero) { data = new byte[1032]; Marshal.Copy(feature.feature, data, 0, 1032); return(data); } else { return(null); } }
/// <summary> /// 人脸比对 /// </summary> /// <param name="data1">第一张人脸数据</param> /// <param name="data2">第二张人脸数据</param> /// <returns></returns> public float Compare(byte[] data1, byte[] data2) { FaceFeature feature1 = new FaceFeature(); FaceFeature feature2 = new FaceFeature(); IntPtr ptr1 = Marshal.AllocHGlobal(data1.Length); IntPtr ptr2 = Marshal.AllocHGlobal(data2.Length); Marshal.Copy(data1, 0, ptr1, data1.Length); Marshal.Copy(data2, 0, ptr2, data2.Length); feature1.feature = ptr1; feature1.featureSize = 1032; feature2.feature = ptr2; feature2.featureSize = 1032; float similar = 0.0f; ASFAPI.ASFFaceFeatureCompare(hEngine, feature1, feature2, ref similar); return(similar); }
/// <summary> /// 获得引擎Handler /// </summary> /// <param name="mode">模式(图像/视频流)</param> /// <param name="orientPriority">检测方向的优先级</param> /// <param name="detectFaceScaleVal">数值化的最小人脸尺寸</param> /// <returns></returns> public static IntPtr GetEngineInstance(uint mode, DetectionOrientPriority orientPriority, int detectFaceScaleVal = 12) { hEngine = IntPtr.Zero; try { ResultCode result = (ResultCode)ASFAPI.ASFInitEngine(mode, (int)orientPriority, detectFaceScaleVal, 50, (int)(EngineMode.人脸检测 | EngineMode.人脸识别 | EngineMode.性别识别 | EngineMode.年龄识别 | EngineMode.角度识别), ref hEngine); if (result == ResultCode.成功) { return(hEngine); } else { throw new Exception(result.ToString()); } } catch (Exception ex) { throw ex; } }
/// <summary> /// 获取性别信息 /// </summary> /// <returns></returns> public string GetGender() { var faceinfo = DetectFaces(); ASFAPI.ASFProcess(hEngine, bitmapImage.Width, bitmapImage.Height, bitmapImage.Format, bitmapImage.ImageData, faceinfo, (int)(EngineMode.性别识别)); GenderInfo gender = new GenderInfo(); ASFAPI.ASFGetGender(hEngine, ref gender); int[] genderArray = new int[gender.num]; Marshal.Copy(gender.genderArray, genderArray, 0, genderArray.Length); switch (genderArray[0]) { case 0: return("男"); case 1: return("女"); default: return("未知"); } }
/// <summary> /// 获取性别信息 /// </summary> /// <returns></returns> public string GetGender() { var faceinfo = DetectFaces(); if (faceinfo.faceOrient == IntPtr.Zero || faceinfo.faceRect == IntPtr.Zero) { return("未知"); } var processResult = ASFAPI.ASFProcess(hEngine, bitmapImage.Width, bitmapImage.Height, bitmapImage.Format, bitmapImage.ImageData, faceinfo, (int)(EngineMode.性别识别)); if (processResult != (int)ResultCode.成功) { return("未知"); } GenderInfo gender = new GenderInfo(); var genderResult = ASFAPI.ASFGetGender(hEngine, ref gender); if (genderResult != (int)ResultCode.成功 || gender.num <= 0) { return("未知"); } int[] genderArray = new int[gender.num]; Marshal.Copy(gender.genderArray, genderArray, 0, genderArray.Length); switch (genderArray[0]) { case 0: return("男"); case 1: return("女"); default: return("未知"); } }
/// <summary> /// 释放引擎Handler /// </summary> /// <returns></returns> public static bool DisposeEngine() { if (hEngine != IntPtr.Zero) { try { ResultCode result = (ResultCode)ASFAPI.ASFUninitEngine(hEngine); if (result == ResultCode.成功) { return(true); } else { throw new Exception(result.ToString()); } } catch (Exception ex) { throw ex; } } return(true); }
/// <summary> /// 获取人脸检测结果 /// </summary> /// <param name="image"></param> /// <param name="bitmapImage"></param> /// <returns></returns> public MultiFaceInfo DetectFaces(Bitmap image, out BitmapImage bitmapImage) { bitmapImage = new BitmapImage(image); bitmapImage.ParseImage(); MultiFaceInfo faceInfo = new MultiFaceInfo(); try { ResultCode result = (ResultCode)ASFAPI.ASFDetectFaces(hEngine, bitmapImage.Width, bitmapImage.Height, bitmapImage.Format, bitmapImage.ImageData, ref faceInfo); if (result == ResultCode.成功) { return(faceInfo); } else { throw new Exception(result.ToString()); } } catch (Exception ex) { throw ex; } }
/// <summary> /// 激活引擎 /// </summary> /// <param name="appId">appid</param> /// <param name="appKey">appkey</param> /// <returns>激活结果</returns> public static ResultCode ActivateEngine(string appId, string appKey) { int result = ASFAPI.ASFActivation(appId, appKey); return((ResultCode)result); }