树莓派项目:使用 OpenCV 树莓派相机进行面部和眼睛检测

2f1a7eb68d5344d5a8b6eb234826e662.png


概述

该项目涵盖了在Raspberry Pi 4上安装OpenCV 的人脸和眼睛检测系统。

数字图像处理和计算机视觉是科技领域相互交织的领域。图像处理的核心就是细化和调整图像。结果通常是另一个增强的图像。相比之下,计算机视觉更进一步——它不仅仅处理图像;它还处理图像。它解释它。计算机视觉算法从图像中提取关键细节或特征,从而对视觉输入进行更全面的分析。

人脸和眼睛检测系统 OpenCV Raspberry Pi

在广阔的图像相关工具领域,OpenCV巩固了其领跑者的地位。它不仅用途广泛,而且其广泛的文档和蓬勃发展的社区的支持使其成为宝贵的资源。在本指南中,我们重点介绍OpenCV 的实践应用。我们将引导您完成从Raspberry Pi 相机拍摄的图像中检测面部和眼睛的步骤。借助Haar Cascades,一种基于机器学习的目标检测方法,我们将以令人印象深刻的准确性查明这些特征。

在本次探索结束时,您将对图像处理和计算机视觉之间的协同作用以及它们在当今技术领域开辟的无数可能性有更深入的了解。

所需组件

23f8fc493d4b41cd8e729fa0a0e57816.png

树莓派相机连接

Raspberry Pi 相机是由 Raspberry Pi 基金会开发的外围设备,可与其系列 Raspberry Pi 单板计算机一起使用。相机模块提供了添加视频/照片功能的方法方法。

对于这个项目,我们可以使用5 兆像素的Raspberry Pi 相机。

 

068fe1c586fea716d7d1f9bbc94b4608.png

只需使用相机连接器将相机模块连接到 Raspberry Pi 4 板即可。

 

00d1cb83fc4185bd31d392344d482f9f.jpeg

要使用相机,您需要先启用相机模块。sudo raspi-config通过在终端中键入内容来打开 Raspberry Pi 配置工具。导航至Interfacing Options>Camera并启用它。

 

人脸和眼睛检测背后的概念和算法

该项目的主要目的是识别突出显示 面部眼睛连续视频流中的

为此,我们使用了OpenCV 库。OpenCv 是一个广泛使用的计算机视觉库,用于各种图像处理任务,包括对象检测。对于面部和眼睛检测,我们使用Haar Cascades Model。Haar Cascades 是一种基于机器学习的方法,其中训练级联函数来检测图像中的对象。

 

26cf2a45bbc888f58bca3a33d5c50b6e.jpeg

它是一种特别有效的目标检测方法,已广泛用于实时场景中的人脸检测等任务。OpenCV 提供了预先训练的 Haar Cascades用于人脸检测,使许多开发人员可以轻松使用它。

 

1f93143bc789ff883e54a6520041e3a8.jpeg

使用 Raspberry Pi 和 OpenCV 进行人脸和眼睛检测的算法可以解释如下。

  1. 初始化
    • 加载用于面部和眼睛检测的 Haar 级联。
    • 配置 Raspberry Pi 摄像头以获得所需的视频分辨率和帧速率。
  2. 连续捕获帧:逐帧捕获视频流以进行实时处理。
  3. 预处理
    • 每个捕获的帧都会转换为灰度。灰度表示简化了图像,消除了颜色细微差别,这通常使对象检测更快、更准确。
  4. 人脸检测
    • 灰度帧内的人脸被识别。
    • 通过在其周围绘制矩形来突出显示每个检测到的面孔。
  5. 眼睛检测
    • 对于每张已识别的面部,定义眼睛最有可能位于的感兴趣区域(通常是面部区域)。
    • 在该区域内,检测眼睛。
    • 通过在其周围绘制一个矩形来突出显示每只检测到的眼睛。
  6. 显示
    • 处理后的帧现在在检测到的面部和眼睛周围有矩形,会实时显示给用户。
  7. 用户互动
    • 为用户提供退出检测并结束程序的选项。

Raspberry Pi 设置、库和依赖项安装

人脸眼睛检测以及代码中存在的其他图像处理任务需要OpenCV 。因此您需要先安装OpenCV。请按照以下指南在您的系统中安装 OpenCV

 

下一步是安装picamera因此使用pip安装它。

	
pip3 install picamera

 

在 Raspberry Pi 的主目录中创建一个文件夹,名称任意,例如“ Face Recognition ”。

 

9695df2edb732bcab87b08f1d46df4e2.jpeg

该代码引用两个XML 文件haarcascade_frontalface_default.xmlhaarcascade_eye.xml),它们是分别用于面部和眼睛检测的 Haar 级联。

 

从以下链接下载这些文件:

  1. 下载haarcascade_frontalface_default.xml
  2. 下载haarcascade_eye.xml

将这些文件添加到您上面创建的文件夹中。

 

01572e3fec5c27007cd1f7e956374ab7.jpeg

设置部分现已完成。我们可以使用 Raspberry Pi 和 OpenCV 转向面部和眼睛检测项目。


用于面部和眼睛检测的 Raspberry Pi Python 代码

现在让我们开发一个Python 代码,帮助使用OpenCV 库Raspberry Pi 相机来检测眼睛和面部。

Python代码

打开Thonny IDE并将以下代码粘贴到 Thonny 编辑器中。将此文件以名称“ face_detection.py ”保存到我们之前创建的文件夹中。确保这些XML 文件存在于代码 ( ) 中提到的目录中/home/mypi/Face Recognition/

import cv2
import numpy as np
import picamera
import picamera.array
 
def main():
    # Load the face and eye detection cascades
    face_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_eye.xml') # You'll need the XML file for eye detection
 
    with picamera.PiCamera() as camera:
        camera.resolution = (320, 240)
        camera.framerate = 15
 
        with picamera.array.PiRGBArray(camera, size=(320, 240)) as stream:
            for frame in camera.capture_continuous(stream, format='bgr', use_video_port=True):
                image = frame.array
 
                # Convert the image to grayscale for face and eye detection
                gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
                # Detect faces
                faces = face_cascade.detectMultiScale(gray, 1.1, 5)
 
                for (x, y, w, h) in faces:
                    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
 
                    # Region of interest in the grayscale image for eyes detection
                    roi_gray = gray[y:y+h, x:x+w]
                    # Region of interest in the color image for drawing rectangles around eyes
                    roi_color = image[y:y+h, x:x+w]
                    
                    # Detect eyes within the region of interest (i.e., the detected face)
                    eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, minSize=(30,30))
                    for (ex, ey, ew, eh) in eyes:
                        cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
 
                # Resize the frame for displaying in a larger window
                display_frame = cv2.resize(image, (640, 480))
 
                # Display the frame
                cv2.imshow('Face and Eye Detection', display_frame)
 
                # Clear the stream for the next frame
                stream.truncate(0)
 
                # Close the window when 'q' is pressed
                if cv2.waitKey(1) & 0xFF == ord('q'):
                    break
 
        cv2.destroyAllWindows()
 
if __name__ == '__main__':
    main()

代码说明

让我们分解代码并解释每个部分:

 

 
1
2
3
4
import cv2
import numpy as np
import picamera
import picamera.array

 

  • cv2:这是 OpenCV 库,一个用于计算机视觉任务的强大库。
  • numpy:这是一个用于数值运算的库。OpenCV 使用 Numpy 数组进行图像处理。
  • picamerapicamera.array:这些是用于访问 Raspberry Pi 相机模块的库。

 

 
1
def main():

 

该行定义了代码的主要逻辑所在的主函数。

 

 
1
2
    face_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('/home/mypi/Face Recognition/haarcascade_eye.xml')

 

该代码加载预先训练的分类器(称为 Haar 级联)以进行面部和眼睛检测。这些 XML 文件包含用于检测图像中的面部和眼睛的数据。

 

 
1
2
3
    with picamera.PiCamera() as camera:
        camera.resolution = (320, 240)
        camera.framerate = 15

 

初始化Raspberry Pi相机,分辨率为320×240,帧率为每秒15帧。

 

 
1
2
3
        with picamera.array.PiRGBArray(camera, size=(320, 240)) as stream:
            for frame in camera.capture_continuous(stream, format='bgr', use_video_port=True):
                image = frame.array

 

  • capture_continuous函数连续捕获帧。
  • PiRGBArray为从相机捕获的图像提供 3D RGB 阵列接口。
  • 每个捕获的帧都会转换为 NumPy 数组以供进一步处理。

 

 
1
                gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

 

彩色图像转换为灰度图像。灰度图像用于检测,因为级联分类器通常不需要颜色信息。

 

 
1
                faces = face_cascade.detectMultiScale(gray, 1.1, 5)

 

检测灰度图像中的人脸。这些参数有助于确定图像的比例以及矩形应被视为面部的最小邻域。

 

 
1
2
                for (x, y, w, h) in faces:
                    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)

 

在原始彩色图像中检测到的每个人脸周围绘制一个矩形。

 

 
1
2
3
4
5
                    roi_gray = gray[y:y+h, x:x+w]
                    roi_color = image[y:y+h, x:x+w]
                    eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, minSize=(30,30))
                    for (ex, ey, ew, eh) in eyes:
                        cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)

 

  • 对于每个检测到的人脸,都会提取感兴趣区域 (ROI)(灰度和彩色版本)。
  • 然后在该 ROI 内检测眼睛。
  • 在彩色 ROI 中检测到的每只眼睛周围绘制矩形。

 

 
1
2
                display_frame = cv2.resize(image, (640, 480))
                cv2.imshow('Face and Eye Detection', display_frame)

 

  • 处理后的帧会调整大小以供显示之用。
  • 然后该帧显示在标题为“面部和眼睛检测”的窗口中。

 

 
1
2
3
                stream.truncate(0)
                if cv2.waitKey(1) & 0xFF == ord('q'):
                    break

 

  • 流被截断以准备下一帧。
  • 如果用户按“q”,循环(和程序)将退出。

 

 
1
        cv2.destroyAllWindows()

 

关闭所有打开的 OpenCV 窗口。

 

 
1
2
if __name__ == '__main__':
    main()

 

这是一个常见的 Python 习惯用法。当直接运行脚本(不导入)时,main()将执行该函数。

测试与结果

单击“运行”按钮运行上述脚本。将出现一个窗口,显示对象实时图像来自相机的

相机放在您的面前。窗口将在脸部周围显示一个蓝色矩形,在眼睛周围显示两个绿色矩形。

该脚本还可以检测图像中的多个面部。

 

4f38365ee501c855e9ec9dda223f3af5.jpeg

您可以通过将相机带给多人来多次尝试此操作。每次都会检测到脸部和眼睛。

结论

将OpenCVRaspberry Pi 相机结合使用,可以实现实时面部和眼睛检测,展示了紧凑系统在计算机视觉任务中的强大功能。虽然当前使用Haar 级联的设置非常有效,但深度学习等进步可以提高准确性。该项目强调了经济实惠、易于使用的技术在实际计算机视觉应用中的潜力。

猜你喜欢

转载自blog.csdn.net/m0_46509684/article/details/132524981