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

devtools/2024/11/7 22:03:23/
概述

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

环境准备

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

pip install opencv-python
代码详解
1. 导入必要的模块
python">import cv2
  • import cv2:导入 OpenCV 库,用于图像处理和人脸识别。
2. 定义主函数
python">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.ppmy.cn/devtools/132130.html

相关文章

《Vue3 报错》Uncaught TypeError: s.finally is not a function

解决方案: 新建文件 my-polyfill.js // 当浏览器环境不支持Promise.prototype.finally if (!Promise.prototype[finally]) {Promise.prototype[finally] function(callback) {let P this.constructor;return this.then(value > P.resolve(callback()).then(…

org.springframework.boot:type=Admin,name=SpringApplication异常

org.springframework.boot:typeAdmin,nameSpringApplication异常 问题:更换最新版本idea之后,启动springboot项目报错 javax.management.InstanceNotFoundException: org.springframework.boot:typeAdmin,nameSpringApplication idea自动默认的启动设…

如何调整电脑的背景色(黑色和白色切换)

1.切换谷歌浏览器里面内容的背景色 打开浏览器->右上角三个点->设置->外观->模式 中点击深色和浅色即可切换。 如果切换完之后并刷新发现有的网站还是没有变化,说明这个网站的背景色是依据电脑的背景色而变化的。也就是需要执行下面的第2个。 2.切换电…

SpringMVC的执行流程以及运行原理

文章目录 SpringMVC的执行流程以及运行原理一、引言二、SpringMVC核心组件与执行流程1、SpringMVC核心组件1.1、DispatcherServlet配置 2、SpringMVC执行流程 三、SpringMVC配置文件及注解四、总结 SpringMVC的执行流程以及运行原理 一、引言 SpringMVC作为Spring框架的核心模…

【笔记】变压器-热损耗-频响曲线推导 - 04 额定功率处损耗特性

0.最大的问题 - 散热 对变压器这类功率器件,最大的问题是散热的效率。因为传统的电路基板热导率并不高,几乎和良性导热材料有近乎两个数量级的导热差异,所以,会采用特殊的导热技术,把热量尽可能快地传导到散热片。 传…

STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器

1、简要说明与电路图 LED灯与蜂鸣器都是GPIO的输出操作,给高低电平实现。GPIO操作也是后续操作的基础,没有什么难度,记不住寄存器没关系,只要把流程理清楚就可以了。 端口配置成推挽输出模式,高低电平均有驱动能力。 …

知识总结三

一、osi七层网络模型 物理层(IEEE),数据链路层(PPP,ARP,MTU),网络层(IP,ICMP,BGP),传输层(TCP,UD…

w012基于springboot的社区团购系统设计

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…