• OpenCV实现人脸检测(Haar特征)


    学习目标

    原理

    OpenCV是一个广泛应用于计算机视觉领域的开源库,提供了丰富的图像处理和分析功能。其中,人脸检测是OpenCV中最常见和重要的应用之一。在OpenCV中,可以使用Haar特征分类器实现人脸检测。

    Haar特征是一种常用的特征描述方法,它通过在图像上移动不同大小和形状的滑动窗口,并计算特定区域的像素强度差异来描述图像的特征。通过使用大量的正样本和负样本训练得到的强分类器,可以检测出人脸区域。

    下面详细介绍使用Haar特征进行人脸检测的原理及步骤:

    1. 准备样本数据: 首先需要准备包含人脸和非人脸的正负样本数据集。正样本包括带有人脸的图像,负样本则是不包含人脸的图像。

    2. 创建Haar级联分类器: Haar级联分类器是由多个强分类器串联而成的,每个强分类器都是由多个弱分类器组合而成的。通过训练过程,逐步提高分类器的准确性。

    3. 特征计算: 在每个窗口位置,将滑动窗口放置在图像上,计算窗口内的Haar特征值。Haar特征值是基于滑动窗口内的各种矩形区域的灰度差异。

    4. Adaboost训练: 使用Adaboost算法对Haar特征进行训练和优化。Adaboost通过调整权重和阈值来提高弱分类器的准确性,进而构建出更强的分类器。

    5. Haar级联: 将多个强分类器级联在一起,构成一个级联结构的分类器。通过级联,可以过滤掉大量的负样本,减少不必要的计算。

    6. 滑动窗口扫描: 在输入图像上以固定步长和不同尺寸的窗口进行滑动,使用级联分类器进行检测。如果窗口被分类为人脸,则将其标记为人脸区域。

    7. 优化和调整: 可以通过调整滑动窗口的大小和步长等参数,以及调整级联分类器的阈值和层数等来优化检测结果和提高性能。

    通过以上步骤,就可以实现基于Haar特征的人脸检测。OpenCV提供了现成的函数和类来帮助实现这一过程。人脸检测在许多实际应用中具有广泛的应用,如人脸识别、表情分析、人脸跟踪等。但需要注意,Haar特征方法对于旋转、遮挡和光照变化等情况的鲁棒性较弱,可能导致检测准确率下降,因此在实际应用中可能需要结合其他方法进行综合处理。

    除了Haar特征,OpenCV还提供了其他一些用于人脸检测的技术和算法。下面介绍其中两种常见的方法:

    1. HOG特征与SVM分类器: HOG(Histograms of Oriented Gradients)特征是一种基于图像梯度的特征描述方法,在人脸检测中得到了广泛应用。它通过计算图像中的梯度方向直方图,来表示图像的局部纹理信息。结合支持向量机(SVM)分类器,可以实现高效准确的人脸检测。

    2. DNN深度学习模型: OpenCV还提供了基于深度学习的人脸检测方法,使用预训练的深度神经网络模型进行检测。这些模型通常基于卷积神经网络(CNN)架构,经过大规模数据集的训练,能够更好地处理复杂的人脸场景和变化。

    深度学习方法在人脸检测领域取得了很大的突破,相比传统的特征提取方法,它能够自动学习和提取更丰富、更准确的特征。但需要注意,深度学习方法在计算资源和模型大小方面要求较高,可能对硬件和存储资源有一定的要求。

    无论使用哪种方法,OpenCV提供了丰富的函数和类,使得人脸检测变得更加简单和高效。通过将这些技术与其他图像处理和计算机视觉算法相结合,可以实现更多有趣和实用的应用,如人脸识别、表情分析、年龄和性别估计等。

    实现

    1. import cv2 as cv
    2. print(cv.__file__)

    路径:E:\Anaconda3\envs\test_py3.6\Lib\site-packages\cv2\data

    代码实现

    1. import cv2 as cv
    2. import matplotlib.pyplot as plt
    3. from pylab import mpl
    4. mpl.rcParams['font.sans-serif'] = ['SimHei']
    5. #1,以灰度图的形式读取图片
    6. img = cv.imread("ll.jpg")
    7. gray = cv.cvtColor(img , cv.COLOR_BGR2GRAY)
    8. #2,实例化OpenCV人脸 和 眼睛识别的分类器
    9. face_cas = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
    10. face_cas.load("haarcascade_frontalface_default.xml") #加载已训练好的人脸识别模型
    11. eyes_cas = cv.CascadeClassifier("haarcascade_eye.xml")
    12. eyes_cas.load("haarcascade_eye.xml") #加载已训练好的眼睛识别模型
    13. #3,调用识别人脸
    14. '''gray: 输入灰度图像;
    15. scaleFactor: 图像缩放比例,即在前一张图像的基础上,将图像缩小的比例,默认为 1.1;
    16. minNeighbors: 每个矩形应该保留的邻居数,这个参数可以理解为减少误检的一个参数。默认为 3,可以根据实际情况调整;
    17. minSize: 目标矩形的最小大小,小于这个尺寸的矩形会被忽略,默认为 (30, 30),这里设置为 (32, 32)。'''
    18. faceRects = face_cas.detectMultiScale( gray,scaleFactor=1.2,minNeighbors=10,minSize=(32,32))
    19. for faceRect in faceRects: #遍历所有检测到的人脸矩形框
    20. x,y,w,h = faceRect #获取当前人脸矩形框的坐标和大小
    21. #框出人脸
    22. cv.rectangle(img,(x,y),(x+h,y+w),(0,255,0),3)
    23. #4,在识别出的人脸中进行眼睛检测
    24. roi_color = img[y:y+h,x:x+w] #提取当前人脸区域的彩色图像
    25. roi_gray = gray[y:y+h,x:x+w] #提取当前人脸区域的灰度图像
    26. eyes = eyes_cas.detectMultiScale(roi_gray) #在当前人脸区域检测眼睛,并返回检测到的眼睛矩形框数组
    27. for (ex,ey,ew,eh) in eyes: #遍历所有检测到的眼睛矩形框
    28. cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    29. #检测结果绘制
    30. plt.figure(figsize=(8,6),dpi=100)
    31. plt.imshow(img[:,:,::-1]),plt.title("检测结果")
    32. plt.show()

    结果展示

  • 相关阅读:
    整理正则表达式(最全包括js表单验证)
    【c++】跟webrtc学容器:有序
    11.11练习题
    springboot家政服务管理平台springboot29
    [附源码]Python计算机毕业设计Django现代诗歌交流平台
    Java并发常见面试题(一)
    相控阵天线(十一):阵列天线有源驻波分析
    Python实现WOA智能鲸鱼优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战
    详解MySQL隔离级别
    java中的serializable接口作用
  • 原文地址:https://blog.csdn.net/qq_53545309/article/details/133583892