c# 利用AForge和百度AI开发实时人脸识别

baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能

人脸实时检测识别功能

思路是利用AForge打开摄像头,通过摄像头获取到的图像显示在winform窗体中AForge的控件中,利用AForge控件中的NewFrame事件获取要显示的每一帧的图像,获取图像传输到百度AI平台进行人脸检测,并且将检测结果反馈到界面显示的图像中。在这个过程中有两个问题,获取图像上传到百度AI平台进行分析需要时间,这个时间跟网络有关,所以需要单独一个线程进行人脸识别,第二个问题,百度人脸识别接口开发者一秒内只能掉用2次接口,所以需要控制不是每一帧的图像都要上传。所以基于以上思路

首先页面初始化的时候获取视频设备、启动一个单独线程控制1秒内人脸检测的次数:

private void Form1_Load(object sender, EventArgs e)
        {
            /// 获取电脑已经安装的视频设备
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices!=null && videoDevices.Count>0)
            {
                foreach (FilterInfo device in videoDevices)
                {
                    comboBox1.Items.Add(device.Name);
                }
                comboBox1.SelectedIndex = 0;
            }
            videoSourcePlayer1.NewFrame += VideoSourcePlayer1_NewFrame;

            // 开发者在百度AI平台人脸识别接口只能1秒中调用2次,所以需要做 定时开始检测,每个一秒检测2次
            ThreadPool.QueueUserWorkItem(new WaitCallback(p => {
                while (true)
                {
                    IsStart = true;
                    Thread.Sleep(500);
                }
            }));
        }

其次,在NewFrame的回调方法中,根据IsStart判断是否要开始人脸识别,并且另外启动一个线程进行人脸识别操作,判断如果已经有识别过的结构,根据返回的人脸的位置,在当前的一帧图像中绘制方框指示出识别出的人脸位置

private void VideoSourcePlayer1_NewFrame(object sender, ref Bitmap image)
        {
            try
            {
                if (IsStart)
                {
                    IsStart = false;
                    // 在线程池中另起一个线程进行人脸检测,这样不会造成界面视频卡顿现象
                    ThreadPool.QueueUserWorkItem(new WaitCallback(this.Detect), image.Clone());
                }
                if (location != null)
                {
                    try
                    {
                        // 绘制方框套住人脸
                        Graphics g = Graphics.FromImage(image);
                        g.DrawLine(new Pen(Color.Black), new System.Drawing.Point(location.left, location.top), new System.Drawing.Point(location.left + location.width, location.top));
                        g.DrawLine(new Pen(Color.Black), new System.Drawing.Point(location.left, location.top), new System.Drawing.Point(location.left, location.top + location.height));
                        g.DrawLine(new Pen(Color.Black), new System.Drawing.Point(location.left, location.top + location.height), new System.Drawing.Point(location.left + location.width, location.top + location.height));
                        g.DrawLine(new Pen(Color.Black), new System.Drawing.Point(location.left + location.width, location.top), new System.Drawing.Point(location.left + location.width, location.top + location.height));
                        g.Dispose();

                    }
                    catch (Exception ex)
                    {
                        ClassLoger.Error("VideoSourcePlayer1_NewFrame", ex);
                    }
                }
            } catch (Exception ex)
            {
                ClassLoger.Error("VideoSourcePlayer1_NewFrame1", ex);
            }

        }

人脸注册。

在一些类似刷脸签到、刷脸登录的应用场景中,根据人脸获取人物信息,前提就是人脸注册,人脸注册就是获取当前摄像头的一帧图像,调用百度AI的人脸注册接口进行注册

// 用户ID
            string uid = "1";
            // 用户资料,长度限制256B
            string userInfo = textBox6.Text.Trim();
            // 用户组ID
            string groupId = textBox5.Text.Trim();

            if (comboBox1.Items.Count <= 0)
            {
                MessageBox.Show("请插入视频设备");
                return;
            }
            try
            {
                if (videoSourcePlayer1.IsRunning)
                {
                    BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                                    videoSourcePlayer1.GetCurrentVideoFrame().GetHbitmap(),
                                    IntPtr.Zero,
                                     Int32Rect.Empty,
                                    BitmapSizeOptions.FromEmptyOptions());
                    var img = BitmapSource2Byte(bitmapSource);
                    var options = new Dictionary<string, object>{
                        {"action_type", "replace"}
                    };
                    var result = client.UserAdd(uid, userInfo, groupId, img, options);
                    if (result.ToString().Contains("error_code"))
                    {
                        MessageBox.Show("注册失败:" + result.ToString());
                    }
                    else
                    {
                        MessageBox.Show("注册成功");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("摄像头异常:" + ex.Message);
            }

人脸登录

人脸登录和人脸注册的方式一样,只不过调用的是百度AI的人脸登录接口

// 用户ID
            string uid = "1";
            // 用户资料,长度限制256B
            string userInfo = textBox6.Text.Trim();
            // 用户组ID
            string groupId = textBox5.Text.Trim();

            if (comboBox1.Items.Count <= 0)
            {
                MessageBox.Show("请插入视频设备");
                return;
            }
            try
            {
                if (videoSourcePlayer1.IsRunning)
                {
                    BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                                    videoSourcePlayer1.GetCurrentVideoFrame().GetHbitmap(),
                                    IntPtr.Zero,
                                     Int32Rect.Empty,
                                    BitmapSizeOptions.FromEmptyOptions());
                    var img = BitmapSource2Byte(bitmapSource);

                    // 如果有可选参数
                    //var options = new Dictionary<string, object>{
                    //    {"ext_fields", "faceliveness"},
                    //    {"user_top_num", 3}
                    //};

                    var result = client.Identify(groupId, img);
                    FaceIdentifyInfo info = JsonHelper.DeserializeObject<FaceIdentifyInfo>(result.ToString());
                    if (info!=null && info.result!=null && info.result.Length>0)
                    {
                        textBox7.Text = info.result[0].user_info;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("摄像头异常:" + ex.Message);
            }

源码地址:https://github.com/liemei/baiduAIFaceIdentify

原文地址:https://www.cnblogs.com/liemei/p/8318414.html

时间: 2024-07-29 03:04:16

c# 利用AForge和百度AI开发实时人脸识别的相关文章

java通过百度AI开发平台提取身份证图片中的文字信息

废话不多说,直接上代码... IdCardDemo.java 1 package com.wulss.baidubce; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.net.HttpURLConnection; 6 import java.net.URL; 7 import java.net.URLEncoder; 8 import java.util.Map; 9 10

Asp.net+WebSocket+Emgucv实时人脸识别

上个月在网上看到一个用web实现简单AR效果的文章,然后自己一路折腾,最后折腾出来一个 Asp.net+WebSocket+Emgucv实时人脸识别的东西,网上也有不少相关资料,有用winform的也有asp.net的.其实人脸识别技术早就成熟了,就是没机会接触这方面.百度了一下 找到好多,JqueryFaceDetection,face++,face core,opencv,emgucv等等,这些我都折腾了一遍,并不能很好的满足我的需求,我就是想像手机QQ里边的拍照的时候能识别到人脸并且对图像

【Win10 应用开发】人脸识别

原文:[Win10 应用开发]人脸识别 可能你会认为人脸识别用起来会很复杂,老周当初也这么想,但通过实际操作后,我发现非然. 经过微软封装的东西,向来都是复杂问题简单化,只要用得舒心,代码越少越好,用最少的代码做最多的事情,此为大师境界也. 好,屁话不说,先介绍一下如何完成人脸识别(或者叫人脸检测,随你怎么翻译,反正知道是怎么一回事就行).核心的类是FaceDetector,不要问我这个类在哪里,自己打开对象浏览器搜索. 第一步,访问静态属性IsSupported,看看当前平台是不是支持人脸识别

AI(二):人脸识别

微软提供的人脸识别服务可检测图片中一个或者多个人脸,并为人脸标记出边框,同时还可获得基于机器学习技术做出的面部特征预测.可支持的人脸功能有:年龄.性别.头部姿态.微笑检测.胡须检测以及27个面部重要特征点位置等.FaceAPI 提供两个主要功能: 人脸检测和识别 目录: 申请subscription key 示例效果 开发示例 AForge.Net 申请订阅号 申请试用subscription key, 地址 https://www.microsoft.com/cognitive-service

借助百度云API进行人脸识别

前言:本篇博客是笔者第一次使用百度云api进行人脸检测,主要内容包括两部分,一是获取接口,二是借助接口进行人脸检测,最终可以给出一个百分比判别两张人脸是否属于同一个人.笔者也是初步了解这方面的内容,也是参考了杂七杂八的博文,内容可能存在错误及其他毛病,欢迎指出. 1:在百度AI里面创建应用 在百度AI开放平台使用百度的人脸识别能力,只需要三个核心步骤即可操作完成: 获取接口权限 准备接口调用工具 进行接口调用. 获取接口权限 获取接口权限是调用接口的前提,主要分为以下几步: 1.进入百度云的人脸

腾讯技术工程 |腾讯AI Lab刷新人脸识别与检测两大测评国际记录,技术日调用超六亿

2017年12月18日,深圳 - 腾讯AI Lab研发的Face R-FCN和FaceCNN算法分别在国际最大.最难的人脸检测平台WIDER FACE与最热门权威的人脸识别平台MegaFace多项评测指标中荣膺榜首,刷新行业纪录,展现其在计算机视觉领域中,特别是人脸技术上的强劲实力. 研究上,目前腾讯AI Lab已通过arXiv平台发表论文公开人脸检测算法部分技术细节,促进企业与学界"共享AI"研究成果:应用上,该人脸技术已接入腾讯互联网+公共服务平台等多个应用场景,每日技术调用量超六

微信开发+百度AI学习:植物识别

直接上代码 服务端代码如下 private static readonly Baidu.Aip.ImageClassify.ImageClassify client = new Baidu.Aip.ImageClassify.ImageClassify(ApiConfig.APIKey, ApiConfig.SecretKey); /// <summary> /// 植物识别 /// </summary> /// <param name="filesrc"

实时人脸识别

今天研究了几个开源项目,纪录一下. 目标:能够实时获取到  AVCaptureSession  中实时的获取的图像数据,转换为 UIImage : 对获取的 UIImage 进行脸部识别: 最后,达到实时脸部识别的效果. 找到如下例子: 1.一个屏幕中 获取多个 预览界面 效果的 例子. 来源:http://stackoverflow.com/questions/16543075/avcapturesession-with-multiple-previews 代码: https://github

微信日志开发之人脸识别开发

这节我们将简单介绍在微信日志中如何实现人脸识别功能 人脸识别我们将会使用Face++提供的api. 需要使用的id以及AppKey请到官网首页注册获取. (一)实现步骤 1.将用户发送信息获取并提交到服务器 2.服务器端处理信息并返回处理结果 3.将信息返还给用户 (二)实现代码 1.信息提取 在微信日志的主函数中我们有用户输入信息获取的函数,人脸识别的相关信息也可以在其中实现 public function __construct() { global $wpdb; if(isset($_GE