/// <summary> /// 初始化引擎 /// </summary> private void InitEngines() { //读取配置文件 AppSettingsReader reader = new AppSettingsReader(); string appId = (string)reader.GetValue("APP_ID", typeof(string)); string sdkKey64 = (string)reader.GetValue("SDKKEY64", typeof(string)); string sdkKey32 = (string)reader.GetValue("SDKKEY32", typeof(string)); var is64CPU = Environment.Is64BitProcess; if (is64CPU) { if (string.IsNullOrWhiteSpace(appId) || string.IsNullOrWhiteSpace(sdkKey64)) { MessageBox.Show("请在App.config配置文件中先配置APP_ID和SDKKEY64!"); return; } } else { if (string.IsNullOrWhiteSpace(appId) || string.IsNullOrWhiteSpace(sdkKey32)) { MessageBox.Show("请在App.config配置文件中先配置APP_ID和SDKKEY32!"); return; } } //激活引擎 如出现错误,1.请先确认从官网下载的sdk库已放到对应的bin中,2.当前选择的CPU为x86或者x64 int retCode = 0; try { retCode = ASIDCardFunctions.ArcSoft_FIC_Activate(appId, is64CPU ? sdkKey64 : sdkKey32); } catch (Exception ex) { if (ex.Message.IndexOf("无法加载 DLL") > -1) { MessageBox.Show("请将sdk相关DLL放入bin对应的x86或x64下的文件夹中!"); } else { MessageBox.Show("激活引擎失败!"); } return; } Console.WriteLine("Activate Result:" + retCode); //初始化引擎 retCode = ASIDCardFunctions.ArcSoft_FIC_InitialEngine(ref pEngine); Console.WriteLine("InitEngine Result:" + retCode); if (retCode != 0) { MessageBox.Show(string.Format("引擎初始化失败!错误码为:{0}\n", retCode)); return; } initVideo(); readIDCard(); }
private void FaceCompareForm_FormClosing(object sender, FormClosingEventArgs e) { int retCode = ASIDCardFunctions.ArcSoft_FIC_UninitialEngine(pEngine); pictureBox1.Image.Dispose(); videoSourcePlayer1.SignalToStop(); videoSourcePlayer1.WaitForStop(); videoSourcePlayer1.VideoSource = null; }
private void CompareTest(string sfzImg, string paiZhaoImg) { Bitmap Bitmap = new Bitmap(paiZhaoImg); int res = IDCardUtil.IdCardDataFeatureExtraction(pEngine, Image.FromFile(sfzImg)); if (res == 0) { AFIC_FSDK_FACERES faceInfo = new AFIC_FSDK_FACERES(); int result2 = IDCardUtil.FaceDataFeatureExtraction(pEngine, false, Bitmap, ref faceInfo); if (result2 == 0 && faceInfo.nFace > 0) { float pSimilarScore = 0; int pResult = 0; float threshold = 0.82f; int result3 = IDCardUtil.FaceIdCardCompare(ref pSimilarScore, ref pResult, pEngine, threshold); if (result3 == 0) { Console.WriteLine("相似度:" + pSimilarScore); if (pSimilarScore >= GetFaceThreshold()) { timer.Close(); MessageBox.Show("活体,相似度" + pSimilarScore + ",人脸验证通过!"); App.Current.Dispatcher.Invoke((Action)(() => { this.Close(); CameraHelper.CloseDevice(); Console.WriteLine("关闭摄像头"); int retCode = ASIDCardFunctions.ArcSoft_FIC_UninitialEngine(pEngine); Console.WriteLine("UninitEngine Result:" + retCode); Window_Closed(); })); } else { MessageBox.Show("相似度" + pSimilarScore + ",人脸验证未通过!"); timer.Start(); } } else { MessageBox.Show("识别失败,请重试!"); timer.Start(); } } else { MessageBox.Show("未检测到人脸,请重试!"); timer.Start(); } } else { MessageBox.Show("1" + Convert.ToString(res)); } }
/// <summary> /// 窗体关闭事件 /// </summary> private void ArcfaceIDCard_FormClosed(object sender, FormClosedEventArgs e) { //销毁引擎 int retCode = ASIDCardFunctions.ArcSoft_FIC_UninitialEngine(pEngine); //ReadIDCardFunctuions.CVR_CloseComm(); videoSource.SignalToStop(); //关闭定时器 timerRead.Stop(); Console.WriteLine("UninitEngine Result:" + retCode); }
public HttpResponseMessage PostImageVerficationReturn(JObject JsonRequest) { int status = 1; string picPath = JsonRequest["picPath"].ToString(); InitEngines(); status = ReadImage(picPath); String returnValue = JsonConvert.SerializeObject(new { status = status.ToString() }); int retCode = ASIDCardFunctions.ArcSoft_FIC_UninitialEngine(pEngine); return(ResultToJson.toJson(returnValue)); }
public static ASF_MultiFaceInfo DetectFace(IntPtr pEngine, ImageInfo imageInfo) { ASF_MultiFaceInfo multiFaceInfo = new ASF_MultiFaceInfo(); IntPtr pMultiFaceInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_MultiFaceInfo>()); int retCode = ASIDCardFunctions.ASFDetectFaces(pEngine, imageInfo.width, imageInfo.height, imageInfo.format, imageInfo.imgData, pMultiFaceInfo); if (retCode != 0) { MemoryUtil.Free(pMultiFaceInfo); return(multiFaceInfo); } multiFaceInfo = MemoryUtil.PtrToStructure <ASF_MultiFaceInfo>(pMultiFaceInfo); MemoryUtil.Free(pMultiFaceInfo); return(multiFaceInfo); }
public static ASF_LivenessInfo LivenessInfo_RGB(IntPtr pEngine, ImageInfo imageInfo, ASF_MultiFaceInfo multiFaceInfo, out int retCode) { IntPtr pMultiFaceInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_MultiFaceInfo>()); MemoryUtil.StructureToPtr(multiFaceInfo, pMultiFaceInfo); if (multiFaceInfo.faceNum == 0) { retCode = -1; //释放内存 MemoryUtil.Free(pMultiFaceInfo); return(new ASF_LivenessInfo()); } try { //人脸信息处理 retCode = ASIDCardFunctions.ASFProcess(pEngine, imageInfo.width, imageInfo.height, imageInfo.format, imageInfo.imgData, pMultiFaceInfo, FaceEngineMask.ASF_LIVENESS); if (retCode == 0) { //获取活体检测结果 IntPtr pLivenessInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_LivenessInfo>()); retCode = ASIDCardFunctions.ASFGetLivenessScore(pEngine, pLivenessInfo); Console.WriteLine("Get Liveness Result:" + retCode); ASF_LivenessInfo livenessInfo = MemoryUtil.PtrToStructure <ASF_LivenessInfo>(pLivenessInfo); //释放内存 MemoryUtil.Free(pMultiFaceInfo); MemoryUtil.Free(pLivenessInfo); return(livenessInfo); } else { //释放内存 MemoryUtil.Free(pMultiFaceInfo); return(new ASF_LivenessInfo()); } } catch { retCode = -1; //释放内存 MemoryUtil.Free(pMultiFaceInfo); return(new ASF_LivenessInfo()); } }
/// <summary> /// 证件照特征提取 /// </summary> /// <param name="hFICEngine">FIC 引擎Handle</param> /// <param name="isVideo">人脸数据类型 1-视频 0-静态图片</param> /// <param name="bitmap">人脸图像原始数据</param> /// <returns>人脸特征提取结果</returns> public static int IdCardDataFeatureExtraction(IntPtr hFICEngine, Image image) { lock (locks) { if (image.Width % 4 != 0) { image = ImageUtil.ScaleImage(image, image.Width - (image.Width % 4), image.Height); } //Bitmap bitmap = new Bitmap(image); ASVLOFFSCREEN offInput = ImageUtil.ReadBmp(image); IntPtr offInputPtr = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASVLOFFSCREEN>()); MemoryUtil.StructureToPtr(offInput, offInputPtr); IntPtr faceResPtr = MemoryUtil.Malloc(MemoryUtil.SizeOf <AFIC_FSDK_FACERES>()); int result = ASIDCardFunctions.ArcSoft_FIC_IdCardDataFeatureExtraction(hFICEngine, offInputPtr); MemoryUtil.Free(offInput.ppu8Plane[0]); MemoryUtil.Free(offInputPtr); MemoryUtil.Free(faceResPtr); return(result); } }
/// <summary> /// 人脸特征提取 /// </summary> /// <param name="hFICEngine">FIC 引擎Handle</param> /// <param name="isVideo">人脸数据类型 1-视频 0-静态图片</param> /// <param name="bitmap">人脸图像原始数据</param> /// <returns>人脸检测结果</returns> public static int FaceDataFeatureExtraction(IntPtr hFICEngine, bool isVideo, Bitmap bitmap, ref AFIC_FSDK_FACERES faceRes) { lock (locks) { int result = -1; if (bitmap != null) { ASVLOFFSCREEN offInput = ImageUtil.ReadBmp(bitmap); IntPtr offInputPtr = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASVLOFFSCREEN>()); MemoryUtil.StructureToPtr(offInput, offInputPtr); IntPtr faceResPtr = MemoryUtil.Malloc(MemoryUtil.SizeOf <AFIC_FSDK_FACERES>()); result = ASIDCardFunctions.ArcSoft_FIC_FaceDataFeatureExtraction(hFICEngine, isVideo, offInputPtr, faceResPtr); faceRes = MemoryUtil.PtrToStructure <AFIC_FSDK_FACERES>(faceResPtr); MemoryUtil.Free(offInput.ppu8Plane[0]); MemoryUtil.Free(offInputPtr); MemoryUtil.Free(faceResPtr); } return(result); } }
private void Window_Closed() { try { //销毁引擎 int retCode = ASIDCardFunctions.ASFUninitEngine(pImageEngine); Console.WriteLine("UninitEngine pImageEngine Result:" + retCode); //销毁引擎 retCode = ASIDCardFunctions.ASFUninitEngine(pVideoEngine); Console.WriteLine("UninitEngine pVideoEngine Result:" + retCode); //销毁引擎 retCode = ASIDCardFunctions.ASFUninitEngine(pVideoRGBImageEngine); Console.WriteLine("UninitEngine pVideoImageEngine Result:" + retCode); //销毁引擎 retCode = ASIDCardFunctions.ASFUninitEngine(pVideoIRImageEngine); Console.WriteLine("UninitEngine pVideoIRImageEngine Result:" + retCode); } catch (Exception ex) { Console.WriteLine("UninitEngine pImageEngine Error:" + ex.Message); } }
/// <summary> /// 人证比对 /// </summary> /// <param name="pSimilarScore">FIC 引擎Handle</param> /// <param name="pResult">人脸数据类型 1-视频 0-静态图片</param> /// <param name="hFICEngine">引擎Handle</param> /// <param name="threshold">引擎Handle</param> /// <returns>人脸比对结果</returns> public static int FaceIdCardCompare(ref float pSimilarScore, ref int pResult, IntPtr hFICEngine, float threshold = 0.82f) { return(ASIDCardFunctions.ArcSoft_FIC_FaceIdCardCompare(hFICEngine, threshold, ref pSimilarScore, ref pResult)); }
/// <summary> /// 提取单人脸特征 /// </summary> /// <param name="pEngine">人脸识别引擎</param> /// <param name="image">图片</param> /// <param name="singleFaceInfo">单人脸信息</param> /// <returns>单人脸特征</returns> public static IntPtr ExtractFeature(IntPtr pEngine, Image image, ASF_SingleFaceInfo2 singleFaceInfo) { ImageInfo imageInfo = ReadBMP(image); if (imageInfo == null) { ASF_FaceFeature emptyFeature = new ASF_FaceFeature(); IntPtr pEmptyFeature = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_FaceFeature>()); MemoryUtil.StructureToPtr(emptyFeature, pEmptyFeature); return(pEmptyFeature); } IntPtr pSingleFaceInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_SingleFaceInfo2>()); MemoryUtil.StructureToPtr(singleFaceInfo, pSingleFaceInfo); IntPtr pFaceFeature = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_FaceFeature>()); int retCode = -1; try { retCode = ASIDCardFunctions.ASFFaceFeatureExtract(pEngine, imageInfo.width, imageInfo.height, imageInfo.format, imageInfo.imgData, pSingleFaceInfo, pFaceFeature); } catch (Exception e) { Console.WriteLine(e.Message); } Console.WriteLine("FR Extract Feature result:" + retCode); if (retCode != 0) { //释放指针 MemoryUtil.Free(pSingleFaceInfo); MemoryUtil.Free(pFaceFeature); MemoryUtil.Free(imageInfo.imgData); ASF_FaceFeature emptyFeature = new ASF_FaceFeature(); IntPtr pEmptyFeature = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_FaceFeature>()); MemoryUtil.StructureToPtr(emptyFeature, pEmptyFeature); return(pEmptyFeature); } //人脸特征feature过滤 ASF_FaceFeature faceFeature = MemoryUtil.PtrToStructure <ASF_FaceFeature>(pFaceFeature); byte[] feature = new byte[faceFeature.featureSize]; MemoryUtil.Copy(faceFeature.feature, feature, 0, faceFeature.featureSize); ASF_FaceFeature localFeature = new ASF_FaceFeature(); localFeature.feature = MemoryUtil.Malloc(feature.Length); MemoryUtil.Copy(feature, 0, localFeature.feature, feature.Length); localFeature.featureSize = feature.Length; IntPtr pLocalFeature = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_FaceFeature>()); MemoryUtil.StructureToPtr(localFeature, pLocalFeature); //释放指针 MemoryUtil.Free(pSingleFaceInfo); MemoryUtil.Free(pFaceFeature); MemoryUtil.Free(imageInfo.imgData); return(pLocalFeature); }
private void InitEngines2() { //读取配置文件 AppSettingsReader reader = new AppSettingsReader(); string appId = (string)reader.GetValue("APP_ID", typeof(string)); string sdkKey64 = (string)reader.GetValue("2SDKKEY64", typeof(string)); string sdkKey32 = (string)reader.GetValue("2SDKKEY32", typeof(string)); rgbCameraIndex = (int)reader.GetValue("RGB_CAMERA_INDEX", typeof(int)); //判断CPU位数 var is64CPU = Environment.Is64BitProcess; int retCode = 0; try { retCode = ASIDCardFunctions.ASFActivation(appId, is64CPU ? sdkKey64 : sdkKey32); } catch (Exception ex) { if (ex.Message.Contains("无法加载 DLL")) { MessageBox.Show("请将sdk相关DLL放入bin对应的x86或x64下的文件夹中!"); } else { MessageBox.Show("激活引擎失败!"); } return; } Console.WriteLine("Activate Result:" + retCode); //初始化引擎 uint detectMode = DetectionMode.ASF_DETECT_MODE_IMAGE; //Video模式下检测脸部的角度优先值 int videoDetectFaceOrientPriority = ASF_OrientPriority.ASF_OP_0_HIGHER_EXT; //Image模式下检测脸部的角度优先值 int imageDetectFaceOrientPriority = ASF_OrientPriority.ASF_OP_0_ONLY; //人脸在图片中所占比例,如果需要调整检测人脸尺寸请修改此值,有效数值为2-32 int detectFaceScaleVal = 16; //最大需要检测的人脸个数 int detectFaceMaxNum = 5; //引擎初始化时需要初始化的检测功能组合 int combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_AGE | FaceEngineMask.ASF_GENDER | FaceEngineMask.ASF_FACE3DANGLE; //初始化引擎,正常值为0,其他返回值请参考http://ai.arcsoft.com.cn/bbs/forum.php?mod=viewthread&tid=19&_dsign=dbad527e retCode = ASIDCardFunctions.ASFInitEngine(detectMode, imageDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pImageEngine); Console.WriteLine("InitEngine Result:" + retCode); MessageBox.Show(((retCode == 0) ? "引擎初始化成功!\n" : string.Format("引擎初始化失败!错误码为:{0}\n", retCode))); if (retCode != 0) { //禁用相关功能按钮 //ControlsEnable(false, chooseMultiImgBtn, matchBtn, btnClearFaceList, chooseImgBtn); } //初始化视频模式下人脸检测引擎 uint detectModeVideo = DetectionMode.ASF_DETECT_MODE_VIDEO; int combinedMaskVideo = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION; retCode = ASIDCardFunctions.ASFInitEngine(detectModeVideo, videoDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMaskVideo, ref pVideoEngine); //RGB视频专用FR引擎 detectFaceMaxNum = 1; combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_LIVENESS; retCode = ASIDCardFunctions.ASFInitEngine(detectMode, imageDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pVideoRGBImageEngine); //IR视频专用FR引擎 combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_IR_LIVENESS; retCode = ASIDCardFunctions.ASFInitEngine(detectMode, imageDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pVideoIRImageEngine); Console.WriteLine("InitVideoEngine Result:" + retCode); }