代码编织梦想

        人脸识别技术的发展异常迅速,从二十世纪五十年代的心理学和工程学的研究,人脸特征的识别再到人机交互识别和机器自动识别阶段,如今的人脸识别到处存在,支付、登录、实名认证等等。今天主要记录一下项目中人脸识别登录的功能。

        人脸识别的SDK有很多Face++、OpenCV、百度Api等等,本文主要介绍虹软人脸识别SDK,虹软人脸识别SDK最大的特点是可以免费使用,而且支持离线部署(需在线激活),提供了Android、IOS、C\C++、JAVA、C#版SDK,现在现在已经升级到3.0版本。

        本文基于虹软基于C#,.Net FrameWork4.6.1,ArcFace 2.2运行。

1、下载

        注册后可以在开发者中心 (arcsoft.com.cn)下载相关语言的SDK和Demo。

 2、初始化

  • 从开发者后台获取到APP_ID和SDKKEY,key分为32位和64位,
  • 根据cpu类型加载响应的key
  • 激活设备,第一次需要联网在线激活,后面就可以注释掉相关代码
  • 初始化引擎,包括检测功能、RGB视频专用FR引擎、IR视频专用FR引擎
public 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));
            rgbCameraIndex = (int)reader.GetValue("RGB_CAMERA_INDEX", typeof(int));
            irCameraIndex = (int)reader.GetValue("IR_CAMERA_INDEX", typeof(int));

            String Activation = (String)reader.GetValue("Activation", typeof(string));

            var is64CPU = true;
            if (string.IsNullOrWhiteSpace(appId) || string.IsNullOrWhiteSpace(is64CPU ? sdkKey64 : sdkKey32))
            {
                //禁用相关功能按钮
                //ControlsEnable(false, chooseMultiImgBtn, matchBtn, btnClearFaceList, chooseImgBtn);
                MessageBox.Show(string.Format("请在App.config配置文件中先配置APP_ID和SDKKEY{0}!", is64CPU ? "64" : "32"));
                return;
            }
            int retCode = 0;

            //在线激活引擎
            //激活后可以注释掉
            if (Activation.Equals("0"))
            {
                try
                {
                    retCode = ASFFunctions.ASFActivation(appId, is64CPU ? sdkKey64 : sdkKey32);
                }
                catch (Exception ex)
                {
                    if (ex.Message.Contains("无法加载 DLL"))
                    {
                        MessageBox.Show("请将sdk相关DLL放入bin对应的x86或x64下的文件夹中!");
                    }
                    else
                    {
                        MessageBox.Show("激活引擎失败!");
                    }
                    return;
                }
            }
            //end 激活

            //初始化引擎
            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
            retCode = ASFFunctions.ASFInitEngine(detectMode, imageDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pImageEngine);

            if (retCode != 0)
            {
                String msg = string.Format("引擎初始化失败!错误码为:{0}\r\n", retCode);
                if (appendText != null)
                    appendText(msg);
                LogUtil.WriteErrorLog("初始化引擎", msg);
                return;
            }

            //初始化视频模式下人脸检测引擎
            uint detectModeVideo = DetectionMode.ASF_DETECT_MODE_VIDEO;
            int combinedMaskVideo = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION;
            retCode = ASFFunctions.ASFInitEngine(detectModeVideo, videoDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMaskVideo, ref pVideoEngine);
            //RGB视频专用FR引擎
            detectFaceMaxNum = 1;
            combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_LIVENESS;
            retCode = ASFFunctions.ASFInitEngine(detectMode, imageDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pVideoRGBImageEngine);

            //IR视频专用FR引擎
            combinedMask = FaceEngineMask.ASF_FACE_DETECT | FaceEngineMask.ASF_FACERECOGNITION | FaceEngineMask.ASF_IR_LIVENESS;
            retCode = ASFFunctions.ASFInitEngine(detectMode, imageDetectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum, combinedMask, ref pVideoIRImageEngine);

            LogUtil.WriteLog("初始化引擎成功");
        }

 3、采集人脸注册

        获取摄像头,利用虹软的FilterInfoCollection方法获取到摄像头集合,这里默认取第一个,也可以通过界面控件手动选择。

        同时将摄像头关联到VideoSourcePlayer中,并开启摄像头。

var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count == 0)
            {
                LogUtil.WriteErrorLog("注册", "没有找到摄像头,请重新尝试");
                MessageBox.Show("没有找到摄像头,请重新尝试");
                return;
            }
//连接第一个摄像头
            var videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
            var videoResolution = videoSource.VideoCapabilities[0];

            videoSource.VideoResolution = videoResolution;

            irDeviceVideo = videoSource;

            this.videoSourcePlayer1.VideoSource = irDeviceVideo;
            this.videoSourcePlayer1.Start();

4、检测人脸

        人脸检测需要持续不断的运行,避免UI假死,因此这里开启一个单独的线程进行人脸处理。

ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{

                Thread.Sleep(1000);
                while (resultShowImgRect)
                {
                    ......
                }
}

        获取摄像头的图像this.videoSourcePlayer1.GetCurrentVideoFrame()。

        利用ASFFunctions.ASFDetectFaces方法检测图像中的人脸。

/// <summary>
        /// 人脸检测
        /// </summary>
        /// <param name="pEngine">引擎handle</param>
        /// <param name="width">图像宽度</param>
        /// <param name="height">图像高度</param>
        /// <param name="format">图像颜色空间</param>
        /// <param name="imgData">图像数据</param>
        /// <param name="detectedFaces">人脸检测结果</param>
        /// <returns>调用结果</returns>
        [DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]
        public static extern int ASFDetectFaces(IntPtr pEngine, int width, int height, int format, IntPtr imgData, IntPtr detectedFaces);

        获取检测结果。

MemoryUtil.PtrToStructure<ASF_MultiFaceInfo>(pMultiFaceInfo);

public struct ASF_MultiFaceInfo
    {
        /// <summary>
        /// 人脸Rect结果集
        /// </summary>
        public IntPtr faceRects;

        /// <summary>
        /// 人脸角度结果集,与faceRects一一对应  对应ASF_OrientCode
        /// </summary>
        public IntPtr faceOrients;
        /// <summary>
        /// 结果集大小
        /// </summary>
        public int faceNum;
        /// <summary>
        /// face ID,IMAGE模式下不返回FaceID
        /// </summary>
        public IntPtr faceID;
    }

5、获取特征点

        ASFFunctions.ASFFaceFeatureExtract可以将图像中的人脸特征提取出来,特征点是byte[]类型,可以将其保存到文件或者数据库中用于后续验证登录使用。

        /// <summary>
        /// 单人脸特征提取
        /// </summary>
        /// <param name="pEngine">引擎handle</param>
        /// <param name="width">图像宽度</param>
        /// <param name="height">图像高度</param>
        /// <param name="format">图像颜色空间</param>
        /// <param name="imgData">图像数据</param>
        /// <param name="faceInfo">单张人脸位置和角度信息</param>
        /// <param name="faceFeature">人脸特征</param>
        /// <returns>调用结果</returns>
        [DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]
        public static extern int ASFFaceFeatureExtract(IntPtr pEngine, int width, int height, int format, IntPtr imgData, IntPtr faceInfo, IntPtr faceFeature);

6、运行结果

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37382917/article/details/128756196

人脸识别项目ffmpeg+opencv+虹软sdk_果果小师弟的博客-爱代码爱编程

一、注册虹软 APP_ID:5vypHP9yEx3gq3s9Kf7tF4SVxfGaCBaJb5CkKfuiKNMz SDK_KEY:5vJZ7hRJfqj8eQdFvEBUg2meYgfGuuLyG9foTKU