C#项目实战|人脸识别考勤

2025-12-13 0 113

此文主要通过WinForm来制作的一个人脸识别考勤打卡程序,有兴趣的小伙伴可以接入到打卡机上。

C#项目实战|人脸识别考勤

    • 一、实现流程
      • 1.1、创建项目
      • 1.2、设计页面
      • 1.3、创建应用
      • 1.4、获取Token及参数解析
      • 1.5、与人脸数据比对并展示

一、实现流程

1.1、创建项目

  1. 打开Visual Studio,右侧选择创建新项目。

C#项目实战|人脸识别考勤

  1. 搜索框输入winform,选择windows窗体应用,填写对应的保存路径点击下一步,创建成功后如下图。

C#项目实战|人脸识别考勤
C#项目实战|人脸识别考勤

1.2、设计页面

1.Form1就是我们需要操作的窗体了,根据自己的想法给窗体设置对应的背景颜色。

C#项目实战|人脸识别考勤

2.在页面增加timer1控件,在Form1_Load事件中执行start,达到一个获取当前年月日时分秒的效果。

C#项目实战|人脸识别考勤

private void Form1_Load(object sender, EventArgs e)
{
  this.timer1.Start();
}
private void timer1_Tick_1(object sender, EventArgs e)
{
  this.label1.Text = System.DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\");
}

	

3.获取电脑摄像头权限,没有摄像头的同学可以先通过图片上传模拟此效果。
private void btnBase_Click(object sender, EventArgs e)
{
  if (openFileDialog1.ShowDialog() == DialogResult.OK)
  {
    Image fromImage = Image.FromFile(this.openFileDialog1.FileName);
    baseFileName = this.openFileDialog1.FileName;
    fromImage = fromImage.AdjImageToFitSize(pbMatch.Width, pbMatch.Height); //350 l;
    this.pbBase.Image = fromImage;
    string[] names = baseFileName.Split(\'\\\\\');
    baseShortName = names[names.Length - 1];
    baseBM = Resize(baseFileName, tempFilePath + \"base_\" + baseShortName);
  }
}

	

4.在窗体上拖拽进来一个pictureBox控件,用于展示我们上传或者摄像头捕捉到的人像,同时给它增加一个圆角边框的效果。这个控件的SizeMode属性需要设置为Zoom,图片自适应。

C#项目实战|人脸识别考勤

C#项目实战|人脸识别考勤

GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(pictureBox1.ClientRectangle);
Region region = new Region(gp);
pictureBox1.Region = region;//赋值
gp.Dispose();//释放资源
region.Dispose();//释放资源

	

1.3、创建应用

  1. 访问开放平台选择人脸识别并领取免费资源。

C#项目实战|人脸识别考勤
C#项目实战|人脸识别考勤2.填写表单所需要的各项信息创建应用。

C#项目实战|人脸识别考勤3.创建完毕后回到应用列表,将API Key 以及Serect Key复制出来,后面我们需要通过这些凭证来获取Token。

C#项目实战|人脸识别考勤

C#项目实战|人脸识别考勤

1.4、获取Token及参数解析

  1. 如何获取Access Token。可以看到如下图,获取Token就是向授权服务地址发送请求,并在URL中带上所需的参数,那两个参数就是创建应用的时候已经复制出来的,在这里就能派上用场了。

C#项目实战|人脸识别考勤

  1. 回到VS,选择右侧解决方案Models文件夹,点击添加,选择类。

C#项目实战|人脸识别考勤

  1. 我们现在需要通过封装一个方法,用于向服务授权地址请求。

C#项目实战|人脸识别考勤

    /// <summary>
    /// 模拟Get请求
    /// </summary>
    /// <param name=\"url\"></param>
    /// <returns></returns>
    public static string HttpGet(string url)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
      request.Method = \"GET\";
      request.ContentType = \"application/json\";
      request.Accept = \"*/*\";
      request.Timeout = 15000;
      request.AllowAutoRedirect = false;
      WebResponse response = null;
      string responseStr = null;
      try
      {
        response = request.GetResponse();
        if (response != null)
        {
          StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
          responseStr = reader.ReadToEnd();
          reader.Close();
        }
      }
      catch (Exception)
      {
        throw;
      }
      finally
      {
        request = null;
        response = null;
      }
      return responseStr;
    }

	

4.根据获取Token的接口返回参数创建一个实体类进行接收,这个里面我们主要用到的就是access_token以及expires_in,一个是token值,一个就是过期时间了。

C#项目实战|人脸识别考勤

C#项目实战|人脸识别考勤

    /// <summary>
    /// 解析Token帮助类
    /// </summary>
    public class TokenClass {
      public string refresh_token { get; set; }
      public string session_key { get; set; }
      public string scope { get; set; }
      public string session_secret { get; set; }

      /// <summary>
      /// Access Token的有效期(秒为单位,有效期30天);
      /// </summary>
      public int expires_in { get; set; }

      /// <summary>
      /// 获取的Access Token
      /// </summary>
      public string access_token { get; set; }
    }

	

5.拼接client_id 以及client_secret封装成一个方法,讲两个字段以参数的进行进行传递。

C#项目实战|人脸识别考勤

    /// <summary>
    /// 获取token
    /// </summary>
    /// <returns></returns>
    public static TokenClass GetToken(string client_id,string client_secret) {
      var grant_type = \"client_credentials\";
      //拼接参数到地址
      string tokenUrl = \"https://aip.baidubce.com/oauth/2.0/token?grant_type=\" + grant_type + \"&client_id=\" + client_id + \"&client_secret=\" + client_secret;
      string resultStr = RequestHelper.HttpGet(tokenUrl);
      if (string.IsNullOrWhiteSpace(resultStr))
      {
        //返回false
      }
      TokenClass info = Newtonsoft.Json.JsonConvert.DeserializeObject<TokenClass>(resultStr);
      return info;
    }

	

6.去控制器默认的Index动作方法里面调用获取token的方法,看下能否获取到。

C#项目实战|人脸识别考勤

    public ActionResult Index()
    {
      ViewBag.Title = \"Home Page\";
      TokenClass info = GetToken(\"你申请的应用Key\", \"你申请的应用的Sercet\");
      return View();
    }

	

7.启动项目,打上断点,能够如下图获取到就可以。

C#项目实战|人脸识别考勤
C#项目实战|人脸识别考勤

1.5、与人脸数据比对并展示

  1. 能够正常的获取到token后,从人脸库或者数据库中进行比对。

C#项目实战|人脸识别考勤
C#项目实战|人脸识别考勤

2.回到VS的RequestHelper这个实体类,定义一个方法用来获取人脸识别匹配的结果。

C#项目实战|人脸识别考勤3.将方法绑定到摄像头捕捉到人像的事件中,启动项目,如下图所示就是请求人脸识别接口所返回的数据。

C#项目实战|人脸识别考勤

C#项目实战|人脸识别考勤4.将数据复制出来,进行JSON转义,然后根据字段的数据类型定义对应的实体类来将接口返回的内容进行转换接收。如下图所示,我们这里主要用到的就是result字段里面的score值,也就是人脸相似度得分。

C#项目实战|人脸识别考勤5.根据数据结构定义三个实体类,分别是FaceClass、scoreInfo、face,其中face于scoreInfo是一对多的关系。这样就能直接使用返回的数据了。

C#项目实战|人脸识别考勤

    /// <summary>
    /// 人脸识别返回参数帮助类
    /// </summary>
    public class FaceClass {
      public int error_code { get; set; }
      public string error_msg { get; set; }
      public Int64 log_id { get; set; }
      public int timestamp { get; set; }
      public int cached { get; set; }
      public scoreInfo result { get; set; }
    }
    public class scoreInfo
    {
      /// <summary>
      /// 分数
      /// </summary>
      public decimal score { get; set; }
      public List<face> face_list { get; set; }
    }
    public class face {
      public string face_token { get; set; }
    }

	

6.将比对结果以及用户信息在窗体上通过lable控件进行展示,也可以加上一些加载中的动画,优化体验。有兴趣的小伙伴可以针对具体的业务进行调整。

C#项目实战|人脸识别考勤

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 C#项目实战|人脸识别考勤 https://www.zuozi.net/36155.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务