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

news/2024/5/16 6:02:31/文章来源:https://blog.csdn.net/weixin_42794881/article/details/127769652

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

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

一、实现流程

1.1、创建项目

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

在这里插入图片描述

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

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

1.2、设计页面

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

在这里插入图片描述

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

在这里插入图片描述

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");
}
  1. 获取电脑摄像头权限,没有摄像头的同学可以先通过图片上传模拟此效果。
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);}}
  1. 在窗体上拖拽进来一个pictureBox控件,用于展示我们上传或者摄像头捕捉到的人像,同时给它增加一个圆角边框的效果。这个控件的SizeMode属性需要设置为Zoom,图片自适应。

在这里插入图片描述

在这里插入图片描述

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

1.3、创建应用

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

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

  1. 填写表单所需要的各项信息创建应用。

在这里插入图片描述

  1. 创建完毕后回到应用列表,将API Key 以及Serect Key复制出来,后面我们需要通过这些凭证来获取Token。

在这里插入图片描述

在这里插入图片描述

1.4、获取Token及参数解析

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

        /// <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;}
  1. 根据获取Token的接口返回参数创建一个实体类进行接收,这个里面我们主要用到的就是access_token以及expires_in,一个是token值,一个就是过期时间了。

在这里插入图片描述

在这里插入图片描述

        /// <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; }}
  1. 拼接client_id 以及client_secret封装成一个方法,讲两个字段以参数的进行进行传递。

在这里插入图片描述

        /// <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;}
  1. 去控制器默认的Index动作方法里面调用获取token的方法,看下能否获取到。

在这里插入图片描述

        public ActionResult Index(){ViewBag.Title = "Home Page";TokenClass info = GetToken("你申请的应用Key", "你申请的应用的Sercet");return View();}
  1. 启动项目,打上断点,能够如下图获取到就可以。

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

  1. 根据数据结构定义三个实体类,分别是FaceClass、scoreInfo、face,其中face于scoreInfo是一对多的关系。这样就能直接使用返回的数据了。

在这里插入图片描述

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_223814.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

值得入手的键盘——Keychron K8 Pro

目录 一、前言 二、介绍 三、上手体验 四、总结 一、前言 在如今&#xff0c;外设产品市场相当火爆的时代&#xff0c;拥有诸多知名的品 牌&#xff0c;而一个新品牌要在竞争非常激烈的情况下站稳脚跟&#xff0c;实属不易。诞生于2017年的 Keychron 以其品质作为高端战略…

【mcuclub】舵机-SG90

一、实物图&#xff08;SG90&#xff09; 二、原理图 编号名称功能1GND电源地&#xff08;棕色线&#xff09;2VCC电源正&#xff08;红色线&#xff09;3I/O信号线&#xff08;黄色线&#xff09; 三、简介 舵机&#xff08;英文叫Servo&#xff09;&#xff0c;是伺服电机的…

WINDOWS核心编程--Windows程序内部运行机制

现代的桌面应用基本上很少使用原始的 Windows API 进行开发了&#xff0c;因为使用原始 API 堆砌出来的应用代码逻辑非常繁琐&#xff0c;特别是窗口消息的处理非常不方便&#xff0c;大多数直接使用 C# 或者 QT 这种跨平台的开发库&#xff0c;而那种直接封装 Windows API 而存…

C语言经典题目之青蛙跳台阶问题

目录 一、问题描述 二、问题分析 1.当n1时 2.当n2时 3.当n3时 4.n4&#xff0c;n5........nn时 三、代码实现 总结 一、问题描述 一只青蛙一次可以跳上 1 级台阶&#xff0c;也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。 二、问题分析 青蛙跳台阶&a…

Spring-Aop面向切面编程

文章目录一、简介1、作用2、AOP核心概念3、五种&#xff08;增强&#xff09;通知类型二、AOP入门小案例&#xff08;注解版&#xff09;1.导入坐标(pom.xml)2.制作连接点(原始操作&#xff0c;Dao接口与实现类)3:定义通知类和通知4:定义切入点5:制作切面6:将通知类配给容器并标…

【Linux】第十一章 进程信号(概念+产生信号+阻塞信号+捕捉信号)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

C++基本知识(二)---函数重载、引用、内联函数、auto关键字

目录 1.函数重载 2.引用 3.内联函数 4.auto关键字(C11) 5.指针空值nullptr(C11) 1.函数重载 重载函数是函数的一种特殊情况&#xff0c;为方便使用&#xff0c;C允许在同一范围中声明几个功能类似的同名函数&#xff0c;但是这些同名函数的形式参数&#xff08;指参数的个…

CEC2015:(二)动态多目标野狗优化算法DMODOA求解DIMP2、dMOP2、dMOP2iso、dMOP2dec(提供Matlab代码)

一、cec2015中测试函数DIMP2、dMOP2、dMOP2iso、dMOP2dec详细信息 CEC2015&#xff1a;动态多目标测试函数之DIMP2、dMOP2、dMOP2iso、dMOP2dec详细信息 二、动态多目标野狗优化算法 多目标野狗优化算法&#xff08;Multi-Objective Dingo Optimization Algorithm&#xff0…

瑞吉外卖强化(一):缓存优化

瑞吉外卖强化&#xff08;一&#xff09;&#xff1a;缓存优化瑞吉外卖 缓存优化Redis基本操作短信验证码 缓存实现缓存菜品数据SpringCache常用注解瑞吉外卖 缓存优化 Redis基本操作 redisTemplate需要配置类 这里的 需要对其进行 序列化操作 reidsTeplate.opsForValue().s…

论文精读:Swin Transformer V2: Scaling Up Capacity and Resolution

论文地址:https://arxiv.org/pdf/2111.09883.pdf 代码地址: GitHub - microsoft/Swin-Transformer: This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows". Abstract 本篇论文主要致力于解决大型…

TCP三次握手和四次挥手基本知识

一、概述 TCP是面向连接、可靠的、基于字节流的传输层通讯协议。 如何确定一个TCP连接&#xff1a; 目的IP目的端口源IP源端口 二、TCP建立连接 序列号client_isn和server_isn是随机初始化&#xff0c;可以通过netstat -napt来查看网络状态。 为什么建立连接需要三次握手&…

c++哈希(哈希表闭散列线性探测实现)

文章目录0. 前言1. 线性探测2. 线性探测的代码实现2.0 定义2.1 插入实现--Insert2.2 查找实现--Find2.3 删除实现--Erase2.4 仿函数3. 完整代码实现4. 代码测试并运行结果&#xff1a;0. 前言 闭散列&#xff1a;也叫开放定址法&#xff0c;当发生哈希冲突时&#xff0c;如果哈…

Python画爱心——谁能拒绝用代码敲出来会跳动的爱心呢~

还不快把这份浪漫拿走&#xff01;&#xff01;节日就快到来了&#xff0c;给Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧&#xff0c;利用Python制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心&#xff0c;从里到外形成一个立体状&#xff0c;给人视觉上的冲击…

年轻人不用太过于努力

周末和一个毕业一年多的朋友聊天&#xff0c;我随口问了一句「你有什么想跟我分享的」&#xff0c;然后他就说了上面的那句话。「年轻人不用太过于努力」和读者聊天会做成我的一个公众号专栏&#xff0c;内容有也会越来越丰富&#xff0c;全部的内容都会收录到我的程序人生专栏…

采购管理主要流程有哪些?

采购管理流程是很多企业用于获取物资或服务的一种关键步骤。采购管理流程对企业至关重要&#xff0c;因为它们可以对利润和支出产生会有直接的影响。 由于各个企业有不同的需求和目标&#xff0c;采购管理流程可能会有所不同。虽然与其采购流程相关的细节可能有所不同&#xf…

web前端课程设计——动漫网页2个网页HTML+CSS web前端开发技术 web课程设计 网页规划与设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

便宜又大碗!AI将画廊轻松搬到自家墙壁;用隐写术在图像中存储文件;免费书·算法高维鲁棒统计;关节式手部模型数据集;前沿论文 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f4c6;电子月刊 | &#x1f514;公众号下载资料 | &#x1f369;韩信子 &#x1f4e2; Mixtiles&#xff1a;将画廊搬到自家墙壁&#xff0c;“便宜又大碗”的艺术平替 https://www.mixtiles.com/ Mixtiles 是一家快速发展的照片创业公司&…

JavaScipt基础(持续更新三)

JavaScipt基础 JavaScipt基础 九、对象&#xff08;Object&#xff09; 9.1什么是对象 9.2JavaScript中的对象 9.3如何得到一个对象 9.4this的指向 9.5对象的使用 十、标准库对象&#xff08;内置对象&#xff09; 10.1Math对象 10.1.1常用属性和方法 10.1.2案例 1…

什么是蜂窝移动网络?

文章目录前言移动网络 vs WIFI蜂窝移动通信网产生过程蜂窝网络实现移动上网通信网架构总结前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 移动网络 vs WIFI 计网课外实验月&#xff0c;我走在宿舍一楼正数着AP有多少个&#xff…

F. Rats Rats(二分 or 预处理)[UTPC Contest 09-02-22 Div. 2 (Beginner)]

题面如下&#xff1a; 思路 or 题解 xkaix ^ k a_ixkai​ 我们可以去想办法去找到 最小的xxx 为什么去寻找xminx_{min}xmin​ 看样例&#xff1a; 52183521 8^352183 52129521 2^952129 一个数如果满足式子 xkaix ^ k a_ixkai​ 至少我们可以找到一个xxx 如果有多个xxx我们…