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

使用 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'):

break

cv2.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 窗口。

测试

确保你的摄像头正常工作。

运行脚本:

python3 face_detection.py

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

按 ‘q’ 键退出程序。

总结

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

相关创作

日本这个小城,为什么这么怀念聂耳?
正规365体育投注

日本这个小城,为什么这么怀念聂耳?

📅 07-21 👁️ 447
2030和2034年国际足联世界杯比赛举办地确定
cctv3直播365

2030和2034年国际足联世界杯比赛举办地确定

📅 07-16 👁️ 7150
找项目找商机上哪个平台?有这几个平台就够了!
beat365体育登陆网址

找项目找商机上哪个平台?有这几个平台就够了!

📅 09-29 👁️ 7351