C# Winform调用百度接口实现人脸识别教程(附源码)

作者:Even-LittleMonkey 时间:2021-12-27 13:17:09 

百度是个好东西,这篇调用了百度的接口(当然大牛也可以自己写),人脸检测技术,所以使用的前提是有网的情况下。当然大家也可以去参考百度的文档。

C# Winform调用百度接口实现人脸识别教程(附源码)

话不多说,我们开始:

第一步,在百度创建你的人脸识别应用

打开百度AI开放平台链接: 点击跳转百度人脸检测链接,创建新应用

C# Winform调用百度接口实现人脸识别教程(附源码)

创建成功成功之后。进行第二步

第二步,使用API Key和Secret Key,获取 AssetToken

平台会分配给你相关凭证,拿到API Key和Secret Key,获取 AssetToken

C# Winform调用百度接口实现人脸识别教程(附源码)

接下来我们创建一个AccessToken类,来获取我们的AccessToken


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace AegeanHotel_management_system
{
 class AccessToken
 {
   // 调用getAccessToken()获取的 access_token建议根据expires_in 时间 设置缓存
   // 返回token示例
   public static string TOKEN = "24.ddb44b9a5e904f9201ffc1999daa7670.2592000.1578837249.282335-18002137";

// 百度云中开通对应服务应用的 API Key 建议开通应用的时候多选服务
   private static string clientId = "这里是你的API Key";
   // 百度云中开通对应服务应用的 Secret Key
   private static string clientSecret = "这里是你的Secret Key";

public static string getAccessToken()
   {
     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;
   }
 }
}

第三步,封装图片信息类Face,保存图像信息

封装图片信息类Face,保存拍到的图片信息,保存到百度云端中,用于以后扫描秒人脸做对比。


using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AegeanHotel_management_system
{
 [Serializable]
 class Face
 {
   [JsonProperty(PropertyName = "image")]
   public string Image { get; set; }
   [JsonProperty(PropertyName = "image_type")]
   public string ImageType { get; set; }
   [JsonProperty(PropertyName = "group_id_list")]
   public string GroupIdList { get; set; }
   [JsonProperty(PropertyName = "quality_control")]
   public string QualityControl { get; set; } = "NONE";
   [JsonProperty(PropertyName = "liveness_control")]
   public string LivenessControl { get; set; } = "NONE";
   [JsonProperty(PropertyName = "user_id")]
   public string UserId { get; set; }
   [JsonProperty(PropertyName = "max_user_num")]
   public int MaxUserNum { get; set; } = 1;
 }
}

第四步,定义人脸注册和搜索类FaceOperate

定义人脸注册和搜索类FaceOperate,里面定义两个方法分别为,注册人脸方法和搜索人脸方法。


using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace AegeanHotel_management_system
{
 class FaceOperate : 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()
   {

}
 }
}

在把类定义完成之后,我们就可以绘制我们的摄像头了videoSourcePlayer

第五步,绘制videoSourcePlayer控件,对人脸进行拍摄

现在我们是没有这个控件的,所以我们要先导包,点击我们的工具选项卡,选择NuGet包管理器,管理解决方案的NuGet程序包,安装一下的包:

C# Winform调用百度接口实现人脸识别教程(附源码)

然后我们就能看到videoSourcePlayer控件,把它绘制在窗体上就好了。

C# Winform调用百度接口实现人脸识别教程(附源码)

第五步,调用摄像头拍摄注册人脸

C# Winform调用百度接口实现人脸识别教程(附源码)

然后我们就可以写控制摄像头的语句以及拍摄之后注册处理的方法了:


using AForge.Video.DirectShow;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AegeanHotel_management_system
{
 public partial class FrmFacePeople : Form
 {
   string tocken = "";
   public FrmFacePeople()
   {
     InitializeComponent();
     Tocken tk = JsonConvert.DeserializeObject<Tocken>(AccessToken.getAccessToken());
     this.tocken = tk.AccessToken;
   }

private FilterInfoCollection videoDevices;
   private VideoCaptureDevice videoDevice;
   private void FrmFacePeople_Load(object sender, EventArgs e)
   {
     //获取摄像头
     videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
     //实例化摄像头
     videoDevice = new VideoCaptureDevice(videoDevices[0].MonikerString);
     //将摄像头视频播放在控件中
     videoSourcePlayer1.VideoSource = videoDevice;
     //开启摄像头
     videoSourcePlayer1.Start();
   }

private void FrmFacePeople_FormClosing(object sender, FormClosingEventArgs e)
   {
     videoSourcePlayer1.Stop();
   }

private void button1_Click(object sender, EventArgs e)
   {
     //拍照
     Bitmap img = videoSourcePlayer1.GetCurrentVideoFrame();
     //图片转Base64
     string imagStr = ImagHelper.ImgToBase64String(img);
     //实例化FaceInfo对象
     FaceInfo faceInfo = new FaceInfo();
     faceInfo.Image = imagStr;
     faceInfo.ImageType = "BASE64";
     faceInfo.GroupId = "admin";
     faceInfo.UserId = Guid.NewGuid().ToString().Replace('-', '_');//生成一个随机的UserId 可以固定为用户的主键
     faceInfo.UserInfo = "";
     using (FaceOperate faceOperate = new FaceOperate())
     {
       faceOperate.token = tocken;
       //调用注册方法注册人脸
       var msg = faceOperate.Add(faceInfo);
       if (msg.ErroCode == 0)
       {
         MessageBox.Show("添加成功");
         //关闭摄像头
         videoSourcePlayer1.Stop();
       }
     }
   }
 }
}

我们在添加人脸之后可以到百度只能云的人脸库中查看一下添加是否成功。

C# Winform调用百度接口实现人脸识别教程(附源码)

如果添加成功,那么恭喜,我们就可以进行人脸识别了。

第六步,拍摄之后对比查询人脸识别

然后我们就可以写控制摄像头的语句以及拍摄之后搜索处理的方法了:


using AForge.Video.DirectShow;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AegeanHotel_management_system
{
 public partial class FrmFaceDemo : Form
 {
   string tocken = "";
   FrmLogin login;
   public FrmFaceDemo(FrmLogin login)
   {

this.login = login;
     InitializeComponent();
     //获取Token并反序列化
     Tocken tk = JsonConvert.DeserializeObject<Tocken>(AccessToken.getAccessToken());
     this.tocken = tk.AccessToken;
   }

private FilterInfoCollection videoDevices;
   private VideoCaptureDevice videoDevice;

private void FrmFaceDemo_Load(object sender, EventArgs e)
   {
     videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
     videoDevice = new VideoCaptureDevice(videoDevices[0].MonikerString);
     videoSourcePlayer1.VideoSource = videoDevice;
     //开启摄像头
     videoSourcePlayer1.Start();
   }
   private void NewMethod()
   {
     //获取图片 拍照
     Bitmap img = videoSourcePlayer1.GetCurrentVideoFrame();
     //关闭相机
     videoSourcePlayer1.Stop();
     //图片转Base64
     string imagStr = ImagHelper.ImgToBase64String(img);
     Face faceInfo = new Face();
     faceInfo.Image = imagStr;
     faceInfo.ImageType = "BASE64";
     faceInfo.GroupIdList = "admin";
     this.Hide();
     using (FaceOperate faceOperate = new FaceOperate())
     {
       try
       {
         faceOperate.token = tocken;
         //调用查找方法
         var msg = faceOperate.FaceSearch(faceInfo);

foreach (var item in msg.Result.UserList)
         {
           //置信度大于90 认为是本人
           if (item.Score > 90)
           {
             DialogResult dialog = MessageBox.Show("登陆成功", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
             //this.label1.Text = item.UserId;
             if (dialog == DialogResult.OK)
             {
               FrmShouYe shouye = new FrmShouYe();
               shouye.Show();
               login.Hide();
               this.Close();

}
             return;
           }
           else
           {
             DialogResult dialog = MessageBox.Show("人员不存在", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
             if (dialog == DialogResult.OK)
             {
               this.Close();
             }
           }
         }
       }
       catch (Exception e)
       {
         DialogResult dialog = MessageBox.Show("人员不存在,错误提示"+e, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
         if (dialog == DialogResult.OK)
         {
           this.Close();
         }
       }

}
   }

private void videoSourcePlayer1_Click(object sender, EventArgs e)
   {
     NewMethod();
   }
 }
}

写到这我们就结束了,人脸识别的注册和搜索功能就已经都实现完毕了,接下来我们还可以在百度智能云的监控报报表中查看调用次数

查看监控报表

C# Winform调用百度接口实现人脸识别教程(附源码)

来源:https://blog.csdn.net/Houoy/article/details/106043069

标签:C#,Winform,人脸识别,百度接口
0
投稿

猜你喜欢

  • 利用POI生成EXCEL文件的方法实例

    2023-11-23 21:44:14
  • Android开发使用自定义View将圆角矩形绘制在Canvas上的方法

    2021-06-08 01:03:17
  • springboot之Jpa通用接口及公共方法使用示例

    2023-02-17 16:18:52
  • Java Servlet线程中AsyncContext异步处理Http请求

    2023-10-02 23:17:39
  • 解决android 显示内容被底部导航栏遮挡的问题

    2021-08-05 10:10:55
  • Java IO流—异常及捕获异常处理 try…catch…finally

    2023-03-14 07:35:52
  • Android WebView实现长按保存图片及长按识别二维码功能

    2021-08-18 18:56:09
  • Java经典面试题汇总:Mybatis

    2021-09-20 07:42:44
  • 详解使用JRebel插件实现SpringBoot应用代码热加载

    2021-06-15 10:39:00
  • java文件处理工具类详解

    2022-12-19 22:49:59
  • Springboot 如何指定获取出 yml文件里面的配置值

    2022-08-29 21:04:48
  • Android应用程序的编译流程及使用Ant编译项目的攻略

    2022-09-18 18:22:16
  • Java去掉数字字符串开头的0三种方法(推荐)

    2022-05-31 08:04:41
  • Spring的@RequestParam对象绑定方式

    2023-02-03 21:05:35
  • SpringMVC配置多个properties文件之通配符解析

    2021-10-18 02:19:02
  • 桌面浮动窗口(类似恶意广告)的实现详解

    2023-04-28 06:02:27
  • java生成随机数的方法

    2023-12-12 12:49:51
  • 一个进程间通讯同步的C#框架引荐

    2023-01-18 17:55:03
  • Spring Cloud Gateway重试机制的实现

    2023-11-06 01:32:59
  • intellij idea中spring boot properties文件不能自动提示问题解决

    2021-09-24 09:53:46
  • asp之家 软件编程 m.aspxhome.com