• opencv:从0到实现人脸识别


    目录

    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

  • 相关阅读:
    uView2 LineProgress进度太小时显示不全的一种解决办法
    计算机竞赛 基于深度学习的行人重识别(person reid)
    VsCode 关于EsLint校验关闭严格模式
    Leetcode:【485. 最大连续 1 的个数】
    Mybatis 批量修改数据,,并判断非空数据插入
    机器人地面站-[QGroundControl源码解析]-[1]
    SpringMVC获取请求参数
    【Oracle】Navicat Premium 连接 Oracle的两种方式
    Centos系统安装Yapi(传统方式安装)
    三菱PLC若想实现以太网无线通讯,需要具备哪些条件?
  • 原文地址:https://blog.csdn.net/zzqtty/article/details/134419362