OpenCV是一个广泛应用于计算机视觉领域的开源库,提供了丰富的图像处理和分析功能。其中,人脸检测是OpenCV中最常见和重要的应用之一。在OpenCV中,可以使用Haar特征分类器实现人脸检测。
Haar特征是一种常用的特征描述方法,它通过在图像上移动不同大小和形状的滑动窗口,并计算特定区域的像素强度差异来描述图像的特征。通过使用大量的正样本和负样本训练得到的强分类器,可以检测出人脸区域。
下面详细介绍使用Haar特征进行人脸检测的原理及步骤:
准备样本数据: 首先需要准备包含人脸和非人脸的正负样本数据集。正样本包括带有人脸的图像,负样本则是不包含人脸的图像。
创建Haar级联分类器: Haar级联分类器是由多个强分类器串联而成的,每个强分类器都是由多个弱分类器组合而成的。通过训练过程,逐步提高分类器的准确性。
特征计算: 在每个窗口位置,将滑动窗口放置在图像上,计算窗口内的Haar特征值。Haar特征值是基于滑动窗口内的各种矩形区域的灰度差异。
Adaboost训练: 使用Adaboost算法对Haar特征进行训练和优化。Adaboost通过调整权重和阈值来提高弱分类器的准确性,进而构建出更强的分类器。
Haar级联: 将多个强分类器级联在一起,构成一个级联结构的分类器。通过级联,可以过滤掉大量的负样本,减少不必要的计算。
滑动窗口扫描: 在输入图像上以固定步长和不同尺寸的窗口进行滑动,使用级联分类器进行检测。如果窗口被分类为人脸,则将其标记为人脸区域。
优化和调整: 可以通过调整滑动窗口的大小和步长等参数,以及调整级联分类器的阈值和层数等来优化检测结果和提高性能。
通过以上步骤,就可以实现基于Haar特征的人脸检测。OpenCV提供了现成的函数和类来帮助实现这一过程。人脸检测在许多实际应用中具有广泛的应用,如人脸识别、表情分析、人脸跟踪等。但需要注意,Haar特征方法对于旋转、遮挡和光照变化等情况的鲁棒性较弱,可能导致检测准确率下降,因此在实际应用中可能需要结合其他方法进行综合处理。
除了Haar特征,OpenCV还提供了其他一些用于人脸检测的技术和算法。下面介绍其中两种常见的方法:
HOG特征与SVM分类器: HOG(Histograms of Oriented Gradients)特征是一种基于图像梯度的特征描述方法,在人脸检测中得到了广泛应用。它通过计算图像中的梯度方向直方图,来表示图像的局部纹理信息。结合支持向量机(SVM)分类器,可以实现高效准确的人脸检测。
DNN深度学习模型: OpenCV还提供了基于深度学习的人脸检测方法,使用预训练的深度神经网络模型进行检测。这些模型通常基于卷积神经网络(CNN)架构,经过大规模数据集的训练,能够更好地处理复杂的人脸场景和变化。
深度学习方法在人脸检测领域取得了很大的突破,相比传统的特征提取方法,它能够自动学习和提取更丰富、更准确的特征。但需要注意,深度学习方法在计算资源和模型大小方面要求较高,可能对硬件和存储资源有一定的要求。
无论使用哪种方法,OpenCV提供了丰富的函数和类,使得人脸检测变得更加简单和高效。通过将这些技术与其他图像处理和计算机视觉算法相结合,可以实现更多有趣和实用的应用,如人脸识别、表情分析、年龄和性别估计等。
- import cv2 as cv
- print(cv.__file__)
路径:E:\Anaconda3\envs\test_py3.6\Lib\site-packages\cv2\data
- import cv2 as cv
- import matplotlib.pyplot as plt
- from pylab import mpl
-
- mpl.rcParams['font.sans-serif'] = ['SimHei']
- #1,以灰度图的形式读取图片
- img = cv.imread("ll.jpg")
- gray = cv.cvtColor(img , cv.COLOR_BGR2GRAY)
-
- #2,实例化OpenCV人脸 和 眼睛识别的分类器
- face_cas = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
- face_cas.load("haarcascade_frontalface_default.xml") #加载已训练好的人脸识别模型
-
-
- eyes_cas = cv.CascadeClassifier("haarcascade_eye.xml")
- eyes_cas.load("haarcascade_eye.xml") #加载已训练好的眼睛识别模型
-
- #3,调用识别人脸
- '''gray: 输入灰度图像;
- scaleFactor: 图像缩放比例,即在前一张图像的基础上,将图像缩小的比例,默认为 1.1;
- minNeighbors: 每个矩形应该保留的邻居数,这个参数可以理解为减少误检的一个参数。默认为 3,可以根据实际情况调整;
- minSize: 目标矩形的最小大小,小于这个尺寸的矩形会被忽略,默认为 (30, 30),这里设置为 (32, 32)。'''
- faceRects = face_cas.detectMultiScale( gray,scaleFactor=1.2,minNeighbors=10,minSize=(32,32))
- for faceRect in faceRects: #遍历所有检测到的人脸矩形框
- x,y,w,h = faceRect #获取当前人脸矩形框的坐标和大小
- #框出人脸
- cv.rectangle(img,(x,y),(x+h,y+w),(0,255,0),3)
- #4,在识别出的人脸中进行眼睛检测
- roi_color = img[y:y+h,x:x+w] #提取当前人脸区域的彩色图像
- roi_gray = gray[y:y+h,x:x+w] #提取当前人脸区域的灰度图像
- eyes = eyes_cas.detectMultiScale(roi_gray) #在当前人脸区域检测眼睛,并返回检测到的眼睛矩形框数组
- for (ex,ey,ew,eh) in eyes: #遍历所有检测到的眼睛矩形框
- cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
-
- #检测结果绘制
- plt.figure(figsize=(8,6),dpi=100)
- plt.imshow(img[:,:,::-1]),plt.title("检测结果")
- plt.show()