opencv:70行代码实现人脸识别(附源码)

【导读】:本文主要介绍如何基于opencv来实现一个人脸检测和人脸分类器。该人脸识别和人脸分类器可以应用于考勤打卡,人机交互,城市安防等多个领域。

我们的代码目录结构如下所示:
在这里插入图片描述
代码使用讲解:

  1. 数据准备
  2. 环境准备
  3. 代码实现
  4. 效果展示
  5. 获取源码

▍数据准备

首先,我们需要准备一些人脸数据,这些数据可以通过拍照或者从网络上收集到。所有的人脸图像都将以灰度图(pgm)的形式存储在face_data文件夹中。
下面代码可以帮我们将原始图片转化成我们所需的图片格式:灰度图和固定尺寸200*200。

代码中需要自定两个参数:

  • 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,来实现人脸检测和识别。

  1. 导入代码必要的依赖库
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行代码

▍效果展示

▍获取源码

文章中有任何问题欢迎评论区讨论交流。本案例代码经过严格调试,安装好运行环境之后可以一键运行。代码跑不通可评论区留言或私信解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值