行业知识
Python的人脸识别设计史上最全的教程,手把手教(附源代码)
2026-11-11 08:57:09
来源:互联网转载
首先要下载人脸识别模块,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) 与半径rx,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 cvdef 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): breakcv.destroyAllWindows()cap.release()# 水平镜像翻转,cv.img(图片,轴) 0:水平轴 1:垂直轴# img = cv.flip(img, 1) 检测视频中的人脸
import cv2 as cvdef 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): breakcap.release()cv.destroyWindow() 训练人脸识别模型
# 导入模块import osimport numpy as npimport 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 cvimport osimport 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 cvimport numpy as npimport time# 打开摄像头cap = cv.VideoCapture(0, cv.CAP_DSHOW)# 创建人脸检测器face_deteceor = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')# 创建idid = 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 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 10: print('successfully!!') break img = cv2.imread('my data/1.jpeg') cv2.imshow('my data/1.jpeg' , img) if ord('q') == cv2.waitKey(1): breakcap.release( )cv2.destroyAllWindows( )
下一篇:怎么架设游戏服务器ip?