OpenCV人脸识别实例

谁借莪1个温暖的怀抱¢ 2022-09-05 05:25 336阅读 0赞

文章目录

  • 1.图片基本处理
  • 2.图片和视频人脸检测
  • 3.训练数据和人脸识别

2020年5月29日学习了b站 人脸识别的简单教程,笔记记录于此

1.图片基本处理

  1. import cv2 as cv
  2. # 读取图片,路径中不能有中文
  3. img = cv.imread('img.jpg')
  4. # 显示图片
  5. cv.imshow('BGR_img', img)
  6. # 修改图片尺寸
  7. resize_img = cv.resize(img, dsize=(210, 210))
  8. print('原来图片的尺寸', img.shape, '\n修改后的图片尺寸', resize_img.shape)
  9. """ 原来图片的尺寸 (689, 690, 3) 修改后的图片尺寸 (210, 210, 3) """
  10. # 将图片灰度转换
  11. gray_img = cv.cvtColor(resize_img, cv.COLOR_BGR2GRAY)
  12. cv.imshow('gray_img', gray_img)
  13. # 保存图片
  14. cv.imwrite('gray_img.jpg', gray_img)
  15. # 只有输入q的时候退出q
  16. # while True:
  17. # if ord('q') == cv.waitKey(0):
  18. # break
  19. # 等待键盘的输入,单位为毫秒,传入0无限等待
  20. cv.waitKey(3000)
  21. # opencv底层是C++语言,使用完内存必须释放内存
  22. cv.destroyAllWindows()

2.图片和视频人脸检测

  1. import cv2 as cv
  2. def face_detect_demo(img):
  3. # 将图片转换为灰度
  4. gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  5. # 加载特征数据
  6. face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
  7. # faces = face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=2,maxSize=(42,42),minSize=(28,28))
  8. faces = face_detector.detectMultiScale(gray)
  9. for x, y, w, h in faces:
  10. # 绘制矩形边框
  11. cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 255, 0), thickness=2)
  12. # 绘制圆形边框
  13. cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2)
  14. cv.imshow('result', img)
  15. # 加载图片
  16. img = cv.imread('face.jpg')
  17. face_detect_demo(img)
  18. cv.waitKey(0)
  19. cv.destroyAllWindows()
  20. # 读取视频
  21. cap = cv.VideoCapture('video.mp4')
  22. while True:
  23. flag, frame = cap.read()
  24. print('flag:', flag, 'frame.shape:', frame.shape)
  25. if not flag:
  26. break
  27. face_detect_demo(frame)
  28. if ord('q') == cv.waitKey(10):
  29. break
  30. cv.destroyAllWindows()
  31. cap.release()

多张人脸时检测效果不好
在这里插入图片描述

3.训练数据和人脸识别

  1. import os
  2. import cv2 as cv
  3. import PIL.Image
  4. import numpy as np
  5. def getImageAndLabels(path):
  6. facesSamples = []
  7. ids = []
  8. imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
  9. print(imagePaths)
  10. # 检测人脸
  11. face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
  12. # 遍历列表中所有图片
  13. for imagePath in imagePaths:
  14. # 打开图片
  15. PIL_img = PIL.Image.open(imagePath).convert('L')
  16. # 将图像转换为数组
  17. img_numpy = np.array(PIL_img, 'uint8')
  18. faces = face_detector.detectMultiScale(img_numpy)
  19. # 获取每张图片的id
  20. id = int(os.path.split(imagePath)[1].split('.')[0])
  21. for x, y, w, h in faces:
  22. # 人脸区域切片
  23. facesSamples.append(img_numpy[y:y+h, x:x+h])
  24. ids.append(id)
  25. return facesSamples, ids
  26. if __name__ == '__main__':
  27. # 1.训练数据
  28. path = './data/jm/' # 图片路径
  29. # 获取图像数组和id标签数组
  30. faces, ids = getImageAndLabels(path)
  31. # 获取训练对象,加载训练集数据集文件
  32. recognizer = cv.face.LBPHFaceRecognizer_create()
  33. recognizer.train(faces, np.array(ids))
  34. # 保存文件
  35. recognizer.write('trainer/trainer.yml')
  36. # 2.人脸识别
  37. # 读取已经训练好的文件
  38. recognizer.read('trainer/trainer.yml')
  39. # 准备识别的图片
  40. img = cv.imread('11.pgm')
  41. gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
  42. face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
  43. faces = face_detector.detectMultiScale(gray)
  44. for x, y, w, h in faces:
  45. cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
  46. # 人脸识别
  47. id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
  48. print('标签id:', id, '置信评分:', confidence)
  49. cv.imshow('result', img)
  50. cv.waitKey(0)
  51. cv.destroyAllWindows()

输出结果:
在这里插入图片描述

  1. ['./data/jm/1.pgm', './data/jm/10.pgm', './data/jm/11.pgm', './data/jm/12.pgm', './data/jm/13.pgm', './data/jm/14.pgm', './data/jm/15.pgm', './data/jm/2.pgm', './data/jm/3.pgm', './data/jm/4.pgm', './data/jm/5.pgm', './data/jm/6.pgm', './data/jm/7.pgm', './data/jm/8.pgm', './data/jm/9.pgm']
  2. 标签id: 11 置信评分: 0.0

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读

    相关 opencv+ArcFace人脸识别

    前几天逛知乎看到有免费的工具来做人脸识别,觉得很有意思;心血来潮,想自己也搞一个人脸识别;不得不说[虹软ArcFace][ArcFace]真的是太好用了;对于我这种完全不懂人脸

    相关 opencv人脸识别

    我的劳动成果。 1.成功安装了opencv ,可是它还要编译。我放弃。 2.成功训练自己的人脸分类器。(虽然数据是别人的,算法也是系统写好的,图形库也是别人调好的)虽然识别

    相关 opencv人脸识别

    opencv人脸识别: 首先我们来简单的讲一下人脸识别流程:这里采用的是vs2017+opencv3.3扩展库 1、进行人脸检测 2、识别器训练与分类 3、人脸检测