当前位置:   article > 正文

opencv:从0到实现人脸识别_opencv人脸检测

opencv人脸检测

目录

opencv 人脸检查原理:

整体目录:

1.读取并展示图片

2.人脸检测

3.视频人脸检测

4.拍照保存

5 数据训练

6 人脸识别


opencv 人脸检查原理:

OpenCV 中的人脸检测是基于哈尔特征分类器(Haar Feature-based Cascade Classifiers)的方法。以下是人脸检测的基本原理:

  1. Haar特征: Haar特征是一种基于图像区域的局部特征,通常用于目标检测。这些特征可以是边缘、线、中心化的矩形等。在人脸检测中,Haar特征通常用于检测人脸的各种组成部分,如眼睛、鼻子、嘴巴等。

  2. 分类器: Haar分类器是由许多弱分类器组成的级联结构。每个弱分类器都是一个用于检测特定Haar特征的简单规则。级联结构的目的是通过逐步排除非人脸区域,从而提高检测效率。

  3. 训练: Haar分类器需要进行训练,以便学习正确的人脸和非人脸区域的特征。这个训练过程涉及使用正面人脸样本和负面非人脸样本。

  4. 级联: Haar分类器按照级联方式工作,每个级联阶段都有多个弱分类器。如果图像区域通过了所有级联阶段的检测,那么它被认为是人脸。

  5. 积分图: 为了加速Haar特征的计算,OpenCV使用了积分图(Integral Image)。积分图是对原始图像的一个预处理,使得在任何大小的窗口内计算Haar特征变得更加高效。

  6. 非极大值抑制: 为了避免多次检测同一个人脸,通常使用非极大值抑制(Non-Maximum Suppression)来筛选出具有最高置信度的人脸检测结果。

OpenCV提供了预训练的人脸检测器,其中包括了用于检测人脸的Haar级联分类器。这些分类器可以通过 cv2.CascadeClassifier 进行加载和使用。例如,常见的人脸检测器路径为 cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'。你可以使用这些已经训练好的分类器,也可以根据需要进行训练自己的分类器。

整体目录:

1.读取并展示图片

  1. import cv2 as cv
  2. img = cv.imread('face1.jpg')
  3. # 检查图像是否成功加载
  4. if img is not None:
  5. # 获取原始图像尺寸
  6. height, width = img.shape[:2]
  7. # 缩放图像为原始尺寸的50%
  8. scaled_img = cv.resize(img, (int(width/4), int(height/4)))
  9. # 显示缩放后的图像
  10. cv.imshow('Scaled Image', scaled_img)
  11. # 等待用户按下任意键后关闭窗口
  12. cv.waitKey(0)
  13. # 关闭所有窗口
  14. cv.destroyAllWindows()
  15. else:
  16. print("无法加载图像")

2.人脸检测

  1. import cv2 as cv
  2. # 人脸检测函数
  3. def face_detect_demo():
  4. # 将图像转换为灰度图
  5. gray = cv.cvtColor(img, cv.COLOR_BGRA2BGR)
  6. # 加载人脸检测器(使用Haar级联分类器)
  7. face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  8. # 在灰度图上进行人脸检测
  9. faces = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
  10. # 遍历检测到的人脸,并在图像上绘制矩形框
  11. for x, y, w, h in faces:
  12. cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
  13. # 显示结果图像
  14. cv.imshow('result', img)
  15. # 读取原始图像
  16. org_img = cv.imread('face1.jpg')
  17. # 获取原始图像尺寸
  18. height, width = org_img.shape[:2]
  19. # 缩放图像为原始尺寸的50%
  20. img = cv.resize(org_img, (int(width / 4), int(height / 4)))
  21. # 调用人脸检测函数
  22. face_detect_demo()
  23. # 等待按键输入,按下 'q' 键退出程序
  24. while True:
  25. if ord('q') == cv.waitKey(0):
  26. break
  27. # 关闭所有窗口
  28. cv.destroyAllWindows()

 face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') 

这里是本机安装opencv的地方

3.视频人脸检测

  1. import cv2 as cv
  2. # 人脸检测函数
  3. def face_detect_demo(img):
  4. # 将图像转换为灰度图
  5. gray = cv.cvtColor(img, cv.COLOR_BGRA2BGR)
  6. # 加载人脸检测器(使用Haar级联分类器)
  7. face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  8. # 在灰度图上进行人脸检测
  9. faces = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
  10. # 遍历检测到的人脸,并在图像上绘制矩形框
  11. for x, y, w, h in faces:
  12. cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
  13. # 显示结果图像
  14. cv.imshow('result', img)
  15. # 读取摄像头
  16. cap = cv.VideoCapture(0)
  17. # 等待按键输入,按下 'q' 键退出程序
  18. while True:
  19. flag,frame = cap.read()
  20. if not flag:
  21. break
  22. face_detect_demo(frame)
  23. if ord('q') == cv.waitKey(0):
  24. break
  25. # 关闭所有窗口
  26. cv.destroyAllWindows()
  27. cap.release()

这里调用的是本机笔记本摄像头

4.拍照保存

  1. import cv2
  2. # 打开摄像头(0表示默认摄像头)
  3. cap = cv2.VideoCapture(0)
  4. # 设置标志位和图像编号
  5. flag = 1
  6. num = 1
  7. # 持续捕获摄像头图像并显示
  8. while (cap.isOpened()):
  9. # 读取摄像头帧
  10. ret_flag, Vshow = cap.read()
  11. # 显示摄像头图像
  12. cv2.imshow("capture_test", Vshow)
  13. # 检测按键
  14. k = cv2.waitKey(1) & 0xFF
  15. # 按下 's' 键保存当前帧为图片
  16. if k == ord('s'):
  17. # 保存图像到指定路径,使用编号命名
  18. cv2.imwrite('C:/Users/14817/Pictures/Screenshots/' + str(num) + "zzq1" + ".jpg", Vshow)
  19. print("成功保存图片:" + str(num) + ".jpg")
  20. print("--------------------")
  21. num += 1
  22. # 按下空格键退出循环
  23. elif k == ord(' '):
  24. break
  25. # 释放摄像头资源
  26. cap.release()
  27. # 关闭所有窗口
  28. cv2.destroyAllWindows()

5 数据训练

  1. import os
  2. import cv2
  3. from PIL import Image
  4. import numpy as np
  5. def getImageAndLabels(path):
  6. faceSamples = []
  7. ids = []
  8. # 获取图像目录中所有以指定扩展名结尾的图像文件路径
  9. imagePaths = [os.path.join(path, f) for f in os.listdir(path) if
  10. f.lower().endswith(('.png', '1.jpg', '.jpeg', '.gif', '.bmp'))]
  11. # 加载人脸检测器(Haar级联分类器)
  12. face_detector = cv2.CascadeClassifier(
  13. 'D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  14. for imagePath in imagePaths:
  15. # 使用PIL库打开图像并转换为灰度图
  16. PIL_img = Image.open(imagePath).convert('L')
  17. img_numpy = np.array(PIL_img, 'uint8')
  18. # 使用Haar级联分类器检测图像中的人脸
  19. faces = face_detector.detectMultiScale(img_numpy)
  20. # 从图像文件名中提取人物ID
  21. id = int(os.path.split(imagePath)[1].split('.')[0])
  22. # 遍历检测到的人脸并保存样本
  23. for x, y, w, h in faces:
  24. ids.append(id)
  25. faceSamples.append(img_numpy[y:y + h, x:x + w])
  26. # 打印最后一个图像文件的ID、以及所有收集到的人脸样本
  27. print('id', id)
  28. print('fs', faceSamples)
  29. return faceSamples, ids
  30. if __name__ == '__main__':
  31. # 打印OpenCV版本信息
  32. print(cv2.__version__)
  33. # 设置图像目录路径
  34. path = 'C:/Users/14817/Pictures/Screenshots/'
  35. # 获取人脸样本和对应的ID
  36. faces, ids = getImageAndLabels(path)
  37. # 创建LBPH人脸识别器
  38. recognizer = cv2.face.LBPHFaceRecognizer_create()
  39. # 训练人脸识别器
  40. recognizer.train(faces, np.array(ids))
  41. # 将训练好的模型保存为YML文件
  42. recognizer.write("C:/Users/14817/Pictures/Screenshots/trainer.yml")

注意图片名字只能是

1.jpg

或者改代码,需要以数字为名称

6 人脸识别

  1. import cv2
  2. import os
  3. # 创建一个LBPH人脸识别器
  4. recognizer = cv2.face.LBPHFaceRecognizer_create()
  5. # 从文件中加载训练好的人脸识别模型
  6. recognizer.read('C:/Users/14817/Pictures/Screenshots/trainer.yml')
  7. # 存储人物名称的列表
  8. names = []
  9. # 人脸检测及识别函数
  10. def face_detect_demo(img):
  11. # 将图像转换为灰度
  12. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  13. # 加载人脸检测器(Haar级联分类器)
  14. face_detector = cv2.CascadeClassifier(
  15. 'D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
  16. # 检测图像中的人脸
  17. faces = face_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))
  18. # 遍历检测到的人脸
  19. for x, y, w, h in faces:
  20. # 绘制人脸矩形框
  21. cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
  22. # 绘制人脸圆形框
  23. cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=1)
  24. # 进行人脸识别
  25. ids, confidence = recognizer.predict(gray[y:y + h, x:x + w])
  26. # 根据置信度判断是否为未知人物
  27. if confidence > 80:
  28. cv2.putText(img, 'unknown', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
  29. else:
  30. # 根据识别出的ID获取人物名称
  31. cv2.putText(img, str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
  32. # 显示结果图像
  33. cv2.imshow('result', img)
  34. # 用于获取人物名称的函数
  35. def name():
  36. path = 'C:/Users/14817/Pictures/Screenshots/'
  37. # 获取图像目录中所有以指定扩展名结尾的图像文件路径
  38. imagePaths = [os.path.join(path, f) for f in os.listdir(path) if
  39. f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]
  40. # 从文件名中提取人物名称,并添加到names列表中
  41. for imagePath in imagePaths:
  42. name = str(os.path.split(imagePath)[1].split('.', 2)[1])
  43. names.append(name)
  44. # 打开视频文件(可替换为摄像头索引,如0表示默认摄像头)
  45. cap = cv2.VideoCapture('C:/Users/14817/Pictures/Screenshots/1.mp4')
  46. print("start =======")
  47. # 获取人物名称
  48. name()
  49. # 循环读取视频帧并进行人脸识别
  50. while True:
  51. flag, frame = cap.read()
  52. if not flag:
  53. break
  54. # 调用人脸检测及识别函数
  55. face_detect_demo(frame)
  56. # 按空格键退出循环
  57. if ord(' ') == cv2.waitKey(10):
  58. break
  59. # 释放内存+关闭视频
  60. cv2.destroyAllWindows()
  61. cap.release()

采用自己录屏几张图片识别,识别到会显示名称,图片名称格式为:1.zzq.jpg

数字+ 名称  + 图片

readme:

1  安装opencv
2  搭建环境  如果引入包失败,记得断开vpn



问题:
AttributeError: module 'cv2' has no attribute 'face'

安装指定版本
pip install opencv-python==4.5.4.58
pip install opencv-contrib-python==4.5.4.58

来源:

【【OpenCV图像处理】只需半天就能搞定人脸识别项目!一个课程学了就会了!附赠源码(python+opencv)】https://www.bilibili.com/video/BV1dT4y1z7it?p=13&vd_source=ecc1a37e826c1af0f62b6e24cdc3af26

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号