基于OpenCV的人脸识别门锁系统搭建指南
1. OpenCV安装
OpenCV的安装方式有两种:使用Python的包管理器pip安装,或者从源代码编译安装。从源代码安装能让你对OpenCV的配置有最大的控制权,但这也是最困难且最耗时的方法。如果你想最快地在系统上安装OpenCV,可通过pip进行安装。以下是具体步骤:
1.
更新和升级Raspbian操作系统包
:
sudo apt-get update
sudo apt-get upgrade
- 重启树莓派,并安装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
- 安装NumPy :NumPy是Python中科学计算的基础包,图像包含像素数据数组,NumPy便于对这些数据进行高级数学和其他类型的操作。使用以下命令安装:
pip3 install numpy
- 在树莓派上安装OpenCV :
pip3 install opencv-contrib-python==4.1.0.25
安装成功后,打开Python命令行,输入
import cv2
,然后输入
print(cv.__version__)
来测试安装情况。如果导入失败,可以在互联网上搜索错误信息进行故障排除。
2. 人脸识别所需包的安装
由于要使用人脸识别来构建门锁系统,还需要安装一些人脸识别所需的包:
1.
安装dlib
:dlib是一个现代工具包,包含用于解决现实世界问题的机器学习算法和工具。使用以下命令安装:
pip3 install dlib
- 安装face_recognition模块 :该库用于通过命令行从Python中识别和处理人脸。
pip3 install face_recognition
- 安装imutils :imutils包含基本的图像处理功能,如平移、旋转、调整大小、骨架化和显示Matplotlib图像。
pip3 install imutils
- 安装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
文件,从相机获取视频流,检测并识别人脸,显示识别结果
|
超级会员免费看
905

被折叠的 条评论
为什么被折叠?



