python 基于opencv和face_recognition的人脸识别

python 基于opencv和face_recognition的人脸识别

代码如下:

使用一个photos存放你需要识别的照片,注意一个人一张就行
在这里插入图片描述

然后通过下面代码注册用户,之后启动程序,就会调用摄像头进行识别了。
AddPhoto(“发哥”, “./photos/fage.jpg”)
AddPhoto(“华仔”, “./photos/huazai.jpg”)

# 7人脸检测 和 8人脸识别:7只能检测到人脸,8还可以识别出是谁
import face_recognition
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFontknown_face_names = []
known_face_encodings = []def IsDuplicateName(name):if name in known_face_names:return Truereturn Falsedef AddPhoto(name, filename):image = face_recognition.load_image_file(filename)# 用 128 维的向量表示 1 张人脸face_encoding = face_recognition.face_encodings(image)if len(face_encoding) != 1:return Falseknown_face_encodings.insert(0, face_encoding[0])known_face_names.insert(0, name)return Truedef PutCNText(image, strs, local, sizes, colour):"""在 frame 中添加文字"""cv2img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)pilimg = Image.fromarray(cv2img)draw = ImageDraw.Draw(pilimg)font = ImageFont.truetype("./simhei.ttf", sizes, encoding="utf-8")draw.text(local, strs, colour, font=font)return cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)def FaceRecognition(frame):# 尺寸缩放为原来的 1/4,参数 (0, 0) 原意表示输出图像的大小# 当指定为 (0, 0) 时,输出图像的大小会根据 fx 和 fy 参数进行计算# 缩小图像 4 倍是为了加速人脸检测过程small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)# np.ascontiguousarray() 确保数组在内存中的存储是连续的rgb_small_frame = np.ascontiguousarray(small_frame[:, :, ::-1])# 得到检测到的人脸位置信息 face_locationsface_locations = face_recognition.face_locations(rgb_small_frame)# 对 rgb_small_frame 中人脸进行编码,得到人脸向量 face_encodings# 这个编码信息将用于后续的人脸比对和识别face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)face_names = []for face_encoding in face_encodings:matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.4)# known_face_encodings 为列表,相同人脸为 Truename = ""if True in matches:first_match_index = matches.index(True)name = known_face_names[first_match_index]else:name='未录入人员'face_names.append(name)for (top, right, bottom, left), name in zip(face_locations, face_names):top *= 4right *= 4bottom *= 4left *= 4if  name =='未录入人员':cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)frame = PutCNText(frame, name, (left + 6, bottom - 24), 20, (0, 255, 255))else:cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)frame = PutCNText(frame, name, (left + 6, bottom - 24), 20, (255, 255, 255))return frameif __name__ == "__main__":# 注册缓存 人名 和 人脸向量,用于后续人脸识别AddPhoto("发哥", "./photos/fage.jpg")AddPhoto("华仔", "./photos/huazai.jpg")video_capture = cv2.VideoCapture(0)# 设置视频帧的 宽度 和 高度# video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024) # 3# video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 768) # 4# video_capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc("M", "J", "P", "G"))while video_capture.isOpened():# 读取 1 帧视频图像ret, frame = video_capture.read()# print("frame.shape:", frame.shape)  # frame.shape = (720, 1280, 3) 就是一张图片# 如果读取失败,进入下一循环if ret == False:continueframe = FaceRecognition(frame)cv2.imshow("Face Recognition", frame)# 退出条件if cv2.waitKey(1) & 0xFF == ord("q"):break# 释放资源video_capture.release()cv2.destroyAllWindows()

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

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

相关文章

Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/4)

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…

面向对象的三大特征

目录 封装(Encapsulation): 继承(Inheritance): 多态(Polymorphism): 封装(Encapsulation): 定义: 封装是将对象的状态…

FreeRTOS入门教程(任务通知)

文章目录 前言一、什么是任务通知二、任务通知和队列,信号量的区别三、任务通知的优点和缺点1.优点2.缺点 四、任务状态和通知值五、任务通知相关的函数发出通知取出通知 六、任务通知具体使用1.实现轻量级信号量二进制信号量计数型信号量 2.实现轻量级队列 总结 前…

Shell脚本:Linux Shell脚本学习指南(第三部分Shell高级)二

七、Shell Here String&#xff08;内嵌字符串&#xff0c;嵌入式字符串&#xff09; Here String 是《六、Shell Here Document&#xff08;内嵌文档/立即文档&#xff09;》的一个变种&#xff0c;它的用法如下&#xff1a; command <<< string command 是 Shell 命…

TikTok 将开源“云中和”边缘加速器

“从某种意义上说&#xff0c;我们正在努力破解云的骨干网&#xff0c;以造福于我们&#xff0c;”TikTok产品管理基础设施经理Vikram Siwach指出&#xff0c;他解释了该公司即将开源的“全球服务加速器”的好处&#xff0c;这是一个可编程的边缘平台&#xff0c;可将应用程序需…

单片机学习1——点亮一个LED灯

Keil软件编写程序&#xff1a; 特殊功能寄存器声明&#xff1a; #include<reg52.h>sbit LED P1^0;void main() {LED 0;while(1); } 代码说明&#xff1a; sbit 语句是特殊功能位声明。 生成HEX文件&#xff0c;这个文件是下载到单片机里的文件。Options for Target…

机器学习---贝叶斯网络与朴素贝叶斯

1. 贝叶斯法则 如何判定一个人是好人还是坏人&#xff1f; 当你无法准确的熟悉一个事物的本质时&#xff0c;你可以依靠与事物特定本质相关的事件出现的次数来判断 其本质属性的概率。如果你看到一个人总是做一些好事&#xff0c;那这个人就越可能是一个好人。 数学语言表达…

微机课设--汇编语言在51单片机上写一个四位十进制加法器

代码如下 KEYVAL EQU 30HKEYTM EQU 31HKEYSCAN EQU 32HDAT EQU 33HSCANLED EQU 37HS_DAT EQU 38HD_DAT EQU 39HR_DATL EQU 3AHR_DATH EQU 3BH CALFLAG EQU 3CHFLAG BIT 00HORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#01HMOV TH0,#0D8HMOV TL0,…

win10+ vs2017用cmake编译geos3.5.1

参考教程&#xff1a;使用CMake编译Geos3.5.0_cmake geos-CSDN博客 注意事项&#xff1a; 报错&#xff1a;在使用cmake编译geos-3.5.1的时候&#xff0c;会出现报错&#xff1a; CMake Error at CMakeLists.txt:330 (include): include could not find load file GenerateSou…

makefile项目构建

makefile项目构建 OVERVIEW makefile项目构建1.概念2.make选项3.makefile语法&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;系统与自定变量&#xff08;3&#xff09;常用函数&#xff08;4&#xff09;模式匹配与伪目标 4.makefile编译流程&#xff08;1&#…

【模板】KMP算法笔记

练习链接&#xff1a;【模板】KMP - 洛谷 题目&#xff1a; 输入 ABABABC ABA 输出 1 3 0 0 1 思路&#xff1a; 根据题意&#xff0c;用到的是KMP算法&#xff0c;KMP算法思想是通过一个一个匹配首字母的原理进行整个匹配效果&#xff0c;当某个首字母不匹配的时候&#x…

哲学家就餐问题

文章目录&#xff1a; 问题描述及分析一次错误的尝试解决方案一解决方案二 问题描述及分析 哲学家就餐问题规定了有5位哲学家正在进行思考和就餐两种活动。用餐在一个桌子上进行&#xff0c;桌子上面有5个盘子和5个叉子&#xff0c;按照循环的方式分配。 问题的约束条件&#…