Python实现基于openCV+百度智能云平台实现《1:N人脸考勤机》文章最后附带源码!
目录
一、 项目介绍
1.1 项目名称
1.2 项目简介
1.3 项目物料
1.4 技术栈
二、 项目架构
三、项目细节
3.1 环境搭建
3.2 利用opencv实现摄像头调取及相关图像的采集
3.3 利用aips上传图像和结果返回
3.4 结果优化和处理
3.5 可扩展性
3.6 遗留问题和解释
四、声明
一、项目介绍
1.1 项目名称
《1:N人脸考勤机》
1.2 项目简介
基于windows平台下,使用PyCharmIDE完成开发工作,将提前准备好的照片上传百度云,借助百度aipSDK-Python实现和百度智能云的对接,实现摄像头采集人脸图片后上传百度云,在百度云中利用百度现有的人脸识别算法完成人脸的对比,之后借助SDK返回对比结果,将结果显示在客户端上。
1.3 项目物料
-
- 平台:windows
- 开发平台:PyCharm + Anaconda3(选装)
- 开发包:openCV2.4.9(Python)、aips(百度智能云人脸检测的SDK)
- 编程语言:Python
- 其他:识别对象的免冠正面照
1.4 技术栈
-
- 网络通信基本知识
- Python编程语言
- 百度智能云SDK(search函数等)
- OpenCV基于Python的接口的使用
1.5项目架构
上传百度云识别者照片--->图像采集--->图像处理--->上传百度云--->百度云对比--->返回对比结果--->结果处理--->显示结果。
三、项目细节
3.1 环境搭建
(1)安装PyCharm
1)安装
百度安全验证
- 创建人脸识别项目及配置
pycharm怎么创建新项目-百度经验
(2)安装百度智能云人脸检测的SDK(Python)
1)接口的下载和安装
人脸识别_人脸检测_人脸对比_人脸搜索_活体检测_百度智能云
(3)创建百度智能云应用
1)选择百度云对应功能和免费权限
A、手机应用市场安装“百度”app,注册一个账号,登陆
B、利用百度app扫码登陆以下网址中的账户:
人脸识别私有化部署包_支持百万级超大型人脸库-百度AI开放平台
登陆成功后会返回图一,点击“立即申请”进入以下界面。
- 创建应用
注意:如果之前安装SDK失败了,这里可以选择直接下载SDK即可,选择其中的“Python Http SDK”即可。
- 创建组
这个就是上边创建的应用。我们开始创建组。
点击确认
点击画圈的地方(组名)
这就是创建组内用户的菜单,点击任何一个方框都可以。
- 上传识别的对比资源
创建组和组用户均完成,到时候百度云会自动找到要求的组,在组中对比符合要求的用户,反馈结果。
- 获取应用的账号和密码
将其中的内容(AK和SK)复制出来保存好(保存在一个文本文档内即可,文档一定要保留好)
关于opencv如何下载,作者在这里作为伏笔,大家自行尝试,有问题试着解决一下哦。解决不了记得评论哦。
3.2 利用opencv实现摄像头调取及相关图像的处理
其中有详细的注释,请仔细阅读,如果有不明白的地方,评论区留言,作者一一回复。
3.3 利用aips上传图像和结果返回
图片为多张,注意通过行号来看,避免少看代码
3.4 结果优化和处理
在屏幕显示结果:
在上边的92行位置加入如下代码:
注意通过行号来判断对齐缩进的位置,避免代码从属问题。
3.5 效果展示
3.6 遗留问题和解释
如遇闪退,可以优化,可以找找看是什么问题。由于账号隐私问题,隐藏APP_ID\AK\SK三个参数。
源码:
# coding: utf-8
# author: alex_chenimport cv2 as cv
from aip import AipFace # 创建百度智能云客户端client
from aip.face import base64 # 调取图片格式转换工具
import timedef main():cap = cv.VideoCapture()cap.open(0) # 打开摄像头# 登陆百度智能云:APP_ID = 'xxxxxxxx'API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'# 创建自已百度云应用的客户端,账号密码确定接入的是百度云的“人脸考勤”应用client = AipFace(APP_ID, API_KEY, SECRET_KEY)# 创建haar分类器:cf = cv.CascadeClassifier(r"D:\anaconda3\envs\ml_dl\Lib\site-packages\haarcascades\haarcascade_frontalface_alt2.xml")while cap.isOpened():flag, frame = cap.read() # 获取摄像头截取到的图片img = frame # 保留彩色原图frame <class 'numpy.ndarray'>gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 灰度处理# cv.equalizeHist(gray_img,gray_img) # 直方图均衡化:这个可以不要,处理效果更好# 寻找特征(人脸)矩阵:allFaceRect = cf.detectMultiScale(gray_img,) #得到的视频中出现的所有的人脸,并且保存在numpy.ndarray中(矩形向量组)# print(type(allFaceRect[0])) # 图片中的第一张人脸# <class 'numpy.ndarray'> 没有脸的时候,返回()# 矩形跟随人脸样本来绘图:if allFaceRect is not ():x,y,w,h = allFaceRect[0] # 第一张人脸标识出来cv.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 255))# for x, y, w, h in allFaceRect: # 标识出所有人脸# cv.rectangle(gray_img, (x, y), (x + w, y + h), (255, 255, 255)) # 在每张图片中找到人脸并标注正方形# 至此,找到了人脸,将人脸存放在一个容器face_img当中:face_img = gray_img[y:y+w,x:x+h] # 将第一张人脸保存下来check_result,img_encode = cv.imencode(".jpg", face_img) # 将找到的人脸进行编码存入缓存img_encode中。# print(type(img_encode),img_encode) # 查看在内存中的图片的数据类型。# 测试缓存中是否保存成功了:# res = cv.imdecode(img_encode,1)# cv.imshow("demo",res)# 人脸搜索# 1、将缓存区的图片img_encode转换为base64格式且返回处理后的图片:base64img_send_to_aiServer = base64.b64encode(img_encode)# 2、调用search()# 注意:search()函数的第一个参数是字符串!需要把base64的字节序转换成字符串res = client.search(bytes.decode(base64img_send_to_aiServer), "BASE64", "Teacher")# print(res,type(res)) # 得到处理的结果 # 返回的是一个字典类型。# 带参options:client.search(image, imageType, groupIdList, options) ----不用# imageType参数的值:# 图片类型 BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;---选择这个,将图片进行base64编码# URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);# FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个# groupIdList参数: 人脸分组的序号,通过序号选择对应的组,如果要在多个组之间选择,则用逗号分隔序号# res_json:返回的是找到的人脸的相关信息(结果),格式json:# {# "face_token": "fid",# "user_list": [ 返回的所有找到的用户的列表# {# "group_id": "test1",# "user_id": "u333333",# "user_info": "Test User",# "score": 99.3 人脸匹配度(低于80即搜索失败)# } 每个用户都有这四个数据,多个user用逗号分隔# ]# }'''{'error_code': 0, 'error_msg': 'SUCCESS', 'log_id': 2253051395, 'timestamp': 1667464653,'cached': 0, 'result': {'face_token': '551d377ffeb0d24fed5b9dc07885203c', 'user_list': [{'group_id': 'Teacher','user_id': 'ChenBingXu','user_info': '', 'score': 97.605316162109}]}}'''if 'result' in res.keys():print(res['result'])name = res['result']['user_list'][0]['user_id'] #从数据中拿到返回的人脸匹配的姓名namecurrent_time = time.strftime("%Y.%m.%d %H:%M:%S",time.localtime(time.time())) # 获取系统时间print(name,current_time)cv.putText(frame,str(name)+" "+str(current_time),(0,50),cv.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 255), 2)# 显示灰度图cv.imshow("demo", frame)key_pressed = cv.waitKey(5)# 按ESC退出:if key_pressed == 27:break# 关闭摄像头:cap.release()# 关闭窗口:cv.destroyAllWindows()if __name__ == '__main__':main() # 调用主函数
# print(cv.__file__) # 打印库位置,将haarcascade训练器样板导入
四、声明
仅供教学和个人学习爱好者作为基础入门材料使用,项目中内容不涉及任何企业及个人保密成分,不可用于商业用途,特此声明!如有盗版等问题必追究其法律责任,严禁抄袭剽窃等行为。
相关文章:
Python实现基于openCV+百度智能云平台实现《1:N人脸考勤机》文章最后附带源码!
目录 一、 项目介绍 1.1 项目名称 1.2 项目简介 1.3 项目物料 1.4 技术栈 二、 项目架构 三、项目细节 3.1 环境搭建 3.2 利用opencv实现摄像头调取及相关图像的采集 3.3 利用aips上传图像和结果返回 3.4 结果优化和处理 3.5 可扩展性 3.6 遗留问题和…...
因为锁的问题,我们被扣了1万
前言 春节放假期间,一个项目上的积分接口被刷,而且不止一个人在刷,并且东西也被兑走,放假晚上被人叫起来排查问题,通过这个人的积分明细观察,基本一秒就能获取一次,远远超过了积分规则限定的次…...
【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)
【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录…...
浏览器渲染中的相关概念
渲染 渲染流水线 构建 DOM 树 输入:HTML 文档;处理:HTML 解析器解析;输出:DOM 数据解构。 样式计算 输入:CSS 文本;处理:属性值标准化,每个节点具体样式(…...
【MySQL】数据类型
1、数据类型描述 类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT枚举类…...
L2-037 包装机
一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品&#x…...
MySQL -查询日志、二进制日志、错误日志、慢查询日志
文章目录1.错误日志2.二进制日志3.查询日志4.慢查询日志1.错误日志 错误日志是 MySOL中最重要的日志之一,它记录了当 mvsald 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时,建议…...
TCP实现可靠传输的实现
TCP实现可靠传输的实现 目录TCP实现可靠传输的实现ARQ协议停止等待协议(古老)连续ARQ协议累计重传(回退N帧的ARQ协议)缓存确认(选择重传ARQ协议)超时重传的时间选择TCP的流量控制零窗口探测报文段Nagle算法…...
2/14考试总结
时间安排 7:30–7:50 看题,T1可能是个数据结构之类的东西,T2是 dp ,T3 构造。 7:50–8:20 T3,仿照样例的构造,可以通过一部分测试点。 8:20–9:20 T1,发现题目实际上要求子树内各儿子的深度信息,可以 dsu ,对于不能暴…...
程序环境和预处理详解
文章目录一、程序环境1.1 - 翻译环境1.1.1 - 编译1.1.1.1 - 预编译(预处理)1.1.1.2 - 编译1.1.1.3 - 汇编1.1.2 - 链接1.2 - 执行环境二、预处理详解2.1 - 预定义符号2.2 - #define2.2.1 - #define 定义标识符2.2.1.1 - 语法2.2.1.2 - 建议2.2.2 - #defi…...
The Social-Engineer Toolkit(社会工程学工具包)互联网第一篇全模块讲解
一、工具介绍 Social-Engineer Toolkit 是一个专为社会工程设计的开源渗透测试框架,可以帮助或辅助你完成二维码攻击、可插拔介质攻击、鱼叉攻击和水坑攻击等。SET 本身提供了大量攻击选项,可让您快速进行信任型攻击,也是一款高度自定义工具…...
Windows11去掉不满足系统要求的提示水印
我的电脑是LEGION的拯救者R70002021,预装的是Windows 11 家庭中文版,没有折腾重装过系统,今天突然注意到右下角出现了这个提示:“不满足系统要求。转到’设置"了解详细信息”。 在进入设置 - 系统 面板中也提示不满足系统要…...
JavaScript 计时事件
JavaScript 计时事件 通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。 在 JavaScript 中使用计时事件是很容易的,两个关键方法是: setInterval() - 间隔指定的…...
七大排序算法的多语言代码实现
文章目录 前言 一、排序算法 1.原理简述 2.分类与复杂度 二、实例代码 1.冒泡排序 C Python Java Golang Rust Dephi 2.选择排序 C Python Java Golang Rust Dephi 3.插入排序 C Python Java Golang Rust Dephi 4.希尔排序 编辑 C Python Java Gola…...
【基础算法】表达式计算
中缀表达式:我们平常见到的正常数学式子 后缀表达式:12-3* 后缀表达式对于计算机很容易计算,只需要从头部扫描字符串。然后遇到数字就入栈,遇到运算符就取出栈顶的两个数进行运算。最后把运算结果入栈,最后栈中就会剩一个数为答…...
动态规划问题
目录 一、动态规划简介 二、利用动态规划解决问题 1、斐波拉契序列 2、拆分词句 3、三角形最小路径和 4、不同的路径数目(一) 5、带权值的最小路径和 6、求路径ii 7、01背包 8、不同子序列 9、编辑距离 10、分割回文串 一、动态规划…...
【MySQL进阶】 存储引擎 索引
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…...
5 款最好的免费 SSD 数据恢复软件
SSD(固态硬盘)提供比传统硬盘更快的读/写速度,使启动、软件加载和游戏启动更快。因此,在我们选择存储设备时,它是一个极好的选择。但是,它仍然存在数据丢失的风险。假设您是受害者之一,正在寻找…...
MyBatis案例 | 使用映射配置文件实现CRUD操作——删除数据
本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址:🔥JavaWeb Java入门篇: 🔥Java基础学习篇 Java进阶学习篇&…...
CSDN 编程竞赛二十八期题解
竞赛总览 CSDN 编程竞赛二十八期:比赛详情 (csdn.net) 本期竞赛的题目都很简单,但是非常考验读题和编码速度。这一次没有遇到bug,竞赛体验较好。 竞赛题解 题目1、小Q的鲜榨柠檬汁 团建活动是大家所想要的。小Q给大家准备了鲜橙汁。现在…...
DML数据操纵语言
DML数据操纵语言 目录概述一、插入语句(一)方式一(二)方式二:(三)两种方式的比较二、修改语句三、删除语句概述方式一:delete方式二:truncate语句 【清空语句】delete VS truncate 【面试题!!!】概述 数据…...
【Hello Linux】Linux工具介绍 (gcc/g++ gdb)
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具gcc/g 以及gbd Linux工具介绍gcc / ggcc / g的作用为什么语言要经过这四步才能变为可执行指令gcc / g语法预处理编…...
TeamFiltration:一款针对O365 AAD账号安全的测试框架
关于TeamFiltration TeamFiltration是一款针对O365 AAD账号安全的跨平台安全测试框架,在该工具的帮助下,广大研究人员可以轻松对O365 AAD账号进行枚举、喷射、过滤和后门植入等操作。TeamFiltering与CrackMapExec非常相似,它可以创建并维护一…...
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧😎前言🙌1. 什么是bug?🙌2. 调试是什么?有多重要?🙌2.1 调试是什么?2.2 调试的基本步骤…...
数据结构与算法:7种必须会的排序以及3种非基于比较排序
1.什么是排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序…...
数据库用户数
Oracle的用户数 oracle软件内部并没对用户数做限制,买5个用户数,指你买了5个user licences,从法律上只能连5个session,超过5个的连接都是非法的。oracle不给你技术上的限制,可是给你法律上的限制。 一般来讲…...
nginx如何用html显示多个图片并加入播放链接
需求背景通过nginx来做个点播服务,ffmpeg截取视频中的某一帧作为视频的封面,前端页面展示这个封面,,并链接到对应的视频播放链接,加载播放器进行播放简单介绍一下ffmpeg截取视频中的某一帧的方式截取视频的第一帧&…...
【蓝桥杯集训·每日一题】Acwing 3729. 改变数组元素
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴一维差分区间合并一、题目 1、原题链接 3729. 改变数组元素 2、题目描述 给定一个空数组 V 和一个整数数组 a1,a2,…,an。 现在要对数组 V 进行 n 次操作。 第 i 次操作的…...
springmvc执行流程
文章目录前言一、springMVC请求执行流程二、组件说明以下组件通常使用框架提供实现:总结前言 本篇文章是对springmvc的补充 接上篇文章springmvc入门https://blog.csdn.net/l_zl2021/article/details/127120873 一、springMVC请求执行流程 1.用户发送请求至前端控制…...
SpringMVC(2)
一)接受到JSON格式的数据:使用RequestBody来进行接收 ResponseBody表示的是返回一个非页面的数据 RequestBody表示的是后端要接受JSON格式的数据 一)接收单个格式的JSON格式的数据,我们使用一个对象来进行接收 1)我们之前接受GET请求中的queryString中的参数的时候&…...
代理注册公司怎么找/百度推广seo自学
1、下载解压 http://maxwells-daemon.io/quickstart/ 2、修改MySQL服务器配置 $ vi my.cnf[mysqld] server_id1 log-binmaster binlog_formatrow3、创建账号给maxwell使用 mysql> CREATE USER maxwell% IDENTIFIED BY 123456; mysql> GRANT ALL ON maxwell.* TO maxwe…...
北极寒流wordpress/百度提问登录入口
当前位置:我的异常网 数据库 oracle-15树形查询oracle-15树形查询www.myexceptions.net 网友分享于:2013-06-13 浏览:0次oracle--15树形查询Oracle查询树形结构oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,…...
做网站上是外部连接怎么改/qq群排名优化
docker容器中的环境变量 docker可以为容器配置环境变量。配置的途径有两种: 在制作镜像时,通过ENV命令为镜像增加环境变量。在容器启动时使用该环境变量。在容器启动时候,通过参数配置环境变量,如果与镜像中有重复的环境变量&…...
wordpress 在线游戏网站/seo搜索引擎优化就业指导
模板介绍 一份高质量的PPT模板,可以让你在日常的工作中展示自我、脱颖而出、去赢得更多机会,今天小编分享一份精美的个人简历自我介绍求职PPT模板 PPT模板名称:个人简历自我介绍求职PPT模板,模板编号:P12856…...
学校网站建设作用/衡阳网站建设
前言 自定义 View 时Android 开发中的一个热点知识,我们结合源码了解绘制 View 的必备知识。 流程 measure 测量layout 位置draw 绘制 measure 测量 view 大小的测量是在 onMeasure 中实现的,测量过程用到了MeasureSpac,MeasureSpec是一…...
成都制作网站公司/seo网站优化工具大全
身份证中第十八位数字的计算方法为:1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7. 9 .10 .5. 8. 4. 2. 1. 6. 3. 7. 9. 10. 5. 8. 4. 2.2. 将这17位数字和系数相乘的结果相加。3. 用加出来和除以11,看余…...