上一部分我们解决了环境问题,这一部分我们可以开始上代码,环境没有配好的可以参照上一篇博客:环境搭建解决:
下面先说一下原理:
一.原理部分
本文基于opencv来实现人脸识别,大致实现流程可以描述为:
当计算机拿到你输入的图片以后,首先对整个图片先进行灰度处理,即将图片拆解成一个矩阵,矩阵中的每个元素分别代表着图片中每个像素点的像素值,映射范围是0~255,再提取图片中人脸的部分将其框出,然后提取图片特征,即把人脸那一块数据提取出来,经过多个人脸的特征数据和图片的id进行对应,经过大量数据的训练后,计算机就可以生成人脸识别模型,然后再调用视频,图片或者摄像头就可以识别出来图片里的人是谁。
在opencv中筛选人脸的代码在刚刚下载好的opencv文件夹中,找到刚刚下载好的opencv文件夹,打开source—>data—>haarcascades,找到里面的haarcascade_frontalface_alt2.xml或者haarcascade_frontalface_default.xml
这两个代码的作用都是将图片中人脸的信息框选出来,以我自己的电脑为例
在写代码的时候调用这两个中的一个就好,就例如在这里我们调用的是_alt2,还有就是这个路径中不能出现中文,否则会报错,所以opencv最好不要安装到文件名中带有中文的文件夹里。
二.代码部分
首先安装必备的包
这几个包必须有,因为在中间做计算的时候会用到
数据训练的代码
import os
from os import listdir
import cv2
from PIL import Image # 如果这里报错了就下载Image,因为我用的是python3,PIL在python3里被Pillow取代了,但是Pillow里没有Image
import numpy as np
import contrib
def getImageAndLabels(path):
#存储人脸数据
faceSamples = []
#存储姓名数据
ids = []
imagePaths = [os.path.join(path,f) for f in listdir(path)]
#加载分类器
face_detector = cv2.CascadeClassifier('D:/OpenCV/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml') # 人脸检测文件
#遍历列表中的图片
for imagePaths in imagePaths: #要求每一张图片里只能有一张人脸
#打开图片
#灰度化PIL有九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F, 1打开方式为是黑白,L是打开方式是灰度图像
PIL_img = Image.open(imagePaths).convert('L') #灰度打开图像,相当于cv.imread然后再用cv.cvtColor对图像进行灰度转换,把像素范围界定在0~255
#将图片转换为数组,以黑白深浅。就是将图片向量化,把图片的每一个像素点变成一个数值,用这个数值进行判别计算
img_numpy = np.array(PIL_img,'uint8')
#获取图片人脸特征
faces = face_detector.detectMultiScale(img_numpy) #img_numpy是整张图片,然后将整张图片中人脸的那一块小数组提取出来存到faces里面
#获取每张图片id和姓名
id = int(os.path.s