opencv:70行代码实现人脸识别(附源码)
2024.09.29 07:47浏览量:205简介:关于使用opencv实现人脸识别的代码介绍
文心大模型4.5及X1 正式发布
百度智能云千帆全面支持文心大模型4.5 API调用,文心大模型X1即将上线
【导读】:本文主要介绍如何基于opencv来实现一个人脸检测和人脸分类器。该人脸识别和人脸分类器可以应用于考勤打卡,人机交互,城市安防等多个领域。
我们的代码目录结构如下所示:
使用教程目录:
- 数据准备
- 环境准备
- 代码实现
- 效果展示
- 获取源码
▍数据准备
首先,我们需要准备一些人脸数据,这些数据可以通过拍照或者从网络上收集到。所有的人脸图像都将以灰度图(pgm)的形式存储在face_data文件夹中。
下面代码可以帮我们将原始图片转化成我们所需的图片格式:灰度图和固定尺寸200200。
*代码中需要自定两个参数:
- dir_path:原始图片的存放位置;
- save_path:转化后图片的存放位置;
dir_path = './orignial_data/stranger_facedata'
save_path = './face_data/stranger/%s.pgm'
image_height = 200
image_width = 200
directory_path = dir_path + "/*g"
files = glob.glob( directory_path ) #得到该类别样本路径下的所有文件名
print(files)
count = 0
for f in files:
print(f)
image = cv2.imread(f, cv2.IMREAD_GRAYSCALE) #在stranger_facedata里面读取的数据有灰度的也有彩色的
image = cv2.resize( image, (image_width, image_height) )
print(image.shape)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite( save_path % str(count), image)
count += 1
转化后的图片格式如下所示:
在face_data目录下,按照人名存放每个需要识别的人脸图片;在本示例中:joe为要识别的人脸;stranger为陌生人的人脸图片。当然,我们也可以在face_data目录下多新建一个文件夹(me),然后存放自己的人脸图片,用于识别自己的人脸。
▍环境准备
此处默认已安装python>=3.7版本运行环境,在命令行中通过pip安装如下版本的python依赖库:
pip install opencv-python
pip install opencv-contrib-python
pip install numpy
▍代码实现
在本示例中,我们提供多种训练好的级联分类器,我们将级联分类器放于cascades目录下。除了训练好的人脸识别器外,还有眼睛识别,表情识别等分类器可自行指定。
在下面代码中,我们主要使用人脸识别分类器:haarcascade_frontalface_default.xml,来实现人脸检测和识别。
- 导入代码必要的依赖库
import os
import sys
import cv2
import numpy as np
2. 根据实际情况指定代码参数
- names:定义识别的人脸数据库人名;
- path:指定人脸数据库的路径;
- cascade:指定opencv的预训练分类器路径;在本示例中使用训练好的人脸定位级联分类器haarcascade_frontalface_default.xml。
names = ['joe', 'stranger']
path = "./face_data/"
cascade = './cascades/haarcascade_frontalface_default.xml'
3. 读取人脸数据库
c = 0
X, y = [], []
for dirname, dirnames, filenames in os.walk(path):
print(f"读取人脸数据库:{dirname}")
for subdirname in dirnames:
subject_path = os.path.join(dirname, subdirname)
for filename in os.listdir(subject_path):
try:
if (filename == ".directory"):
continue
filepath = os.path.join(subject_path, filename)
im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)
if (im is None):
print("image " + filepath + " is none")
else:
print(filepath)
X.append(c)
y.append(c)
except IOError as e: # python2到python3的修改
print("I/O error({0}): {1}".format(e.errno, e.strerror)) # python2到python3的修改
except:
print("Unexpected error:", sys.exc_info()[0])
raise
c = c + 1
print("done!")
4. 加载opencv预训练分类器
y = np.asarray(y, dtype=np.int32)
model = cv2.face.EigenFaceRecognizer_create()
model.train(np.asarray(X), np.asarray(y))
camera = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier(cascade)
5. 实时捕捉 流中的人脸进行识别
略:剩下20行代码即可实现下图效果
▍效果展示
▍获取源码
文章中有任何问题欢迎评论区讨论交流。本案例代码经过严格调试,安装好运行环境之后可以一键运行。代码跑不通可评论区留言或私信解决。
发表评论
登录后可评论,请前往 登录 或 注册