草庐IT

基于QT设计的人脸考勤打卡签到系统

DS小龙哥 2023-03-28 原文

1. 项目介绍

近几年,生物特征识别技术获得快速发展。人脸作为一种生物特征,具有很强的自身稳定性和个体差异性,是进行身份验证的最理想依据,主要方法包括步态识别、虹膜识别、皮肤芯片、脸像识别、多模态(即多生物特征融合)技术等。其中,人脸识别技术因为具有方便、直观、易于普及等优点尤为受到关注与研究。

文章针对当前常用考勤方式中普遍存在的代签到、考勤数据整合较慢等问题,利用华为云的人脸识别技术实现了一种基于QT框架设计的在线考勤系统。该系统可大大提高考勤效率,满足各类场环境景下的考勤需求,具有识别度高、检测速度快、操作简单的特点,能够为用户提供更多便利帮助。

实现大致流程:

  1. 注册华为云账号
  2. 开通华为云的人脸识别服务
  3. 通过API创建人脸库
  4. 将需要考勤识别的人脸,添加到人脸库
  5. 考勤时,调用本地摄像头获取人脸图像,与人脸库里注册的人脸进行对比,找到考勤人,完成考勤。
核心思路总结:

华为云人脸识别服务支持,人脸库创建,向人脸库添加人脸,在人脸库里搜索匹配的人脸,.......很多功能。当前

考勤系统主要用到这3个功能。

创建人脸库: 在创建人脸库的时候,支持创建自定义字段,也就是每个人脸可以加一些自定义的属性描述,但是不支持中文字符,如果是字符串字段,范围是0~255长度;

向人脸库添加人脸: 如果在创建人脸库的时候,注册了自定义字段,在添加人脸的时候就可以带上自定义字段的描述,除了添加自定义字段,也可以添加ID,这个ID关联数据库方便考勤的时候进行查找对比。

在人脸库搜索人脸: 可以取一张本地的图片与人脸库里存在的人脸进行匹配,得到相识度,在搜索人脸的时候也可以设置过滤条件,常见的条件就是相识度阀值,低于设置阀值就不返回,也可以设置自定义字段返回,如果注册人脸的时候添加了自定义属性,在识别到人脸的时候就可以通过返回的自定义属性判断这个人脸是谁。

考勤实现核心思路:

向人脸库添加人脸的时候,可以指定external_image_id字段,这个是代表图片外部ID,与当前图像绑定,这个字段可以存放在本地的数据库里,在考勤的时候,从当前摄像头取一帧图像与华为云人脸库里的图像进行对比,找到相识度最高的一张图片,然后这张图片的external_image_id字段,然后与数据库里的external_image_id字段匹配,就找到这个人的详细信息了(详细信息是存放到本地数据库里的),然后就可以实现考勤逻辑了。

软件最终的效果:

(1)主界面

(2)打开摄像头

如果视频里没有人脸,会有错误提示的。

(3)点击人脸注册,添加工号自定义属性

(4)点击人脸搜索:搜索到之后会把自定义的属性显示出来--工号

其他功能都不在演示了,详细实现看下面章节的代码流程。

项目源码下载地址: https://download.csdn.net/download/xiaolong1126626497/71245801

2. 创建人脸库

2.1 开通人脸识别服务

官网地址: https://console.huaweicloud.com/frs/?region=cn-north-4&locale=zh-cn#/frs/manage/index

如果没有华为云账号,打开上面地址时,需要先注册,如果有账号登录之后就可以看到下面的页面,鼠标移到最右边,开通对应的服务。

2.2 创建人脸库

官方帮助文档地址: https://support.huaweicloud.com/api-face/face_02_0088.html

2.3 AK/SK、ID、域名参数获取

在使用API访问接口时,需要填充很多的参数,endpointproject_id 等等。

关于这些API需要使用的签名参数介绍在这个页面里:https://support.huaweicloud.com/devg-apisign/api-sign-provide-start.html

Endpoint 是代表地区与终端节点,即云服务在不同Region有不同的访问域名。

查看地址: https://developer.huaweicloud.com/endpoint

打开链接之后,选择自己的服务,然后往下翻就可以看到对应服务的地址。

华北-北京四 cn-north-4 face.cn-north-4.myhuaweicloud.com HTTPS 获取AK/SK

  1. 打开控制台页面

  2. 将鼠标移至用户名,在下拉列表中单击“我的凭证”。

  3. 单击“访问密钥”。

  4. 单击“新增访问密钥”,进入“新增访问密钥”页面。

  5. 输入描述信息,单击“确定”,下载密钥,请妥善保管。

在API凭证页面可以看到项目ID:

2.4 在线调试接口

华为云提供了在调试API接口,非常方便,可以提前验证功能是否正常。

地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=FRS&api=CreateFaceSet

选择自己要调试的API,然后填充对应的参考,进行调试即可。

下面的例子是创建人脸库。

如果同一个人脸库创建两次,就会报错,可以在调试页面看到错误的提示,方便自己写代码时进行判断,处理。

如果不清楚访问的域名地址是多少,在调试接口页面是可以直接获取查看的。

创建人脸库的时候,还可以指定自定义字段,方便对这张人脸进行打个性化标签属性,方便知道这张脸是谁的。

请求头: { "User-Agent": "API Explorer", "X-Auth-Token": "******", "Content-Type": "application/json" } 请求体: { "external_fields": { "face_name": { "type": "string" }, "face_phone": { "type": "string" }, "face_class": { "type": "string" } }, "face_set_name": "face3" }

2.5 代码实现

/* 功能: 创建人脸库 */ void Widget::HuaweiCreatesFaceDatabase(QString face_lib_name) { //表示创建人脸库 function_select=2; QString requestUrl; QNetworkRequest request; //设置请求地址 QUrl url; //人脸注册的请求地址 requestUrl = QString("https://face.%1.myhuaweicloud.com/v2/%2/face-sets") .arg(SERVER_ID) .arg(PROJECT_ID); //自己创建的TCP服务器,测试用 //requestUrl="http://10.0.0.6:8080"; //设置数据提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); //设置token request.setRawHeader("X-Auth-Token",Token); //构造请求 url.setUrl(requestUrl); request.setUrl(url); //添加自定义字段 external_fields这个对象就是自定义字段 //我这里只是定义了3个字段,可以自己增加 //添加人脸的时候也需要添加这里设置的自定义字段 QString post_param=QString("{" "\"external_fields\": {" "\"face_name\": {" "\"type\": \"string\"" "}," "\"face_phone\": {" "\"type\": \"string\"" "}," "\"face_class\": {" "\"type\": \"string\"" "}" "}," "\"face_set_name\": \"%1\"" "}").arg(face_lib_name); //发送请求 manager->post(request, post_param.toUtf8()); }

3. 如何获取X-Subject-Token

使用API访问华为云的所有服务接口,都需要填X-Subject-Token参数,下面介绍步骤:

3.1 创建一个新的IAM帐户

鼠标悬停在右上角的用户名称上,弹出下拉框,选择统一身份认证。

3.2 选择创建用户

3.3 使用调试接口测试获取oken

调试接口地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=IAM&api=KeystoneCreateUserTokenByPassword

右边响应头里的X-Subject-Token就是获取的token。

3.4 上面的这些账户名称从哪里获取?

3.5 请求地址和数据格式

**获取X-Subject-Token请求的地址:**https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens

请求头数据:

{ "User-Agent": "API Explorer", "X-Auth-Token": "******", "Content-Type": "application/json;charset=UTF-8" } 请求体数据:

{ "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "xxxxx" //这里填当前主账户名称 }, "name": "xxxx", //这个新建的子账户名称 "password": "xxxxx" //这个是新建的子账户密码 } } }, "scope": { "project": { "name": "cn-north-4" } } } }

3.5 代码实现

/* 功能: 获取token */ void Widget::GetToken() { //表示获取token function_select=3; QString requestUrl; QNetworkRequest request; //设置请求地址 QUrl url; //获取token请求地址 requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens") .arg(SERVER_ID); //自己创建的TCP服务器,测试用 //requestUrl="http://10.0.0.6:8080"; //设置数据提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8")); //构造请求 url.setUrl(requestUrl); request.setUrl(url); QString text =QString("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":" "{\"user\":{\"domain\": {" "\"name\":\"%1\"},\"name\": \"%2\",\"password\": \"%3\"}}}," "\"scope\":{\"project\":{\"name\":\"%4\"}}}}") .arg(MAIN_USER) .arg(IAM_USER) .arg(IAM_PASSWORD) .arg(SERVER_ID); //发送请求 manager->post(request, text.toUtf8()); }

4. 向人脸库添加人脸

4.1 调试接口

官方地址: https://support.huaweicloud.com/api-face/face_02_0093.html

添加人脸调试接口地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=FRS&api=AddFacesByFile

4.2 请求接口与地址总结

请求地址: https://face.cn-north-4.myhuaweicloud.com/v2/项目ID/face-sets/人脸库名称/faces 请求方式: post 请求头: { "User-Agent": "API Explorer", "X-Auth-Token": "******", //替换成自己的token "Content-Type": "application/json" } 请求体: { "image_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAk..........." }

4.3 查询人脸

文档地址: https://support.huaweicloud.com/api-face/face_02_0094.html

调试地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=FRS&api=ShowFaceSet

4.4 代码实现: 添加人脸时增加自定义字段

//注册人脸,添加人脸,添加自定义数据 //QString name 这个是自定义字段,0~255 字节,只能英文字母和数字 void Widget::RegFace2(const QImage image,QString face_lib,QString name) { function_select=0; QString requestUrl; QNetworkRequest request; //存放图片BASE64编码 QString imgData; //设置请求地址 QUrl url; //人脸注册的请求地址 requestUrl = QString("https://face.%1.myhuaweicloud.com/v2/%2/face-sets/%3/faces") .arg(SERVER_ID) .arg(PROJECT_ID) .arg(face_lib); qDebug()<<"requestUrl:"<<requestUrl; // requestUrl="http://192.168.1.100:8080"; //设置数据提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); //将图片进行Base64编码 imgData = QString(toBase64(image)); //编码后的图片大小不超过2M //设置token request.setRawHeader("X-Auth-Token",Token); //构造请求 url.setUrl(requestUrl); request.setUrl(url); QString post_param=QString ("{" "\"image_base64\": \"%1\"," "\"external_fields\":{\"face_name\":\"%2\"}," "\"single\": true" "}").arg(imgData).arg(name); //发送请求 manager->post(request, post_param.toUtf8()); }

5. 从人脸库搜索匹配的人脸

5.1 参数介绍

官方文档地址: https://support.huaweicloud.com/api-face/face_02_0086.html

5.2 调试接口

接口地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=FRS&api=SearchFaceByFile

我这里调试接口里选择本地指定文件与人脸库的人脸进行匹配,返回相识度。

返回的结果:

{ "faces": [ { "face_id": "6ED4NSsS", "external_image_id": "FPhviHgr", "bounding_box": { "width": 197, "top_left_x": 201, "top_left_y": 80, "height": 241 }, "similarity": 1 }, { "face_id": "EpBvdmp5", "external_image_id": "ubxcVUpN", "bounding_box": { "width": 104, "top_left_x": 111, "top_left_y": 100, "height": 123 }, "similarity": 0.9802261 }, { "face_id": "cSKntQmF", "external_image_id": "nBoRpVab", "bounding_box": { "width": 113, "top_left_x": 65, "top_left_y": 106, "height": 127 }, "similarity": 0.97810614 }, { "face_id": "TZGv2cKI", "external_image_id": "49y0pLG9", "bounding_box": { "width": 104, "top_left_x": 90, "top_left_y": 97, "height": 125 }, "similarity": 0.9768342 }, { "face_id": "3p1Ho8Vw", "external_image_id": "vpuYDUvU", "bounding_box": { "width": 108, "top_left_x": 100, "top_left_y": 108, "height": 122 }, "similarity": 0.9619592 }, { "face_id": "nIuMJ1fA", "external_image_id": "v8mNyJSY", "bounding_box": { "width": 102, "top_left_x": 58, "top_left_y": 141, "height": 98 }, "similarity": 0.95380914 }, { "face_id": "IamCTWR9", "external_image_id": "KzUyJDxU", "bounding_box": { "width": 108, "top_left_x": 32, "top_left_y": 142, "height": 97 }, "similarity": 0.5663861 } ] }

5.3 接口总结

这是总结的bas64编码的接口,方便编写代码进行搜索人脸。

请求地址: https://face.cn-north-4.myhuaweicloud.com/v2/项目ID/face-sets/人脸库名称/search 请求方式: POST 请求头: { "User-Agent": "API Explorer", "X-Auth-Token": "******", 自己的token "Content-Type": "application/json" } 请求体: { "image_base64": "..........................................." 图片BAS64编码后的数据 }

5.4 代码实现

//人脸搜索功能 // threshold参数表示人脸相似度阈值,低于这个阈值则不返回,取值范围0~1,一般情况下建议取值0.93,默认为0。 void Widget::FindFace(const QImage image,QString face_lib,double threshold) { function_select=1; QString requestUrl; QNetworkRequest request; //存放图片BASE64编码 QString imgData; //设置请求地址 QUrl url; //人脸搜索请求地址 requestUrl = QString("https://face.%1.myhuaweicloud.com/v2/%2/face-sets/%3/search") .arg(SERVER_ID) .arg(PROJECT_ID) .arg(face_lib); //设置数据提交格式 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); //将图片进行Base64编码 imgData = QString(toBase64(image)); //编码后的图片大小不超过2M //设置token request.setRawHeader("X-Auth-Token",Token); //构造请求 url.setUrl(requestUrl); request.setUrl(url); QString post_param=QString ("{" "\"image_base64\": \"%1\"," "\"return_fields\":[\"face_name\"]," //需要返回的自定义字段 "\"threshold\":%2" "}").arg(imgData).arg(threshold); //发送请求 manager->post(request, post_param.toUtf8()); }

6. 删除人脸库

文档地址: https://support.huaweicloud.com/api-face/face_02_0091.html

调试地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=FRS&api=DeleteFaceSet

总结:

请求接口: https://face.cn-north-4.myhuaweicloud.com/v2/项目ID/face-sets/人脸库名称

有关基于QT设计的人脸考勤打卡签到系统的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. Qt Designer的简单使用 - 2

    在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

随机推荐