该项目涵盖了在Raspberry Pi 4上安装OpenCV 的人脸和眼睛检测系统。
数字图像处理和计算机视觉是科技领域相互交织的领域。图像处理的核心就是细化和调整图像。结果通常是另一个增强的图像。相比之下,计算机视觉更进一步——它不仅仅处理图像;它还处理图像。它解释它。计算机视觉算法从图像中提取关键细节或特征,从而对视觉输入进行更全面的分析。
在广阔的图像相关工具领域,OpenCV巩固了其领跑者的地位。它不仅用途广泛,而且其广泛的文档和蓬勃发展的社区的支持使其成为宝贵的资源。在本指南中,我们重点介绍OpenCV 的实践应用。我们将引导您完成从Raspberry Pi 相机拍摄的图像中检测面部和眼睛的步骤。借助Haar Cascades,一种基于机器学习的目标检测方法,我们将以令人印象深刻的准确性查明这些特征。
在本次探索结束时,您将对图像处理和计算机视觉之间的协同作用以及它们在当今技术领域开辟的无数可能性有更深入的了解。
Raspberry Pi 相机是由 Raspberry Pi 基金会开发的外围设备,可与其系列 Raspberry Pi 单板计算机一起使用。相机模块提供了添加视频/照片功能的方法方法。
对于这个项目,我们可以使用5 兆像素的Raspberry Pi 相机。
只需使用相机连接器将相机模块连接到 Raspberry Pi 4 板即可。
要使用相机,您需要先启用相机模块。sudo raspi-config
通过在终端中键入内容来打开 Raspberry Pi 配置工具。导航至Interfacing Options
>Camera
并启用它。
该项目的主要目的是识别并突出显示 面部和眼睛连续视频流中的
为此,我们使用了OpenCV 库。OpenCv 是一个广泛使用的计算机视觉库,用于各种图像处理任务,包括对象检测。对于面部和眼睛检测,我们使用Haar Cascades Model。Haar Cascades 是一种基于机器学习的方法,其中训练级联函数来检测图像中的对象。
它是一种特别有效的目标检测方法,已广泛用于实时场景中的人脸检测等任务。OpenCV 提供了预先训练的 Haar Cascades用于人脸检测,使许多开发人员可以轻松使用它。
使用 Raspberry Pi 和 OpenCV 进行人脸和眼睛检测的算法可以解释如下。
人脸和眼睛检测以及代码中存在的其他图像处理任务需要OpenCV 。因此您需要先安装OpenCV。请按照以下指南在您的系统中安装 OpenCV:
下一步是安装picamera。因此使用pip安装它。
pip3 install picamera
在 Raspberry Pi 的主目录中创建一个文件夹,名称任意,例如“ Face Recognition ”。
该代码引用两个XML 文件(haarcascade_frontalface_default.xml
和haarcascade_eye.xml
),它们是分别用于面部和眼睛检测的 Haar 级联。
从以下链接下载这些文件:
将这些文件添加到您上面创建的文件夹中。
设置部分现已完成。我们可以使用 Raspberry Pi 和 OpenCV 转向面部和眼睛检测项目。
现在让我们开发一个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 数组进行图像处理。picamera
& picamera.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 阵列接口。
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)
|
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
|
1
|
cv2.destroyAllWindows()
|
关闭所有打开的 OpenCV 窗口。
1
2
|
if __name__ == '__main__':
main()
|
这是一个常见的 Python 习惯用法。当直接运行脚本(不导入)时,main()
将执行该函数。
单击“运行”按钮运行上述脚本。将出现一个窗口,显示对象的实时图像来自相机的
将相机放在您的面前。窗口将在脸部周围显示一个蓝色矩形,在眼睛周围显示两个绿色矩形。
该脚本还可以检测图像中的多个面部。
您可以通过将相机带给多人来多次尝试此操作。每次都会检测到脸部和眼睛。
将OpenCV与Raspberry Pi 相机结合使用,可以实现实时面部和眼睛检测,展示了紧凑系统在计算机视觉任务中的强大功能。虽然当前使用Haar 级联的设置非常有效,但深度学习等进步可以提高准确性。该项目强调了经济实惠、易于使用的技术在实际计算机视觉应用中的潜力。