当前位置:   article > 正文

Python的人脸识别设计史上最全的教程,手把手教(附源代码)_python 摄像头人脸注册 人脸识别

python 摄像头人脸注册 人脸识别

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

 

先是读取图片功能

  1. # 导入OpenCV模块
  2. import cv2 as cv
  3. # 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败
  4. img = cv.imread('pictures/AI.jpeg')
  5. # 显示图片 参数:窗口的名称,所要显示的图片
  6. cv.imshow('AI_img', img)
  7. # 等待键盘输入 单位毫秒 传入0 则就是无限等待
  8. cv.waitKey(0)
  9. # 销毁窗体,释放内存
  10. cv.destroyAllWindows()

图片灰度转换

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

  1. # 导入OpenCV模块
  2. import cv2 as cv
  3. # 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败
  4. img = cv.imread('pictures/AI.jpeg')
  5. # 显示图片 参数:窗口的名称,所要显示的图片
  6. cv.imshow('AI_img', img)
  7. # 将图片灰度转换 参数:所要转换的图片,指定转换为灰度图
  8. gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  9. # 显示图片
  10. cv.imshow('gray_AI_img', gray_img)
  11. # 保存图片
  12. cv.imwrite('pictures/gray_AI_img.jpeg', gray_img)
  13. # 等待键盘输入
  14. cv.waitKey(0)
  15. # 销毁窗体,释放内存
  16. cv.destroyAllWindow()

修改图片尺寸

  1. # 导入OpenCV模块
  2. import cv2 as cv
  3. # 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败
  4. img = cv.imread('pictures/AI.jpeg')
  5. # 显示图片 参数:窗口的名称,所要显示的图片
  6. cv.imshow('AI_img', img)
  7. print('before:', img.shape)
  8. # 修改图片尺寸 参数:所要修改的图片,新尺寸
  9. resize_img = cv.resize(img, dsize=(500,500))
  10. print('after:', resize_img.shape)
  11. # 显示修改好的尺寸图片
  12. cv.imshow('resize_AI_img', resize_img)
  13. # 等待键盘输入
  14. cv.waitKey(0)
  15. # 销毁窗体,释放内存
  16. cv.destroyAllWindow()

绘制形状

  1. # 导入OpenCV模块
  2. import cv2 as cv
  3. # 读取图片 参数:图片路径(注意:路径中不能有中文,否则图片加载失败
  4. img = cv.imread('pictures/AI.jpeg')
  5. # 左上角的坐标是(x,y) 矩形的宽度和高度是(w,h)
  6. x,y,w,h = 150,150,150,150
  7. # 绘制矩形
  8. cv.rectangle(img, (x,y,x+w,y+h), color=(0, 255, 255), thickness= 6)
  9. '''
  10. # 圆中心点坐标(x,y) 与半径r
  11. x,y,r = 300,300,150
  12. # 绘制圆 参数:所要绘制的图片,坐标与尺寸,颜色的RGB值,线的粗度
  13. cv.circle(img, center=(x,y), radius=r, color=(0,255,255), thickness=2)
  14. '''
  15. # 显示绘制后的图片
  16. cv.imshow('new_img', img)
  17. # 等待键盘输入
  18. cv.waitKey(0)
  19. # 销毁窗体,释放内存
  20. cv.destroyAllWindow()

单个人脸识别

  1. # 导入OpenCV模块
  2. import cv2 as cv
  3. # 人脸识别的函数
  4. def face_detect_demo(img):
  5. # 将图片转换为灰度图片
  6. gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  7. # 创建级联分类器,通过该分类器检测人脸 参数:特征数据
  8. face_detector = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
  9. # 检测人脸并返回人脸信息
  10. faces = face_detector.detectMultiScale(gray)
  11. # 遍历人脸信息获取 xX轴坐标 yY轴坐标 w宽度 h高度
  12. for x,y,w,h in faces:
  13. # 通过矩形框出图片人脸部分
  14. cv.rectangle(img , (x , y) , (x+w , y+h) , color=(0 , 255 , 0) , thickness=2)
  15. cv.imshow('result_img' , img)
  16. # 加载图片
  17. img = cv.imread('pictures/face1.jpeg')
  18. # 调用人脸识别函数
  19. face_detect_demo(img)
  20. # 等待键盘输入
  21. cv.waitKey(0)
  22. # 销毁窗体,释放内存
  23. cv.destroyAllWindow()

多个人脸识别

  1. # 导入OpenCV模块
  2. import cv2 as cv
  3. # 人脸识别的函数
  4. def face_detect_demo(img):
  5. # 将图片转换为灰度图片
  6. gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  7. # 加载特征数据
  8. face_detector = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
  9. # 检测人脸并返回人脸信息
  10. faces = face_detector.detectMultiScale(gray)
  11. for x,y,w,h in faces:
  12. print(x,y,w,h)
  13. cv.rectangle(img, (x,y), (x+w, y+h), color = (0,255,0), thickness=2)
  14. # "/" 表示浮点数出发,返回浮点结果;6/4=1.5
  15. # “//” 表示整数出发,返回不大于结果的一共最大的整数:6//4=1
  16. cv.circle(img, center = (x+w//2, y+h//2), radius = w//2, color=(0,255,0), thickness=2)
  17. # 显示图片
  18. cv.imshow('result', img)
  19. # 加载图片
  20. img = cv.imread('pictures/face3.jpg')
  21. # 调用人脸检测方法
  22. face_detect_demo(img)
  23. # 等待键盘输入
  24. cv.waitKey(0)
  25. # 销毁窗体,释放内存
  26. cv.destroyAllWindow()

检测摄像头中的人脸

  1. import cv2 as cv
  2. def face_detect_demo(img):
  3. gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  4. face_detect = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
  5. face = face_detect.detectMultiScale(gary)
  6. for x, y, w, h in face:
  7. cv.rectangle(img, (x, y), (x + w, y + h), color=(0,0,255), thickness=2)
  8. # 水平镜像翻转,cv.图片(图片,轴) 0:水平轴 1:垂直轴
  9. # img = cv.flip(img, 1)
  10. img = cv.flip(img , 1)
  11. cv.imshow('result', img)
  12. # cv.VideoCapture(摄像头的编号, 打开摄像头的模式)
  13. # 摄像头编号默认从0开始,每多一个摄像头,编号+1,但不绝对
  14. # 如果你写摄像头编号为0时无法打开摄像头,可以试一下1,2,3等编号
  15. # 打开摄像头 参数:对应优先级的摄像头,指定为打开
  16. # cv.CAP_DSHOW:强制打开摄像头
  17. cap = cv.VideoCapture(0, cv.CAP_DSHOW)
  18. while True:
  19. # 获取检测到的数据(flag是否为人脸特征数据,frame人脸特征数据)
  20. flag,frame = cap.read()
  21. if not flag:
  22. break
  23. face_detect_demo(frame)
  24. # 按键盘Q键退出
  25. if ord('q') == cv.waitKey(1):
  26. break
  27. cv.destroyAllWindows()
  28. cap.release()
  29. # 水平镜像翻转,cv.img(图片,轴) 0:水平轴 1:垂直轴
  30. # img = cv.flip(img, 1)

检测视频中的人脸

  1. import cv2 as cv
  2. def face_detect_demo(img):
  3. gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  4. face_detect = cv.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
  5. face = face_detect.detectMultiScale(gary)
  6. for x, y, w, h in face:
  7. cv.rectangle(img, (x, y), (x + w, y + h), color=(0,0,255), thickness=2)
  8. cv.imshow('result', img)
  9. cap = cv.VideoCapture('Video/video.mp4')
  10. while True:
  11. # 读取视频中每一帧的画面
  12. # flag为当前帧的画面是否有内容,若没有内容,则表示视频播放完毕
  13. # frame为当前帧画面
  14. flag,frame = cap.read()
  15. if not flag:
  16. break
  17. # 检测当前帧画面的人脸
  18. face_detect_demo(frame)
  19. # 按键盘Q键退出
  20. if ord('q') == cv.waitKey(1):
  21. break
  22. cap.release()
  23. cv.destroyWindow()

训练人脸识别模型

  1. # 导入模块
  2. import os
  3. import numpy as np
  4. import cv2 as cv
  5. # 获取实时人脸识别模型的训练集数据
  6. def GetFaceImg_TrainData(path):
  7. # 定义两个容器,存放训练集的数据和结果
  8. # 存放训练图片数据的列表
  9. facesSamples = [] #x_Train=[]
  10. # 存放训练图片数据对应id的列表(以图片名为id)
  11. ids = [] #y_Train=[]
  12. # 再定义一共容器,来存储人脸图片的路径
  13. imagePaths = []
  14. # 遍历传入的路径中的所有的文件,来获得这些文件的路径,存到容器中
  15. for f in os.listdir(path):
  16. # 根据路径跟名称,就能够拼接成文件的完整路径
  17. fPath = os.path.join(path, f)
  18. # 将文件的完整路径存储到容器中去
  19. imagePaths.append(fPath)
  20. # 创建人脸检测器(人脸检测模型)
  21. face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
  22. # 遍历指定路径下的所有图片
  23. for imagePath in imagePaths:
  24. # 读取本地图片
  25. img = cv.imread(imagePath)
  26. # 把图片转换为灰度图
  27. PIL_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  28. # 把图片转变为像素点矩阵
  29. img_numpy = np.array(PIL_img)
  30. # 检测人脸,并获得人脸信息
  31. faces = face_detector.detectMultiScale(img_numpy)
  32. # 获得当前图片的文件名id
  33. id = int(os.path.split(imagePath)[1].split('.')[0])
  34. # 遍历当前张图片中的所有人脸,存储人脸的数据和结果
  35. for x,y,w,h in faces:
  36. # 从当前图片中把人脸矩阵数据切片出来,并存到容器中去
  37. facesSamples.append(img_numpy[y:y+h, x:x+w])
  38. # 存储当前人脸对应结果
  39. ids.append(id)
  40. # 返回人脸数据,以及结果
  41. return facesSamples, ids
  42. # 建立模型,把模型保存到本地
  43. if __name__ == '__main__':
  44. # 训练集数据与结果
  45. x_Train, y_Train = GetFaceImg_TrainData('mydata2')
  46. # 建立模型
  47. faceModel = cv.face.LBPHFaceRecognizer_create()
  48. # 训练模型
  49. faceModel.train(x_Train, np.array(y_Train))
  50. # 来保存模型本地
  51. faceModel.write('trainer/faceModel.yml')

用模型来识别人脸

  1. # 导入模块
  2. import cv2 as cv
  3. import os
  4. import numpy as np
  5. '''
  6. # 展示刚刚建模后使用data文件夹内的15张图片
  7. fnames = os.listdir('data')
  8. for fname in fnames:
  9. fpath = os.path.join('data' , fname)
  10. img = cv.imread(fpath)
  11. cv.imshow(fname , img)
  12. # 等待按键输入
  13. cv.waitKey(0)
  14. # 关闭所有窗口
  15. cv.destroyAllWindows( )
  16. '''
  17. # 1.创建模型
  18. faceModel = cv.face.LBPHFaceRecognizer_create()
  19. # 2.读取保存在本地的模型
  20. faceModel.read('trainer/faceModel.yml')
  21. # 3.使用模型来识别人脸,看人脸更接近哪张图片
  22. # (1) 读取人脸图片
  23. img = cv.imread('data/7.pgm')
  24. # (2) 从人脸图片中获取人脸部分的像素矩阵
  25. # 1) 将原图转换为灰度图
  26. gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  27. # 2) 创建人脸检测器(另一个模型)
  28. face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
  29. # 3) 检测人脸,获得人脸的位置信息
  30. faces = face_detector.detectMultiScale(gray_img)
  31. # 4) 通过人脸的位置信息,来获得人脸部分的像素矩阵
  32. for x,y,w,h in faces:
  33. # (3) 把人脸的像素矩阵给模型进行识别
  34. result, score = faceModel.predict(np.array(gray_img)[y:y+h, x:x+w])
  35. # 输出结果
  36. print('识别结果是:', result, ',置信评分是:', score)

录入人脸

  1. # 导入模块
  2. import cv2 as cv
  3. import numpy as np
  4. import time
  5. # 打开摄像头
  6. cap = cv.VideoCapture(0, cv.CAP_DSHOW)
  7. # 创建人脸检测器
  8. face_deteceor = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
  9. # 创建id
  10. id = 1
  11. # 记录当前时间
  12. timer = time.time()
  13. # 死循环
  14. while True:
  15. # 遍历摄像头每帧画面
  16. # flag表示摄像头是否有开启
  17. # frame表示摄像头当前帧的画面
  18. flag, frame = cap.read()
  19. # 先判断摄像头是否有开启
  20. if not flag:
  21. break
  22. # 将摄像头的画面转换为灰度图
  23. gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
  24. # 对摄像头画面检测人脸
  25. faces = face_deteceor.detectMultiScale(frame)
  26. # 遍历摄像头画面中的人脸信息
  27. for x,y,w,h in faces:
  28. # 在当前帧的摄像头画面中来画矩形
  29. cv.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255))
  30. # 经过3s后,才开始录入人脸
  31. if time.time() - timer <= 3 :
  32. continue
  33. if id>10:
  34. print(' 已经录入完毕')
  35. else:
  36. print('开始录入人脸')
  37. # 来将灰度图取出人脸部分的图像
  38. face_frame = np.array(gray_frame[y:y+h, x:x+w])
  39. # 把人脸图像存到本地中去
  40. cv.imwrite(f'my data/{id}.jpeg', face_frame)
  41. # id+=1
  42. id +=1
  43. # 将摄像头的画面水平翻转
  44. newFrame = cv.flip(frame, 1)
  45. # 来把摄像头的画面通过opencv绘制出来
  46. # 参数:窗口名称 , 要显示的图像
  47. cv.imshow('CAP', newFrame)
  48. # 停留一下
  49. cv.waitKey(1)

在摄像头中识别人脸

  1. # 导入模型
  2. import cv2 as cv
  3. # 打开摄像头
  4. cap = cv.VideoCapture(0, cv.CAP_DSHOW)
  5. # 创建人脸检测器
  6. face_detector = cv.CascadeClassifier('Haar/haarcascade_frontalface_default.xml')
  7. # 创建人脸识别的模型
  8. faceModel =cv.face.LBPHFaceRecognizer_create()
  9. faceModel.read('trainer/faceModel.yml')
  10. # 遍历摄像头每帧画面,进行显示
  11. while True:
  12. # 获取摄像头当前帧画面
  13. flag, frame = cap.read()
  14. # 判断摄像头是否有开启
  15. if not flag:
  16. break
  17. # 把摄像头的画面转换为灰度图
  18. gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
  19. # 检测摄像头画面中的人脸
  20. faces = face_detector.detectMultiScale(frame)
  21. # 遍历人脸信息
  22. for x,y,w,h in faces:
  23. # 框出人脸
  24. cv.rectangle(frame , (x , y) , (x+w , y+h) , color=(0 , 255 , 255))
  25. # 来把摄像头画面中人脸部分切片出来
  26. face_frae = gray_frame[y:y+h, x:x+w]
  27. # 把切片的这部分来给人脸识别模型进行识别 ,然后将识别结果输出出来
  28. id,score = faceModel.predict(face_frae)
  29. '''print('识别到图片id为:', id, ',差距值是', score)'''
  30. if score <= 50:
  31. print('识别为:', id)
  32. else:
  33. print('识别失败')
  34. # 水平翻转模型
  35. newFrame = cv.flip(frame, 1)
  36. # 如果有,则显示摄像头画面
  37. cv.imshow('CAP', newFrame)
  38. # 停留一会
  39. cv.waitKey(1)

 

 

 

综合基本功能

1.通过opencv打开摄像头;

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

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

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

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

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

 

 

  1. # 导入模块
  2. import cv2
  3. cap = cv2.VideoCapture(0)
  4. face = cv2.CascadeClassifier(r'Haar/haarcascade_frontalface_default.xml')
  5. a = 1
  6. while (1):
  7. flag , frame = cap.read( )
  8. gray = cv2.cvtColor(frame , cv2.COLOR_RGB2GRAY)
  9. faces = face.detectMultiScale(gray)
  10. for x , y , w , h in faces:
  11. cv2.rectangle(frame, (x, y), (x+w, y+h), color=(0, 255, 255), thickness=2)
  12. img = cv2.flip(frame , 1)
  13. if flag == True:
  14. cv2.imwrite(f'my data/{a}.jpeg' , img)
  15. a += 1
  16. if a > 10:
  17. print('successfully!!')
  18. break
  19. img = cv2.imread('my data/1.jpeg')
  20. cv2.imshow('my data/1.jpeg' , img)
  21. if ord('q') == cv2.waitKey(1):
  22. break
  23. cap.release( )
  24. cv2.destroyAllWindows( )

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/684025
推荐阅读
相关标签
  

闽ICP备14008679号