17、基于OpenCV的人脸识别门锁系统搭建指南

基于OpenCV的人脸识别门锁系统搭建指南

1. OpenCV安装

OpenCV的安装方式有两种:使用Python的包管理器pip安装,或者从源代码编译安装。从源代码安装能让你对OpenCV的配置有最大的控制权,但这也是最困难且最耗时的方法。如果你想最快地在系统上安装OpenCV,可通过pip进行安装。以下是具体步骤:
1. 更新和升级Raspbian操作系统包

sudo apt-get update
sudo apt-get upgrade
  1. 重启树莓派,并安装OpenCV所需的依赖项
sudo apt-get install libhdf5-dev
sudo apt-get install libhdf5-serial-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
sudo apt-get install libqtgui4
sudo apt-get install libqt4-test
  1. 安装NumPy :NumPy是Python中科学计算的基础包,图像包含像素数据数组,NumPy便于对这些数据进行高级数学和其他类型的操作。使用以下命令安装:
pip3 install numpy
  1. 在树莓派上安装OpenCV
pip3 install opencv-contrib-python==4.1.0.25

安装成功后,打开Python命令行,输入 import cv2 ,然后输入 print(cv.__version__) 来测试安装情况。如果导入失败,可以在互联网上搜索错误信息进行故障排除。

2. 人脸识别所需包的安装

由于要使用人脸识别来构建门锁系统,还需要安装一些人脸识别所需的包:
1. 安装dlib :dlib是一个现代工具包,包含用于解决现实世界问题的机器学习算法和工具。使用以下命令安装:

pip3 install dlib
  1. 安装face_recognition模块 :该库用于通过命令行从Python中识别和处理人脸。
pip3 install face_recognition
  1. 安装imutils :imutils包含基本的图像处理功能,如平移、旋转、调整大小、骨架化和显示Matplotlib图像。
pip3 install imutils
  1. 安装pillow :Pillow可以打开、操作和保存各种格式的图像。
pip3 install pillow
3. OpenCV基础

OpenCV是一个非常庞大的主题,很难在一篇文章中全面涵盖。建议你花时间阅读OpenCV官网(https://opencv.org)上的一些教程。这里将介绍读取、写入和打开图像/视频所需的基本函数,以及一些图像变换函数。

3.1 导入库

在Python代码中使用OpenCV,首先需要导入OpenCV库和NumPy库,代码如下:

import cv2
import numpy as np
3.2 打开和显示图像

在OpenCV中处理图像和文件非常简单,只需使用相应的函数即可。
- imread() 函数 :用于从本地存储中打开图像文件,它有两个参数:文件名和颜色类型标志。第一个参数应该是图像的完整路径,颜色类型标志决定是以彩色还是灰度模式打开图像。
- imshow() 函数 :用于显示图像,它打开一个新窗口来显示图像,有两个参数:第一个参数是图像窗口上显示的标题,必须用单引号(’ ‘)表示为字符串;第二个参数是使用 imread() 函数存储图像数据的图像变量。
- waitKey() 函数 imshow() 函数需要 waitKey() 函数来显示图像,该函数等待指定的毫秒数来保持窗口打开。如果留空,它会等待按下任何键后继续。
- destroyAllWindows() 函数 :用于关闭所有打开的窗口。如果不使用此函数,程序可能会挂起。
- imwrite() 函数 :用于保存编辑后的图像,第一个参数是要保存的文件名,第二个参数是编辑后图像的图像变量。

以下是一个读取和显示图像的示例代码:

import cv2
import numpy as np
image = cv2.imread('input.jpg')
cv2.imshow('hello_world', image)
print(image.shape)
cv2.waitKey()
cv2.destroyAllWindows()

shape() 函数用于获取图像的尺寸,它返回一个元组,给出图像的尺寸(x, y)和颜色空间。例如,如果该函数返回 (180, 150, 3) ,则表示图像高180像素,宽150像素,由三个分量(R, G, B)组成。

3.3 捕获和读取视频文件

使用相机捕获视频与打开图像略有不同,视频包含连续的图像帧,因此需要使用一个开放的 while 循环来获取多个帧。
- 捕获视频 :要从相机捕获视频,需要创建一个 VideoCapture() 对象,然后在循环中使用 read() 函数捕获帧。该函数返回两个对象:返回值和图像帧。如果读取成功,返回值为1;否则返回0。捕获帧后,可以在同一循环中使用 imshow() 函数显示它们。
- 保存视频 :使用 VideoWriter() 对象保存视频,OpenCV使用FOURCC(四字符代码)来指定编解码器。 VideoWriter() 构造函数有四个参数:
- filename :输出视频文件的名称。
- fourcc :定义编解码器。
- fps :输出视频流的帧率。
- frameSize :视频帧的大小。

以下是一个录制和保存视频的示例代码:

import numpy as np
import cv2
# 从计算机的第一个网络摄像头获取视频
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while True:
    ret, frame = cap.read()
    out.write(frame)
    cv2.imshow('video', frame)
    # 等待 'a' 键停止程序
    if cv2.waitKey(1) & 0xFF == ord('a'):
        break
# 关闭窗口,释放摄像头和输出
cap.release()
out.release()
cv2.destroyAllWindows()

保存文件并在命令终端中使用 python filename.py 命令运行。按下A键停止录制,工作目录中应该会有一个视频文件。可以使用以下代码读取该文件:

cap = cv2.VideoCapture('video_name.avi')
while True:
    ret, frame = cap.read()
    cv2.imshow('video', frame)
4. 图像变换

在处理图像之前,有时需要对图像进行翻转和调整大小。在OpenCV中可以轻松执行这些操作。
- flip() 函数 :用于翻转图像,它有三个参数:要翻转的图像、指示翻转方向的代码(0:水平翻转,1:垂直翻转, -1:两个轴都翻转,即180度翻转)和翻转后图像的目标位置。最后一个参数是可选的,当需要将翻转后的图像分配给另一个变量时可以使用。
- rotate() 函数 :用于顺时针或逆时针旋转图像。
- resize() 函数 :用于调整图像大小,它有三个参数:要缩放的图像、目标尺寸和插值类型。插值是一种数学方法,用于确定如何处理像素的移除或添加。有三种插值选项: INTER_AREA 用于缩小图像, INTER_CUBIC INTER_LINEAR 用于放大图像。默认情况下,OpenCV使用 INTER_LINEAR 插值进行缩小和放大。

以下是一个翻转和调整图像大小的示例代码:

import numpy as np
import cv2
path = r'/home/pi/Desktop/image.png'
img = cv2.imread(path)
x, y = img.shape[:2]
resizeImg = cv2.resize(img, (y//2, x//2), interpolation=cv2.INTER_AREA)
# 使用翻转代码0进行垂直翻转
image = cv2.flip(img, 0)
# 显示图像
cv2.imshow('Flipped', image)
cv2.imshow('Resized', resizeImg)
cv2.waitKey()
cv2.destroyAllWindows()

保存文件并在命令终端中运行脚本,会出现两个窗口,一个显示翻转后的图像,另一个显示缩小后的图像。

5. 颜色空间

在处理图像时,颜色在决定图像质量方面起着非常重要的作用,也是OpenCV的重要组成部分。处理颜色的关键元素之一是颜色空间,它描述了图像的存储方式。颜色由一系列数字表示,颜色空间决定了这些数字的含义。
- BGR颜色空间 :OpenCV的默认颜色空间是BGR(蓝、绿、红),与RGB颜色方案相反。每种颜色由三个0到255之间的整数表示,例如,如果一种颜色表示为 (255, 0, 0) ,则表示蓝色通道的值最大。
- HSV颜色空间 :HSV(色调、饱和度和值)是OpenCV中使用的另一种颜色空间,它试图以人类感知颜色的方式来表示颜色。这种格式在颜色分割中很有用。色调表示颜色值,范围从0到179;饱和度表示颜色的鲜艳度,范围从0到255;值表示颜色的亮度或强度,范围从0到255。
- 灰度颜色空间 :灰度是图像的黑白版本。灰度化是将图像从全彩色转换为灰度的过程,OpenCV中的许多函数都会使用它,它可以简化图像并减少整个程序的处理时间。

可以使用 cvtColor() 函数将图像转换为不同的颜色空间,它有两个参数:图像和颜色空间常量。以下是一个将图像转换为灰度的示例代码:

import numpy as np
import cv2
path = r'/home/pi/Desktop/image.png'
img = cv2.imread(path)
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', grayImg)
cv2.waitKey()
cv2.destroyAllWindows()
6. 人脸识别门锁系统

在开始人脸识别过程之前,需要了解人脸检测和人脸识别的基本区别。当软件仅检测到人的面部而不知道这个人是谁时,这个过程称为人脸检测;当软件识别出这个人是谁时,这个过程就是人脸识别。

OpenCV使用分类器来检测对象,如人脸、鼻子、眼睛、车辆等。这些分类器是预训练的XML数据文件集,可用于检测对象。可以从OpenCV的GitHub页面(https://github.com/opencv/opencv/tree/master/data/haarcascades)下载分类器文件,这里使用 haarcascade_frontalface_default.xml 来检测正面人脸。

需要创建一个项目文件夹,将所有Python脚本保存在一个地方。该文件夹将包含三个Python脚本: dataset.py Face_Trainer.py Face_Recog.py 。还需要将 haarcascade_frontalface_default.xml 分类器文件放在同一文件夹中。最后,使用 Face_Trainer.py 程序将生成一个名为 trainer.yml 的训练文件。

6.1 数据收集

首先,需要在项目文件夹中创建一个名为 dataset 的文件夹,用于保存所有的人脸数据文件。以下是创建人脸数据集的Python程序:

import cv2
import os
# 从相机获取视频流
cam = cv2.VideoCapture(0)
# 设置视频宽度
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
# 设置视频高度
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 初始化人脸检测器分类器
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 输入每个人的人脸ID
face_id = input('\n enter user id and press <return>')
print("\n [INFO] Initializing face capture. Look the camera and wait ...")
count = 0
while True:
    ret, img = cam.read()
    img = cv2.flip(img, -1)  # 垂直翻转视频图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        count += 1
        cv2.imwrite("dataset/" + str(face_id) + '.' + str(count) + ".jpg", gray[y:y + h, x:x + w])
        cv2.imshow('image', img)
    k = cv2.waitKey(100) & 0xff
    if k == 27:  # 按下Esc键退出程序
        break
    elif count >= 10:  # 收集10个样本后退出程序
        break
# 释放相机并关闭所有窗口
cam.release()
cv2.destroyAllWindows()

总结

本文详细介绍了OpenCV的安装、人脸识别所需包的安装、OpenCV的基本操作、图像变换、颜色空间以及基于人脸识别的门锁系统的数据收集过程。通过这些步骤,你可以开始构建自己的人脸识别门锁系统。后续还将进行识别器的训练和人脸的识别,敬请期待。

流程图

graph TD;
    A[安装OpenCV] --> B[安装人脸识别所需包];
    B --> C[学习OpenCV基础];
    C --> D[图像变换和颜色空间处理];
    D --> E[构建人脸识别门锁系统];
    E --> F[数据收集];

表格

操作 相关函数 参数说明
打开图像 imread() 文件名,颜色类型标志
显示图像 imshow() 窗口标题,图像变量
等待按键 waitKey() 等待毫秒数
关闭窗口 destroyAllWindows()
保存图像 imwrite() 文件名,图像变量
捕获视频 VideoCapture() 相机编号
保存视频 VideoWriter() 文件名,编解码器,帧率,帧大小
翻转图像 flip() 图像,翻转方向代码,目标位置(可选)
旋转图像 rotate() 图像,旋转方向
调整图像大小 resize() 图像,目标尺寸,插值类型
颜色空间转换 cvtColor() 图像,颜色空间常量

基于OpenCV的人脸识别门锁系统搭建指南

6.2 训练识别器

在收集完人脸数据后,接下来需要训练识别器。创建一个名为 Face_Trainer.py 的Python脚本,用于训练识别器并生成训练文件 trainer.yml 。以下是该脚本的代码:

import cv2
import numpy as np
from PIL import Image
import os

# 路径指向包含人脸数据的数据集文件夹
path = 'dataset'

recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");

# 函数用于获取图像和标签数据
def getImagesAndLabels(path):

    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]     
    faceSamples=[]
    ids = []

    for imagePath in imagePaths:

        PIL_img = Image.open(imagePath).convert('L') # 转换为灰度图像
        img_numpy = np.array(PIL_img,'uint8')

        id = int(os.path.split(imagePath)[-1].split(".")[0])
        faces = detector.detectMultiScale(img_numpy)

        for (x,y,w,h) in faces:
            faceSamples.append(img_numpy[y:y+h,x:x+w])
            ids.append(id)

    return faceSamples,ids

print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))

# 保存训练好的模型到 trainer.yml
recognizer.write('trainer.yml') 

# 打印已训练的人脸数量并退出程序
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))

上述代码的主要步骤如下:
1. 定义数据集文件夹的路径。
2. 创建一个LBPH(局部二值模式直方图)人脸识别器。
3. 定义一个函数 getImagesAndLabels ,用于从数据集文件夹中获取图像和对应的标签。
4. 调用该函数获取人脸样本和标签。
5. 使用获取的数据训练识别器。
6. 将训练好的模型保存为 trainer.yml 文件。

6.3 人脸识别

最后一步是进行人脸识别,创建一个名为 Face_Recog.py 的Python脚本,用于实现人脸识别功能。以下是该脚本的代码:

import cv2
import numpy as np
import os 

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);

font = cv2.FONT_HERSHEY_SIMPLEX

# 初始化ID变量
id = 0

# 这里可以根据ID定义对应的人名,例如:
names = ['None', 'User1', 'User2'] 

# 从相机获取视频流
cam = cv2.VideoCapture(0)
cam.set(3, 640) # 设置视频宽度
cam.set(4, 480) # 设置视频高度

# 定义最小窗口大小以检测人脸
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)

while True:

    ret, img =cam.read()
    img = cv2.flip(img, -1) # 垂直翻转图像

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale( 
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5,
        minSize = (int(minW), int(minH)),
       )

    for(x,y,w,h) in faces:

        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)

        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])

        # 检查置信度
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))
        else:
            id = "unknown"
            confidence = "  {0}%".format(round(100 - confidence))

        cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
        cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)  

    cv2.imshow('camera',img) 

    k = cv2.waitKey(10) & 0xff # 按 'ESC' 退出程序
    if k == 27:
        break

# 释放资源
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

上述代码的主要步骤如下:
1. 读取训练好的识别器模型 trainer.yml
2. 初始化人脸检测器。
3. 从相机获取视频流。
4. 在每一帧中检测人脸。
5. 对检测到的人脸进行识别,并根据置信度判断是否为已知人脸。
6. 在图像上绘制矩形框和显示识别结果。
7. 按 ESC 键退出程序。

总结

本文全面介绍了基于OpenCV搭建人脸识别门锁系统的详细步骤,包括OpenCV及相关依赖的安装、图像和视频的基本操作、图像变换和颜色空间处理,以及人脸识别门锁系统的数据收集、识别器训练和人脸识别等核心环节。通过按照这些步骤操作,你可以成功构建一个属于自己的人脸识别门锁系统。

流程图

graph TD;
    F[数据收集] --> G[训练识别器];
    G --> H[人脸识别];
    H --> I[完成门锁系统搭建];

表格

脚本名称 功能 关键操作
dataset.py 收集人脸数据 打开相机,检测人脸,保存人脸图像到数据集文件夹
Face_Trainer.py 训练识别器 从数据集文件夹读取人脸数据,训练LBPH识别器,生成 trainer.yml 文件
Face_Recog.py 进行人脸识别 读取 trainer.yml 文件,从相机获取视频流,检测并识别人脸,显示识别结果
本文旨在系统阐述利用MATLAB平台执行多模态语音分离任务的方法,重点围绕LRS3数据集的数据生成流程展开。LRS3(长时RGB+音频语音数据集)作为一个规模庞大的视频与音频集合,整合了丰富的视觉与听觉信息,适用于语音识别、语音分离及情感分析等多种研究场景。MATLAB凭借其高效的数值计算能力与完备的编程环境,成为处理此类多模态任务的适宜工具。 多模态语音分离的核心在于综合利用视觉与听觉等多种输入信息来解析语音信号。具体而言,该任务的目标是从混合音频中分离出不同说话人的声音,并借助视频中的唇部运动信息作为辅助线索。LRS3数据集包含大量同步的视频与音频片段,提供RGB视频、单声道音频及对应的文本转录,为多模态语音处理算法的开发与评估提供了重要平台。其高质量与大容量使其成为该领域的关键资源。 在相关资源包中,主要包含以下两部分内容: 1. 说明文档:该文件详细阐述了项目的整体结构、代码运行方式、预期结果以及可能遇到的问题与解决方案。在进行数据处理或模型训练前,仔细阅读此文档对正确理解与操作代码至关重要。 2. 专用于语音分离任务的LRS3数据集版本:解压后可获得原始的视频、音频及转录文件,这些数据将由MATLAB脚本读取并用于生成后续训练与测试所需的数据。 基于MATLAB的多模态语音分离通常遵循以下步骤: 1. 数据预处理:从LRS3数据集中提取每段视频的音频特征与视觉特征。音频特征可包括梅尔频率倒谱系数、感知线性预测系数等;视觉特征则涉及唇部运动的检测与关键点定位。 2. 特征融合:将提取的音频特征与视觉特征相结合,构建多模态表示。融合方式可采用简单拼接、加权融合或基于深度学习模型的复杂方法。 3. 模型构建:设计并实现用于语音分离的模型。传统方法可采用自适应滤波器或矩阵分解,而深度学习方法如U-Net、Transformer等在多模态学习中表现优异。 4. 训练与优化:使用预处理后的数据对模型进行训练,并通过交叉验证与超参数调整来优化模型性能。 5. 评估与应用:采用信号失真比、信号干扰比及信号伪影比等标准指标评估模型性能。若结果满足要求,该模型可进一步应用于实际语音分离任务。 借助MATLAB强大的矩阵运算功能与信号处理工具箱,上述步骤得以有效实施。需注意的是,多模态任务常需大量计算资源,处理大规模数据集时可能需要对代码进行优化或借助GPU加速。所提供的MATLAB脚本为多模态语音分离研究奠定了基础,通过深入理解与运用这些脚本,研究者可更扎实地掌握语音分离的原理,从而提升其在实用场景中的性能表现。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值