记录一下:调试了虹软的人脸识别sdk,存到数据库中

13 篇文章 1 订阅


前言

最近偶尔看到了虹软sdk开放了活体检测的功能,以前记得19年的时候就关注过虹软的人脸识别免费开放的消息。现在正好拿来玩玩。

案例仅供参考

一、虹软是什么?

虹软是计算机视觉行业领先的算法服务提供商及解决方案供应商,服务于世界各地的客户,将领先的计算机视觉技术商业化应用在智能手机、智能汽车、智能家居、智能零售、互联网视频等领域,并且仍在不断探索新的领域与方向。

开放了人脸识别,人证核验和活体检测的sdk

二、使用步骤

1.引入库

1.使用C# 作为开发语言,选择了C++的sdk
在这里插入图片描述

去他们官网注册好账号后,可以选择不同的环境以及不同的sdk
在这里插入图片描述

2.在这里插入图片描述

准备几张照片,我准备了三张照片。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201202085634135.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1eWFuZzE5OTU=,size_16,color_FFFFFF,t_70) 以下是建表语句: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201202085831428.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201202090028917.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1eWFuZzE5OTU=,size_16,color_FFFFFF,t_70)

username 是人员名字
userfeature 是特征,特征值在虹软的2.2版本里面使用intptr存储的,3.0 则使用byte[ ]存储。3.0会比较方便。直接转换成basestring 存储即可。
userfeaturesize 是字符数量


2.读入数据

在这里插入图片描述
在注册人脸这,添加以下代码。

 public class UserModel
    {
        public string username { get; set; }
        public string userfeature { get; set; }
        public int userfeaturesize { get; set; }
    }
                            //创建数据库对象
                            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
                            {
                                ConnectionString = ConnectionStringObject.ConnectionString,//连接符字串
                                DbType = DbType.Sqlite,
                                IsAutoCloseConnection = true,
                                InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
                            });
									UserModel usermodel = new UserModel()
                                    {
                                        username = "women2",
                                        userfeature = Convert.ToBase64String(feature.feature),
                                        userfeaturesize = feature.featureSize
                                    };
                                    db.Insertable(usermodel).ExecuteCommand();

在这里插入图片描述

在后面,在demo的基础上添加了后台按钮。

//初始化的时候读取
public bool InitUserFaces()
        {
            try
            {
                SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
                {
                    ConnectionString = ConnectionStringObject.ConnectionString,//连接符字串
                    DbType = DbType.Sqlite,
                    IsAutoCloseConnection = true,
                    InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
                });
                UserFaces = db.Queryable<UserModel>().ToList();
                db.Close();
                db.Dispose();
                return true;
            }
            catch (Exception ex)
            {
                return false;
                //throw;
            }
            
        }

public List<UserModel> UserFaces = new List<UserModel>();

 try
            { 创建数据库对象
                SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
                {
                    ConnectionString = ConnectionStringObject.ConnectionString,//连接符字串
                    DbType = DbType.Sqlite,
                    IsAutoCloseConnection = true,
                    InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
                });
                var facelist = db.Queryable<UserModel>().ToList();

                //在点击开始的时候再坐下初始化检测,防止程序启动时有摄像头,在点击摄像头按钮之前将摄像头拔掉的情况
                initVideo();
                //必须保证有可用摄像头
                if (filterInfoCollection.Count == 0)
                {
                    MessageBox.Show("未检测到摄像头,请确保已安装摄像头或驱动!");
                    return;
                }
                if (rgbVideoSource.IsRunning || irVideoSource.IsRunning)
                {
                    btnStartVideo.Text = "启用摄像头";
                    //关闭摄像头
                    if (irVideoSource.IsRunning)
                    {
                        irVideoSource.SignalToStop();
                        irVideoSource.Hide();
                    }
                    if (rgbVideoSource.IsRunning)
                    {
                        rgbVideoSource.SignalToStop();
                        rgbVideoSource.Hide();
                    }
                    //“选择识别图”、“开始匹配”按钮可用,阈值控件禁用
                    ControlsEnable(true, chooseImgBtn, matchBtn, chooseMultiImgBtn, btnClearFaceList);
                    txtThreshold.Enabled = false;
                    exitVideoRGBFR = true;
                    exitVideoRGBLiveness = true;
                }
                else
                {
                    if (isCompare)
                    {
                        //比对结果清除
                        for (int i = 0; i < imagesFeatureList.Count; i++)
                        {
                            imageList.Items[i].Text = string.Format("{0}号", i);
                        }
                        lblCompareInfo.Text = string.Empty;
                        isCompare = false;
                    }
                    //“选择识别图”、“开始匹配”按钮禁用,阈值控件可用,显示摄像头控件
                    txtThreshold.Enabled = true;
                    rgbVideoSource.Show();
                    irVideoSource.Show();
                    ControlsEnable(false, chooseImgBtn, matchBtn, chooseMultiImgBtn, btnClearFaceList);
                    btnStartVideo.Text = "关闭摄像头";
                    //获取filterInfoCollection的总数
                    int maxCameraCount = filterInfoCollection.Count;
                    //如果配置了两个不同的摄像头索引
                    if (rgbCameraIndex != irCameraIndex && maxCameraCount >= 2)
                    {
                        //RGB摄像头加载
                        rgbDeviceVideo = new VideoCaptureDevice(filterInfoCollection[rgbCameraIndex < maxCameraCount ? rgbCameraIndex : 0].MonikerString);
                        rgbVideoSource.VideoSource = rgbDeviceVideo;
                        rgbVideoSource.Start();

                        //IR摄像头
                        irDeviceVideo = new VideoCaptureDevice(filterInfoCollection[irCameraIndex < maxCameraCount ? irCameraIndex : 0].MonikerString);
                        irVideoSource.VideoSource = irDeviceVideo;
                        irVideoSource.Start();
                        //双摄标志设为true
                        isDoubleShot = true;
                    }
                    else
                    {
                        //仅打开RGB摄像头,IR摄像头控件隐藏
                        rgbDeviceVideo = new VideoCaptureDevice(filterInfoCollection[rgbCameraIndex <= maxCameraCount ? rgbCameraIndex : 0].MonikerString);
                        rgbVideoSource.VideoSource = rgbDeviceVideo;
                        rgbVideoSource.Start();
                        irVideoSource.Hide();
                    }
                    //启动两个检测线程
                    exitVideoRGBFR = false;
                    exitVideoRGBLiveness = false;
                    videoRGBLiveness();
                    //videoRGBFR();
                    videoRGBFRServer();
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(GetType(), ex);
            }

        private void videoRGBFRServer()
        {
            int index = 10000;
            ThreadPool.QueueUserWorkItem(new WaitCallback(delegate {
                while (true)
                {
                    //index--;
                    //if (index == 0)
                    //{
                    //    index = 10000;
                    //    existNewFace = true;
                    //}
                    if (exitVideoRGBFR)
                    {
                        return;
                    }
                    try
                    {
                        //if (ableReadFaceInfo && existNewFace && handleQueue.Contains(faceIDTemp) && !livenessResult.Equals(livenessInitValue))
                        if (ableReadFaceInfo && existNewFace  && !livenessResult.Equals(livenessInitValue))
                        {
                            ableReadFR = false;
                            if (livenessResult.Equals(1) && rect.left != 0 && rect.right != 0 && rect.top != 0 && rect.bottom != 0)
                            {
                                int result = -1;
                                float similarity = 0f;
                                for (int i = 0; i < frMatchTime; i++)
                                {
                                    if (exitVideoRGBFR)
                                    {
                                        break;
                                    }
                                    Console.WriteLine(string.Format("faceid:{0},特征搜索第{1}次\r\n", "999", i + 1));
                                    Bitmap bitmapTemp = rgbVideoSource.GetCurrentVideoFrame();
                                    if (bitmapTemp == null)
                                    {
                                        break;
                                    }
                                    //提取人脸特征
                                    FaceFeature feature = FaceUtil.ExtractFeature(videoRGBImageEngine, bitmapTemp, maxFace);
                                    similarity = 0f;
                                    result = compareFeatureServer(feature, out similarity);
                                    //得到比对结果
                                    if (result > -1)
                                    {
                                        break;
                                    }
                                }
                                if (!result.Equals(-1))
                                {
                                    //将比对结果放到显示消息中,用于最新显示
                                    trackRGBUnit.message = string.Format(" {0}号 {1},{2},Faceid:{3}", result, similarity, string.Format("RGB{0}", CommonUtil.TransLivenessResult(livenessResult)), UserFaces[result].username);
                                }
                                else
                                {
                                    //显示消息
                                    trackRGBUnit.message = string.Format("RGB{0},Faceid:{1}", CommonUtil.TransLivenessResult(livenessResult), result);
                                }

                            }
                            else
                            {
                                //显示消息
                                trackRGBUnit.message = string.Format("RGB{0},Faceid:{1}", CommonUtil.TransLivenessResult(livenessResult), "999");
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                    finally
                    {
                        ableReadFR = true;
                    }
                }
            }));
        }
        /// <summary>
        /// 得到feature比较结果
        /// </summary>
        /// <param name="feature"></param>
        /// <returns></returns>
        private int compareFeatureServer(FaceFeature feature, out float similarity)
        {
            int result = -1;
            similarity = 0f;
            try
            {

                //如果人脸库不为空,则进行人脸匹配
                if (UserFaces != null && UserFaces.Count > 0)
                {
                    for (int i = 0; i < UserFaces.Count; i++)
                    {
                        //调用人脸匹配方法,进行匹配
                        videoRGBImageEngine.ASFFaceFeatureCompare(feature,new FaceFeature() {feature =  Convert.FromBase64String( UserFaces[i].userfeature),featureSize = UserFaces[i].userfeaturesize } , out similarity);
                        if (similarity >= threshold)
                        {
                            result = i;
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(GetType(), ex);
            }
            return result;
        }

ok 程序到这里就修改完成了。每次程序启动之后,会从bin文件夹下面的.db文件里面读取出所有的人脸。然后每次通过摄像头去匹配。 已测试,效果挺好,识别的很快。就是还有一些小问题。但是总体来说效果很好。

总结

gitee,代码地址:人脸识别

更新架构

这是官方的样例demo介绍,本文也是几乎差不多的原理,目前实现了小型智慧工地的人脸识别系统的设计。

以后有机会的话会更新成下图右边的c/s系统设计
在这里插入图片描述

更新数据库(增加图片存储)

在这里插入图片描述
在这里插入图片描述
总共两张表

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CSDN虹软人脸识别SDK是一个用于人脸识别件开发工具包。搭建这个SDK的过程可以分为以下几个步骤: 首先,需要下载并安装CSDN虹软人脸识别SDK的相关件包。可以在CSDN官网上找到这个SDK的下载链接,根据自己的操作系统选择对应的版本进行下载。下载完成后,按照安装向导进行安装。 接下来,需要创建一个新的项目,并将虹软人脸识别SDK添加到项目。具体的添加方式可以参考虹软官方提供的文档或者教程。一般来说,需要将SDK的相关文件复制到项目的指定目录,并配置好项目的编译选项以便能够正确地链接和使用SDK。 然后,需要在项目编写代码来调用SDK的功能。首先需要初始化SDK,并加载训练好的人脸模型。然后,可以使用SDK提供的函数来进行人脸检测、特征提取、人脸比对等操作。在编写代码的过程,可以根据需求自定义一些参数,例如设置人脸检测的阈值、人脸比对的相似度阈值等。 最后,进行测试和调试。可以编写一些测试代码,输入一些样本人脸数据进行测试,观察SDK的识别结果是否准确。如果有需要,可以对代码进行一些优化和改进,以获得更好的人脸识别效果。 总的来说,搭建CSDN虹软人脸识别SDK主要包括下载安装、添加到项目、编写代码调用、测试和调试等步骤。在操作过程,可以参考官方提供的文档和教程,以及根据实际需求进行适当的定制和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值