Python的人脸识别设计史上最全的教程,手把手教(附源代码)

沉稳的紫外线 2024-07-06 14:05:01 阅读 68

首先要下载人脸识别模块,win+R后输入cmd在控制台下载

 

先是读取图片功能

<code># 导入OpenCV模块

import cv2 as cv

# 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败

img = cv.imread('pictures/AI.jpeg')

# 显示图片 参数:窗口的名称,所要显示的图片

cv.imshow('AI_img', img)

# 等待键盘输入 单位毫秒 传入0 则就是无限等待

cv.waitKey(0)

# 销毁窗体,释放内存

cv.destroyAllWindows()

图片灰度转换

为什么要用图片灰度转换呢,他会将人脸转变为矩阵,不同的颜色会有1到16个数字对应他不同颜色的深浅

# 导入OpenCV模块

import cv2 as cv

# 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败

img = cv.imread('pictures/AI.jpeg')

# 显示图片 参数:窗口的名称,所要显示的图片

cv.imshow('AI_img', img)

# 将图片灰度转换 参数:所要转换的图片,指定转换为灰度图

gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 显示图片

cv.imshow('gray_AI_img', gray_img)

# 保存图片

cv.imwrite('pictures/gray_AI_img.jpeg', gray_img)

# 等待键盘输入

cv.waitKey(0)

# 销毁窗体,释放内存

cv.destroyAllWindow()

修改图片尺寸

# 导入OpenCV模块

import cv2 as cv

# 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败

img = cv.imread('pictures/AI.jpeg')

# 显示图片 参数:窗口的名称,所要显示的图片

cv.imshow('AI_img', img)

print('before:', img.shape)

# 修改图片尺寸 参数:所要修改的图片,新尺寸

resize_img = cv.resize(img, dsize=(500,500))

print('after:', resize_img.shape)

# 显示修改好的尺寸图片

cv.imshow('resize_AI_img', resize_img)

# 等待键盘输入

cv.waitKey(0)

# 销毁窗体,释放内存

cv.destroyAllWindow()

绘制形状

# 导入OpenCV模块

import cv2 as cv

# 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败

img = cv.imread('pictures/AI.jpeg')

# 左上角的坐标是(x,y) 矩形的宽度和高度是(w,h)

x,y,w,h = 150,150,150,150

# 绘制矩形

cv.rectangle(img, (x,y,x+w,y+h), color=(0, 255, 255), thickness= 6)

'''

# 圆中心点坐标(x,y) 与半径r

x,y,r = 300,300,150

# 绘制圆 参数:所要绘制的图片,坐标与尺寸,颜色的RGB值,线的粗度

cv.circle(img, center=(x,y), radius=r, color=(0,255,255), thickness=2)

'''

# 显示绘制后的图片

cv.imshow('new_img', img)

# 等待键盘输入

cv.waitKey(0)

# 销毁窗体,释放内存

cv.destroyAllWindow()

单个人脸识别

# 导入OpenCV模块

import cv2 as cv

# 人脸识别的函数

def face_detect_demo(img):

# 将图片转换为灰度图片

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

# 创建级联分类器,通过该分类器检测人脸 参数:特征数据

face_detector = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')

# 检测人脸并返回人脸信息

faces = face_detector.detectMultiScale(gray)

# 遍历人脸信息获取 xX轴坐标 yY轴坐标 w宽度 h高度

for x,y,w,h in faces:

# 通过矩形框出图片人脸部分

cv.rectangle(img , (x , y) , (x+w , y+h) , color=(0 , 255 , 0) , thickness=2)

cv.imshow('result_img' , img)

# 加载图片

img = cv.imread('pictures/face1.jpeg')

# 调用人脸识别函数

face_detect_demo(img)

# 等待键盘输入

cv.waitKey(0)

# 销毁窗体,释放内存

cv.destroyAllWindow()

多个人脸识别

# 导入OpenCV模块

import cv2 as cv

# 人脸识别的函数

def face_detect_demo(img):

# 将图片转换为灰度图片

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

# 加载特征数据

face_detector = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')

# 检测人脸并返回人脸信息

faces = face_detector.detectMultiScale(gray)

for x,y,w,h in faces:

print(x,y,w,h)

cv.rectangle(img, (x,y), (x+w, y+h), color = (0,255,0), thickness=2)

# "/" 表示浮点数出发,返回浮点结果;6/4=1.5

# “//” 表示整数出发,返回不大于结果的一共最大的整数:6//4=1

cv.circle(img, center = (x+w//2, y+h//2), radius = w//2, color=(0,255,0), thickness=2)

# 显示图片

cv.imshow('result', img)

# 加载图片

img = cv.imread('pictures/face3.jpg')

# 调用人脸检测方法

face_detect_demo(img)

# 等待键盘输入

cv.waitKey(0)

# 销毁窗体,释放内存

cv.destroyAllWindow()

检测摄像头中的人脸

import cv2 as cv

def face_detect_demo(img):

gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

face_detect = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')

face = face_detect.detectMultiScale(gary)

for x, y, w, h in face:

cv.rectangle(img, (x, y), (x + w, y + h), color=(0,0,255), thickness=2)

# 水平镜像翻转,cv.图片(图片,轴) 0:水平轴 1:垂直轴

# img = cv.flip(img, 1)

img = cv.flip(img , 1)

cv.imshow('result', img)

# cv.VideoCapture(摄像头的编号, 打开摄像头的模式)

# 摄像头编号默认从0开始,每多一个摄像头,编号+1,但不绝对

# 如果你写摄像头编号为0时无法打开摄像头,可以试一下1,2,3等编号

# 打开摄像头 参数:对应优先级的摄像头,指定为打开

# cv.CAP_DSHOW:强制打开摄像头

cap = cv.VideoCapture(0, cv.CAP_DSHOW)

while True:

# 获取检测到的数据(flag是否为人脸特征数据,frame人脸特征数据)

flag,frame = cap.read()

if not flag:

break

face_detect_demo(frame)

# 按键盘Q键退出

if ord('q') == cv.waitKey(1):

break

cv.destroyAllWindows()

cap.release()

# 水平镜像翻转,cv.img(图片,轴) 0:水平轴 1:垂直轴

# img = cv.flip(img, 1)

检测视频中的人脸

import cv2 as cv

def face_detect_demo(img):

gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

face_detect = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')

face = face_detect.detectMultiScale(gary)

for x, y, w, h in face:

cv.rectangle(img, (x, y), (x + w, y + h), color=(0,0,255), thickness=2)

cv.imshow('result', img)

cap = cv.VideoCapture('Video/video.mp4')

while True:

# 读取视频中每一帧的画面

# flag为当前帧的画面是否有内容,若没有内容,则表示视频播放完毕

# frame为当前帧画面

flag,frame = cap.read()

if not flag:

break

# 检测当前帧画面的人脸

face_detect_demo(frame)

# 按键盘Q键退出

if ord('q') == cv.waitKey(1):

break

cap.release()

cv.destroyWindow()

训练人脸识别模型

# 导入模块

import os

import numpy as np

import cv2 as cv

# 获取实时人脸识别模型的训练集数据

def GetFaceImg_TrainData(path):

# 定义两个容器,存放训练集的数据和结果

# 存放训练图片数据的列表

facesSamples = [] #x_Train=[]

# 存放训练图片数据对应id的列表(以图片名为id)

ids = [] #y_Train=[]

# 再定义一共容器,来存储人脸图片的路径

imagePaths = []

# 遍历传入的路径中的所有的文件,来获得这些文件的路径,存到容器中

for f in os.listdir(path):

# 根据路径跟名称,就能够拼接成文件的完整路径

fPath = os.path.join(path, f)

# 将文件的完整路径存储到容器中去

imagePaths.append(fPath)

# 创建人脸检测器(人脸检测模型)

face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')

# 遍历指定路径下的所有图片

for imagePath in imagePaths:

# 读取本地图片

img = cv.imread(imagePath)

# 把图片转换为灰度图

PIL_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 把图片转变为像素点矩阵

img_numpy = np.array(PIL_img)

# 检测人脸,并获得人脸信息

faces = face_detector.detectMultiScale(img_numpy)

# 获得当前图片的文件名id

id = int(os.path.split(imagePath)[1].split('.')[0])

# 遍历当前张图片中的所有人脸,存储人脸的数据和结果

for x,y,w,h in faces:

# 从当前图片中把人脸矩阵数据切片出来,并存到容器中去

facesSamples.append(img_numpy[y:y+h, x:x+w])

# 存储当前人脸对应结果

ids.append(id)

# 返回人脸数据,以及结果

return facesSamples, ids

# 建立模型,把模型保存到本地

if __name__ == '__main__':

# 训练集数据与结果

x_Train, y_Train = GetFaceImg_TrainData('mydata2')

# 建立模型

faceModel = cv.face.LBPHFaceRecognizer_create()

# 训练模型

faceModel.train(x_Train, np.array(y_Train))

# 来保存模型本地

faceModel.write('trainer/faceModel.yml')

用模型来识别人脸

# 导入模块

import cv2 as cv

import os

import numpy as np

'''

# 展示刚刚建模后使用data文件夹内的15张图片

fnames = os.listdir('data')

for fname in fnames:

fpath = os.path.join('data' , fname)

img = cv.imread(fpath)

cv.imshow(fname , img)

# 等待按键输入

cv.waitKey(0)

# 关闭所有窗口

cv.destroyAllWindows( )

'''

# 1.创建模型

faceModel = cv.face.LBPHFaceRecognizer_create()

# 2.读取保存在本地的模型

faceModel.read('trainer/faceModel.yml')

# 3.使用模型来识别人脸,看人脸更接近哪张图片

# (1) 读取人脸图片

img = cv.imread('data/7.pgm')

# (2) 从人脸图片中获取人脸部分的像素矩阵

# 1) 将原图转换为灰度图

gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 2) 创建人脸检测器(另一个模型)

face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')

# 3) 检测人脸,获得人脸的位置信息

faces = face_detector.detectMultiScale(gray_img)

# 4) 通过人脸的位置信息,来获得人脸部分的像素矩阵

for x,y,w,h in faces:

# (3) 把人脸的像素矩阵给模型进行识别

result, score = faceModel.predict(np.array(gray_img)[y:y+h, x:x+w])

# 输出结果

print('识别结果是:', result, ',置信评分是:', score)

录入人脸

# 导入模块

import cv2 as cv

import numpy as np

import time

# 打开摄像头

cap = cv.VideoCapture(0, cv.CAP_DSHOW)

# 创建人脸检测器

face_deteceor = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')

# 创建id

id = 1

# 记录当前时间

timer = time.time()

# 死循环

while True:

# 遍历摄像头每帧画面

# flag表示摄像头是否有开启

# frame表示摄像头当前帧的画面

flag, frame = cap.read()

# 先判断摄像头是否有开启

if not flag:

break

# 将摄像头的画面转换为灰度图

gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# 对摄像头画面检测人脸

faces = face_deteceor.detectMultiScale(frame)

# 遍历摄像头画面中的人脸信息

for x,y,w,h in faces:

# 在当前帧的摄像头画面中来画矩形

cv.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255))

# 经过3s后,才开始录入人脸

if time.time() - timer <= 3 :

continue

if id>10:

print(' 已经录入完毕')

else:

print('开始录入人脸')

# 来将灰度图取出人脸部分的图像

face_frame = np.array(gray_frame[y:y+h, x:x+w])

# 把人脸图像存到本地中去

cv.imwrite(f'my data/{id}.jpeg', face_frame)

# id+=1

id +=1

# 将摄像头的画面水平翻转

newFrame = cv.flip(frame, 1)

# 来把摄像头的画面通过opencv绘制出来

# 参数:窗口名称 , 要显示的图像

cv.imshow('CAP', newFrame)

# 停留一下

cv.waitKey(1)

在摄像头中识别人脸

# 导入模型

import cv2 as cv

# 打开摄像头

cap = cv.VideoCapture(0, cv.CAP_DSHOW)

# 创建人脸检测器

face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')

# 创建人脸识别的模型

faceModel =cv.face.LBPHFaceRecognizer_create()

faceModel.read('trainer/faceModel.yml')

# 遍历摄像头每帧画面,进行显示

while True:

# 获取摄像头当前帧画面

flag, frame = cap.read()

# 判断摄像头是否有开启

if not flag:

break

# 把摄像头的画面转换为灰度图

gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# 检测摄像头画面中的人脸

faces = face_detector.detectMultiScale(frame)

# 遍历人脸信息

for x,y,w,h in faces:

# 框出人脸

cv.rectangle(frame , (x , y) , (x+w , y+h) , color=(0 , 255 , 255))

# 来把摄像头画面中人脸部分切片出来

face_frae = gray_frame[y:y+h, x:x+w]

# 把切片的这部分来给人脸识别模型进行识别 ,然后将识别结果输出出来

id,score = faceModel.predict(face_frae)

'''print('识别到图片id为:', id, ',差距值是', score)'''

if score <= 50:

print('识别为:', id)

else:

print('识别失败')

# 水平翻转模型

newFrame = cv.flip(frame, 1)

# 如果有,则显示摄像头画面

cv.imshow('CAP', newFrame)

# 停留一会

cv.waitKey(1)

 

 

 

综合基本功能

1.通过opencv打开摄像头;

2.来获取摄像头中人脸部分的图像,保存到项目的MyData文件夹内;

3.图像的以数字来命名,例如:1.jepg、2.jpeg、3.jpeg等;

4.保存10张人脸图片即可,保存10张后,输出已保存10张人脸图像;

5.使用最新录制的人脸图像的文件夹MyData,来训练新的人脸识别模型;

6.打开摄像头,使用最新的人脸识别模型,来识别摄像头画面中的人脸,识别人脸更接近哪个id的图像,以及它的评分,将id和评分输出出来。

 

 

# 导入模块

import cv2

cap = cv2.VideoCapture(0)

face = cv2.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')

a = 1

while (1):

flag , frame = cap.read( )

gray = cv2.cvtColor(frame , cv2.COLOR_RGB2GRAY)

faces = face.detectMultiScale(gray)

for x , y , w , h in faces:

cv2.rectangle(frame, (x, y), (x+w, y+h), color=(0, 255, 255), thickness=2)

img = cv2.flip(frame , 1)

if flag == True:

cv2.imwrite(f'my data/{a}.jpeg' , img)

a += 1

if a > 10:

print('successfully!!')

break

img = cv2.imread('my data/1.jpeg')

cv2.imshow('my data/1.jpeg' , img)

if ord('q') == cv2.waitKey(1):

break

cap.release( )

cv2.destroyAllWindows( )

 

 

 

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。