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

avatar
作者
筋斗云
阅读量:4

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

 

先是读取图片功能

#  导入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( )  

 

 

 

 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!