C# Winform开发人脸识别小程序 (基于百度接口)

一、设计思路

1、背景

家里面的小朋友(我弟)去参加学校组织的一个小比赛,配合他做了这个人脸识别的小程序,把设计思路和代码发在这里。

2、简介

本程序通过调用百度的人脸识别相关的云服务算法,最终实现“人脸注册”和“人脸识别欢迎语提示”这两个功能。

3、用到的技术

本程序的最终实现形式为Windows桌面程序,本程序主要采用微软的Winform模式进行开发,编程语言为C#。
开发所使用的IDE为Visual Studio2019(.NET Core3.1),辅助工具为Postman、Json格式转换工具、Base64编码工具等。

4、设计

功能一:用户注册

功能概述

用户图像(照片or实时图像) + 用户填写的信息 => 百度云端

功能示意图

在这里插入图片描述
在这里插入图片描述

时序图

在这里插入图片描述

功能二:人脸识别

功能概述

识别出现在镜头中的用户。

功能示意图

时序图

在这里插入图片描述

扫描二维码关注公众号,回复: 15249638 查看本文章

二、实现

1、环境准备

硬件:带有摄像头的计算机。
软件:Windows10 操作系统。
网络:连接互联网。

2、百度接口配置

(1) 打开百度智能云网址,注册登录,进入如下界面。
在这里插入图片描述
(2) 点击立即使用。
在这里插入图片描述
(3) 点击创建应用。
在这里插入图片描述
(4) 在应用名称一栏输入所建应用的名称,在应用描述一栏输入对所创建应用的大概描述,然后点击立即创建。
在这里插入图片描述
在这里插入图片描述
(5) 点击返回应用列表即可看到刚才创建应用的详细信息,并且可以看到获取到的API key和Secret key。
在这里插入图片描述
在这里插入图片描述

3、技术准备

(1) 一张图片,在计算机最底层的本质就是一段二进制代码,不清楚该原理的可以去这个网站转一下试试:
在这里插入图片描述
(2) 这次要用到三个百度接口:
A、登录接口(鉴权认证/获取Access Token)
在这里插入图片描述
用Postman或者其他在线http请求工具调用一下试试:
在这里插入图片描述
注意,client_id和client_secret是你在百度应用中心申请的应用里面的API Key和Secret Key,这两个东西相当于用户名和密码。
在这里插入图片描述
B、注册接口(人脸库管理/人脸注册,别的不用看)
在这里插入图片描述
在这里插入图片描述

C、人脸识别接口(人脸搜索/人脸搜索,别的不用看)
在这里插入图片描述
在这里插入图片描述

4、代码实现

功能一:用户注册

(1)创建TokenHelper,用于调用百度登录接口(鉴权认证/获取Access Token)

    class TokenHelper
    {
    
    
        public static string getAccessToken()
        {
    
    
            string clientId = ConfigurationSettings.AppSettings["clientId"];
            string clientSecret = ConfigurationSettings.AppSettings["clientSecret"];

            string authHost = "https://aip.baidubce.com/oauth/2.0/token";
            HttpClient client = new HttpClient();
            List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();
            paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
            paraList.Add(new KeyValuePair<string, string>("client_id", clientId));
            paraList.Add(new KeyValuePair<string, string>("client_secret", clientSecret));

            HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
            string result = response.Content.ReadAsStringAsync().Result;
            return result;
        }

注意一下,代码里的相关参数都写在app.config中,这些参数的值根据你所申请的百度账号里的参数值进行具体配置。

(2)创建ImagHelper,用于图片的格式转换

public class ImagHelper
    {
    
    
        /// <summary>
        /// 图片转为base64编码的文本
        /// </summary>
        /// <param name="bmp">待转的Bitmap</param>
        /// <returns>转换后的base64字符串</returns>
        public static String ImgToBase64String(Image bmp)
        {
    
    
            String strbaser64 = String.Empty;
            var btarr = convertByte(bmp);
            strbaser64 = Convert.ToBase64String(btarr);

            return strbaser64;
        }

        /// <summary>
        /// Image转byte[]
        /// </summary>
        /// <param name="img">Img格式数据</param>
        /// <returns>byte[]格式数据</returns>
        public static byte[] convertByte(Image image)
        {
    
    
            ImageFormat format = image.RawFormat;
            using (MemoryStream ms = new MemoryStream())
            {
    
    
                if (format.Equals(ImageFormat.Jpeg))
                {
    
    
                    image.Save(ms, ImageFormat.Jpeg);
                }
                else if (format.Equals(ImageFormat.Png))
                {
    
    
                    image.Save(ms, ImageFormat.Png);
                }
                else if (format.Equals(ImageFormat.Bmp))
                {
    
    
                    image.Save(ms, ImageFormat.Bmp);
                }
                else if (format.Equals(ImageFormat.Gif))
                {
    
    
                    image.Save(ms, ImageFormat.Gif);
                }
                else if (format.Equals(ImageFormat.Icon))
                {
    
    
                    image.Save(ms, ImageFormat.Icon);
                }
                else
                {
    
    
                    image.Save(ms, ImageFormat.Jpeg);
                }
                byte[] buffer = new byte[ms.Length];
                //Image.Save()会改变MemoryStream的Position,需要重新Seek到Begin
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(buffer, 0, buffer.Length);
                return buffer;
            }
        }
    }

(3)创建FaceHelper ,用于人脸注册和人脸搜索(即人脸识别)

class FaceHelper : IDisposable
    {
    
    
        public string token {
    
     get; set; }

        /// <summary>
        /// 注册人脸
        /// </summary>
        /// <param name="face"></param>
        /// <returns></returns>
        public FaceMsg Add(FaceInfo face)
        {
    
    
            string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + token;

            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            String str = JsonConvert.SerializeObject(face);
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();

            FaceMsg msg = JsonConvert.DeserializeObject<FaceMsg>(result);
            return msg;
        }

        /// <summary>
        /// 搜索人脸
        /// </summary>
        /// <param name="face"></param>
        /// <returns></returns>
        public MatchMsg FaceSearch(Face face)
        {
    
    
            string host = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=" + token;
            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            String str = JsonConvert.SerializeObject(face); ;
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();
            MatchMsg msg = JsonConvert.DeserializeObject<MatchMsg>(result);
            return msg;
        }


        public void Dispose()
        {
    
    

        }
    }

(4)创建From
在这里插入图片描述
具体细节略过,详细代码已上传,见文章末尾链接,这里就特别注意一下VideoSourcePlayer这个控件,该控件用于动态调用摄像头获取实时图像,该控件需要单独导入这些包:
在这里插入图片描述

功能二:人脸识别

人脸识别的实现思路和上述人脸注册差不多,同样是用到FaceHelper、ImagHelper、TokenHelper这三个类。

在人脸识别的Form设计时,注意一个点:需要启动一个子线程实时监测摄像头、轮询百度人脸搜索接口,一旦摄像头中出现已注册的人脸信息,百度接口将立即返回识别结果。

5、补充

(1)源码和发布后的可运行小程序稍后发在评论区。

(2)摄像头权限配置:有的用户电脑可能会无法直接调用摄像头,需要设置摄像头访问权限,去网上攻略一下怎么在win10设置摄像头访问权限。

(3)部署的目标电脑不是必须安装Visio Studio,只安装.Net Core环境就行:windowsdesktop-runtime-3.1.15-win-x64.exe。

(4)注册程序和人脸识别程序不能同时打开,因为摄像头无法同时被多个进程占用。

猜你喜欢

转载自blog.csdn.net/weixin_43645811/article/details/124365587