使用 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 窗口。
  • 测试
    1. 确保你的摄像头正常工作。

    2. 运行脚本:

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

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

    总结

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


    作者:燕鹏01

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用 Python 和 OpenCV 实现实时人脸识别

    发表回复