使用 Python 和 OpenCV 实现实时人脸识别

概述

人脸识别是一项重要的计算机视觉任务,广泛应用于安全监控、身份验证等领域。本文将详细介绍如何使用 Python 和 OpenCV 库实现实时人脸识别,并通过具体的代码示例来展示整个过程。

环境准备

在开始编写代码之前,确保已经安装了 OpenCV 库。可以使用以下命令安装:

pip install opencv-python
代码详解
1. 导入必要的模块
import cv2
  • import cv2:导入 OpenCV 库,用于图像处理和人脸识别。
2. 定义主函数
def main():# 加载Haar级联分类器face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')'''加载 Haar 级联分类器:face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')cv2.CascadeClassifier():这是 OpenCV 中的一个类,用于加载预先训练好的 Haar 级联分类器。cv2.data.haarcascades + 'haarcascade_frontalface_default.xml':这是 OpenCV 自带的预训练 Haar 级联分类器文件路径,用于检测正面人脸。'''# 打开默认摄像头cap = cv2.VideoCapture(0)'''打开默认摄像头:cap = cv2.VideoCapture(0)cv2.VideoCapture():这是 OpenCV 中的一个类,用于捕获视频。参数 0 表示打开默认摄像头。'''while True:# 读取视频流中的一帧ret, frame = cap.read()'''读取视频流中的一帧:ret, frame = cap.read()cap.read():从摄像头读取一帧图像。返回两个值:ret:布尔值,表示读取是否成功。如果读取成功,ret 为 True;否则为 False。frame:读取到的图像帧。'''if not ret:break'''检查读取是否成功:if not ret:break如果读取失败(例如摄像头断开连接),则退出循环。'''# 将帧转换为灰度,因为 Haar 级联分类器需要灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)'''将帧转换为灰度:gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.cvtColor():这是 OpenCV 中的一个函数,用于颜色空间转换。frame:输入图像。cv2.COLOR_BGR2GRAY:将 BGR 图像转换为灰度图像。'''# 检测人脸faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)'''检测人脸:faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)face_cascade.detectMultiScale():这是 Haar 级联分类器的一个方法,用于检测图像中的人脸。gray:输入的灰度图像。scaleFactor=1.1:每次图像尺寸减小的比例。minNeighbors=5:每个候选矩形应保留的邻居数阈值。minSize=(30, 30):最小检测人脸的尺寸。flags=cv2.CASCADE_SCALE_IMAGE:用于优化检测过程的标志。'''# 在检测到的人脸周围绘制矩形for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)'''在检测到的人脸周围绘制矩形:for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)for (x, y, w, h) in faces:遍历检测到的每个人脸。cv2.rectangle():这是 OpenCV 中的一个函数,用于在图像上绘制矩形。frame:输入图像。(x, y):矩形左上角的坐标。(x + w, y + h):矩形右下角的坐标。(0, 255, 0):矩形的颜色(绿色)。2:矩形线条的厚度。'''# 显示结果帧cv2.imshow('Face Detection', frame)'''显示结果帧:cv2.imshow('Face Detection', frame)cv2.imshow():这是 OpenCV 中的一个函数,用于显示图像。'Face Detection':窗口标题。frame:要显示的图像。'''# 按'q'退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break'''按'q'退出循环:if cv2.waitKey(1) & 0xFF == ord('q'):breakcv2.waitKey(1):等待 1 毫秒,等待用户按键。& 0xFF:将按键值转换为 ASCII 码。ord('q'):获取字符 'q' 的 ASCII 码。如果用户按下 'q' 键,则退出循环。'''# 释放摄像头并关闭所有窗口cap.release()cv2.destroyAllWindows()'''释放摄像头并关闭所有窗口:cap.release()cv2.destroyAllWindows()cap.release():释放摄像头资源。cv2.destroyAllWindows():关闭所有 OpenCV 窗口。'''if __name__ == "__main__":main()
  • def main()::定义主函数 main
  • face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'):加载 Haar 级联分类器,用于检测正面人脸。
  • cap = cv2.VideoCapture(0):打开默认摄像头。
  • while True::进入无限循环,实时读取摄像头图像。
  • ret, frame = cap.read():从摄像头读取一帧图像。
  • if not ret::检查读取是否成功,如果失败则退出循环。
  • gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY):将图像转换为灰度图像。
  • faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE):检测图像中的人脸。
  • for (x, y, w, h) in faces::遍历检测到的每个人脸,并在图像上绘制矩形。
  • cv2.imshow('Face Detection', frame):显示带有矩形标记的图像。
  • if cv2.waitKey(1) & 0xFF == ord('q')::按 ‘q’ 键退出循环。
  • cap.release():释放摄像头资源。
  • cv2.destroyAllWindows():关闭所有 OpenCV 窗口。
测试
  1. 确保你的摄像头正常工作。

  2. 运行脚本:

    python3 face_detection.py
    
  3. 打开摄像头后,你会看到一个窗口显示实时视频流,并且在检测到的人脸周围绘制绿色矩形。

  4. 按 ‘q’ 键退出程序。

总结

本文详细介绍了如何使用 Python 和 OpenCV 库实现实时人脸识别,并通过具体的代码示例展示了整个过程。通过使用 cv2.CascadeClassifier 加载预训练的 Haar 级联分类器,cv2.VideoCapture 打开摄像头,cv2.cvtColor 转换图像颜色空间,cv2.rectangle 绘制矩形,最终实现了在实时视频流中检测并标记人脸的功能。


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

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

相关文章

掌握 PyQt5:从零开始的桌面应用开发

PyQT5——图形化界面 文章目录 PyQT5——图形化界面集成化图形界面工具为什么使用 \$ProjectFileDir$?示例场景其他 Varaiablespyuic参数解释整体含义示例使用PyQt5和pyuic 创建pyqt5的程序创建一个窗口app.exec\_()和sys.exit(app.exec_())的区别1. app.exec_()2. sys.exit(a…

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…

PMP–一、二、三模、冲刺–分类–7.成本管理–技巧–挣值分析

文章目录 技巧一模7.成本管理--4.控制成本--数据分析--挣值分析--进度绩效指数(SPI)是测量进度效率的一种指标,表示为挣值与计划价值之比,反映了项目团队完成工作的效率。 当 SPI小于 1.0 时,说明已完成的工作量未达到…

保姆级教程!!教你通过【Pycharm远程】连接服务器运行项目代码

小罗碎碎念 这篇文章主要解决一个问题——我有服务器,但是不知道怎么拿来写代码,跑深度学习项目。确实,玩深度学习的成本比较高,无论是前期的学习成本,还是你需要具备的硬件成本,都是拦路虎。小罗没有办法…

成绩管理系统软件体系结构设计

成绩管理系统软件体系结构设计 文档简介 1.1 目的 1.2 范围 1.3 定义、首字母缩写词和缩略语 1.4参考资料 1.5 概述体系结构表示方式软件体系结构的目标和约束 3.1 结构清晰 3.2 支持外包开发 3.3 可扩展性 3.4 系统安全性 3.5 可移植性 4体系结构模式逻辑视图进程视图…

单臂路由实现不同VLAN之间设备通信

转载请注明出处 本实验为单臂路由配置,目的为让不同VLAN之间的设备能够互相通信。 1.首先,按照要求配置两个pc的ip地址,以pc0为例子: 2在交换机创建vlan10和vlan20 3.划分vlan,pc0为vlan10的设备,pc1为vla…

机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)

目录 关于1 基本流程2 划分属性的选择2.1 方法一:依据信息增益选择2.2 方法二:依据增益率选择2.3 方法三:依据基尼指数选择 3 剪枝处理:防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…

Ubuntu和Debian系列的Release默认shell解释器变更

Debian 12 Bookworm 和 Ubuntu 24.04 中默认的 shell 解释器已经由 bash 变更为了 dash 。 这个变化对于我们直接在 CLI 上执行 Linux command 无影响,但对于执行shell解释性程序有影响,已知 bash 中的 变量正规表达式 (如 ${GIT_COMMIT:0:8…

ReLU6替换ReLU为什么可以增强硬件效率?

ReLU6(Rectified Linear Unit 6)是ReLU的一种变体,它在ReLU的基础上增加了一个上限值6,即输出范围被限制在[0, 6]之间。 这种变化在硬件实现中可以带来以下几个方面的效率提升: 1. 数据表示的简化 ReLU的输出范围是[…

vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么区别

vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么区别 windows默认使用的是最新的visual studio,而linux默认就是cmake 文章目录 vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么…

Spirngboot集成Knife4j spirngboot版本2.7.17 Knife4j版本4.0.0

Knife4j是什么?有什么作用? ‌Knife4j‌是一个基于Swagger的Java RESTful API文档工具,旨在帮助开发者轻松生成和维护API文档。它继承并增强了Swagger的功能,简化了使用流程,并提供了一系列增强功能,如接口…

ROS2humble版本使用colcon构建包

colcon与与catkin相比,没有 devel 目录。 创建工作空间 首先,创建一个目录 ( ros2_example_ws ) 来包含我们的工作区: mkdir -p ~/ros2_example_ws/src cd ~/ros2_example_ws 此时,工作区包含一个空目录 src : . └── src1 directory, …

GY-56 (VL53L0X) 激光测距

文章目录 一、GY-56 简介二、引脚功能三、通信协议1.串口协议: 当 GY-56 PS 焊点开放时候使用(默认)(1)串口通信参数(默认波特率值 9600bps)(2)模块输出格式,每帧包含 8-13 个字节&a…

C语言 | Leetcode C语言题解之第541题反转字符串II

题目&#xff1a; 题解&#xff1a; void swap(char* a, char* b) {char tmp *a;*a *b, *b tmp; }void reverse(char* l, char* r) {while (l < r) {swap(l, --r);} }int min(int a, int b) {return a < b ? a : b; }char* reverseStr(char* s, int k) {int n strl…

提升网站安全性 HTTPS的重要性与应用指南

内容概要 在如今数字化快速发展的时代&#xff0c;网站安全显得尤为重要。许多用户在访问网站时&#xff0c;尤其是涉及个人信息或金融交易时&#xff0c;对数据传输的安全性有着高度的关注。HTTPS&#xff08;超文本传输安全协议&#xff09;正是为了满足这种需求而诞生的。通…

Transformer究竟是什么?预训练又指什么?BERT

目录 Transformer究竟是什么? 预训练又指什么? BERT的影响力 Transformer究竟是什么? Transformer是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,它最初是为解决机器翻译等序列到序列(Seq2Seq)任务而设计的。与传统的循环神经网络(RNN)或卷…

OpenDroneMap Webodm

OpenDroneMap & Webodm OpenDroneMap Webodm 开源无人机航拍系列图像及其它系列图像三维重建软件。很棒的开源无人机测绘软件OpenDroneMap,从航拍图像生成精确的地图、高程模型、3D 模型和点云。 应用领域 Mapping & Surveying 测绘和测量 从图像测量获得高精度的可…

Java+Swing可视化图像处理软件

JavaSwing可视化图像处理软件 一、系统介绍二、功能展示1.图片裁剪2.图片缩放3.图片旋转4.图像灰度处理5.图像变形6.图像扭曲7.图像移动 三、系统实现1.ImageProcessing.java 四、其它1.其他系统实现2.获取源码 一、系统介绍 该系统实现了图片裁剪、缩放、旋转、图像灰度处理、…

迈入国际舞台,AORO M8防爆手机获国际IECEx、欧盟ATEX防爆认证

近日&#xff0c;深圳市遨游通讯设备有限公司&#xff08;以下简称“遨游通讯”&#xff09;旗下5G防爆手机——AORO M8&#xff0c;通过了CSA集团的严格测试和评估&#xff0c;荣获国际IECEx及欧盟ATEX防爆认证证书。2024年11月5日&#xff0c;CSA集团和遨游通讯双方领导在遨游…

string模拟实现插入+删除

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 string模拟实现reserve 这里实现的是扩容 扩容这里是可以实现缩容&#xff0c;可以实现…