超详细!Opencv人脸识别!附源码!

一、新建环境

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

注意!!确定后需要关闭项目,重新打开,终端的环境才会变化!!

在这里插入图片描述

二、下载安装包(只需要3个即可)

1. 下载dlib包

pip install dlib-19.19.0-cp38-cp38-win_amd64.whl.whl   

这里我使用编译好的包文件。
在这里插入图片描述
在这里插入图片描述

2.下载face_recognition包

pip install face_recognition -i https://pypi.tuna.tsinghua.edu.cn/simple

3.安装opencv

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple  

三、源码

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/long.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.mzph.cn/news/186126.shtml

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

相关文章

GoLang语言Map用法

目录 Map 的内部结构 Map 的操作 1. 创建和初始化 2. 添加键值对 3. 获取值 4. 删除键值对 5. 遍历 map 6. 检查键是否存在 注意事项 在Go语言中,map 是一种无序的键值对集合,其中每个键必须是唯一的。以下是关于 map 内部结构和操作的详细解释…

Linux 如何在文件中查找指定内容,grep的用法

Linux 如何在文件中查找指定内容 1、 如我们 查找 log_file_catalina.out 文件中,包含 ‘总数:900’ 的字符内容 2、 在日志中查看 83910_law_21CFBC7EB25B1FF60255FE7F4BE1BCCF1CE726F6_0.bdyhf 的相关内容 grep 83910_law_21CFBC7EB25B1FF60255FE7…

互联网协议入门( 通俗易懂的网络协议层次结构讲解)

转载:互联网协议入门( 通俗易懂的网络协议层次结构讲解)-CSDN博客 我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送…

人工智能概论

一、关键技术 人工智能包含了七项关键技术: 1. 机器学习: 机器学习是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,是人工智能技术的核心。 从学习模式划分,分…

浅谈java中的锁

根据标准锁的分类 偏向锁 / 轻量级锁 / 重量级锁;可重入锁 / 非可重入锁;共享锁 / 独占锁;公平锁 / 非公平锁;悲观锁 / 乐观锁;自旋锁 / 非自旋锁;可中断锁 / 不可中断锁。 偏向锁 / 轻量级锁 / 重量级锁…

【管理运筹学】背诵手册(六)| 图与网络分析(最大流问题,最小费用最大流问题)

六、图与网络分析 最大流问题 最大流问题的数学规划模型为: max ⁡ v f 12 f 13 { f 12 f 13 − f 57 − f 67 0 f 13 f 23 f 34 f 35 . . . 0 ≤ f i j ≤ c i j \max vf_{12}f_{13}\\ \begin{cases} f_{12}f_{13}-f_{57}-f_{67}0 \\ f_{13}f_{23}f_{34}f…

虚拟数据生成_以Python为工具

生成虚拟数据_以Python为工具 生成虚拟数据技术在现实生活中具有多个重要的应用领域。它为数据隐私保护、机器学习算法开发、数据处理和可视化等方面提供了实用且有价值的解决方案。尤其是能满足定制化需求的虚拟数据,在预期的方向上让数据定向随机。 &#x1f339…

原生GPT本地及云端部署方式保姆级教程

前提条件 部署必须要有一个超过1年的Github账号 本地服务部署 运行效果 部署方法 下载安装包 暂时无法在飞书文档外展示此内容 GitHub授权登录: https://dash.pandoranext.com/ 登录后是这个样子: 复制下面红框里面这个License Id 编辑Config.js…

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级 在之前的开发过程中,需要实现卡片轮播效果,但是卡片轮播需要中间大、两边小一些的效果,这里就使用到了Swiper。具体效果如视频所示 添加链接描述 这里需要的效果是中间大、两边…

面试问题--Linux网络编程

Linux网络编程涉及在Linux操作系统上使用套接字(socket)等工具进行网络通信。以下是一些与Linux网络编程相关的主题: 套接字编程: 在Linux中,套接字是网络编程的基础。可以使用C语言中的socket库来创建套接字。套接字…

【人工智能Ⅰ】实验3:蚁群算法

实验3 蚁群算法的应用 一、实验内容 TSP 问题的蚁群算法实现。 二、实验目的 1. 熟悉和掌握蚁群算法的基本概念和思想; 2. 理解和掌握蚁群算法的参数选取,解决实际应用问题。 三、实验原理 1.算法来源 蚁群算法的基本原理来源于自然界…

C++学习 --谓词

目录 1, 什么是谓词 1-1, 一元谓词 1-2, 二元谓词 1, 什么是谓词 返回bool类型的仿函数, 叫着谓词, 分为一元谓词和二元谓词 1-1, 一元谓词 operator()接收一个参数,叫着一元谓…

python第1天之常识及环境安装

前言: 当谈到编程语言的流行度时,Python绝对是其中之一。Python是一种高级编程语言,其语法简单易懂,适用于各种不同的应用领域,包括Web开发、数据分析、人工智能等。在本文中,我们将探讨一些关于Pyth…

【JavaScript】3.2 JavaScript性能优化

文章目录 1. 避免全局查找2. 避免不必要的属性查找3. 使用快速的JavaScript方法4. 避免不必要的DOM操作5. 使用Web Workers进行后台处理总结 性能优化是任何编程语言的重要组成部分,JavaScript也不例外。在这个章节中,我们将探讨如何优化JavaScript代码&…

GAN:WGAN

论文:https://arxiv.org/pdf/1701.07875.pdf 发表:2017 WGAN 算法流程 从GAN 到 WGAN 的转变 相比于原始 GAN,WGAN 只需要修改以下几点,就能使得训练更稳定,生成质量更高: 1. 此时的判别器相当于做回归…

【DDD】领域驱动设计总结——如何构造领域模型

文章目录 一 分离领域二 领域对象分类2.1 实体(ENTITY)2.2 值对象(VALUE OBJECT)2.3 服务(SERVICE)2.4 模块(MODULE) 三 管理领域对象的生命周期3.1 聚合(AGGREGATE)3.2 工厂(FACTORY)3.3 存储库…

记i18n ally工具检测语言失败的一则思路

情况 只有某个文件检测不到汉字,其余都可以检测出来,困扰许久,发个博客记一下思路 解决方法: 1、肯定不是i18n ally工具的问题,因为其他的vue都能检测成功 2、是这个文件的问题 采用排除法 先删掉所有代码&#…

《Effective C++》条款27

尽量少做转型动作 class A { public:A(int x) :a(x) {};virtual void add(){a;} private:int a; }; class B :public A { public:B(int x) :b(x),A(x) {};virtual void add(){static_cast<A>(*this).add();b;}private:int b; }; 如上描述把子类转型为A类&#xff0c;调用…

解决keil右键Go To Definition跳转不过去的问题

解决&#xff1a; 在魔法棒中如图所示打上√

rabbitmq技术

1&#xff0c;docker运行rabbitmq docker run --restartalways -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq 2&#xff0c;新增管理员用户 rabbitmq服务&#xff0c;添加用户以及授权_rabbitmq添加用户授权_ROBOT玲玉的博客-CSDN博客