热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍了C#Winform调用百度接口实现人脸识别教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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


话不多说,我们开始:

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

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


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

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

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


接下来我们创建一个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> paraList = new List>();
      paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
      paraList.Add(new KeyValuePair("client_id", clientId));
      paraList.Add(new KeyValuePair("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; }
    /// 
    /// 注册人脸
    /// 
    /// 
    /// 
    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(result);
      return msg;
    }
    /// 
    /// 搜索人脸
    /// 
    /// 
    /// 
    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(result);
      return msg;
    }
    public void Dispose()
    {

    }
  }
}

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

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

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


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

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


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

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(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();
        }
      }
    }
  }
}

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


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

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

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

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(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调用百度接口实现人脸识别教程(附源码)的文章就介绍到这了,更多相关C#  百度接口人脸识别内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 基于深度学习的遥感应用
    文章目录深度学习的发展过程深度学习在遥感中的应用基于深度学习的遥感样例库建设基于深度学习的遥感影像目标及场景检索基于深度学习的建筑物提取基于深度学习的密集建筑物自动检测基于深度学习 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
author-avatar
fionafongkaian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有