概述
人脸识别是一项重要的计算机视觉任务,广泛应用于安全监控、身份验证等领域。本文将详细介绍如何使用 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 绘制矩形,最终实现了在实时视频流中检测并标记人脸的功能。
到此这篇关于使用 python 和 opencv 实现实时人脸识别的文章就介绍到这了,更多相关python 和 opencv人脸识别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论