opencv图像处理之人脸检测

一、简介

       在计算机视觉领域,人脸检测是一项基础且重要的任务,它在安防监控、人机交互、图像编辑等众多应用中都有着广泛的应用。OpenCV 作为一个强大的计算机视觉库,提供了简单易用的人脸检测功能。本文将结合具体代码,详细介绍如何使用 OpenCV 进行人脸检测,并深入探讨其背后的原理。

二、原理介绍

        OpenCV 中的人脸检测主要基于 Haar 级联分类器。Haar 级联分类器是一种基于机器学习的目标检测方法,它使用 Haar 特征来描述目标的外观,并通过级联结构来快速排除非目标区域。

  • Haar 特征:Haar 特征是一种简单的矩形特征,它通过计算图像中不同区域的像素值差异来描述图像的局部特征。常见的 Haar 特征包括边缘特征、线性特征和中心特征等。
  • 积分图:为了快速计算 Haar 特征,OpenCV 使用了积分图技术。积分图是一种预处理方法,它可以在常数时间内计算任意矩形区域的像素值之和,从而大大提高了 Haar 特征的计算效率。
  • 级联结构:Haar 级联分类器由多个级联的弱分类器组成,每个弱分类器都是一个简单的 Haar 特征分类器。在检测过程中,图像首先通过第一个弱分类器,如果通过,则继续通过下一个弱分类器,否则被认为是非目标区域,不再进行后续处理。这种级联结构可以快速排除大量的非目标区域,从而提高检测效率。

三、代码实现

import cv2
image = cv2.imread('people.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# '''-------------------加载分类器------------------------'''
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# """------------------- 分类器检测实现人脸识别 ------------------------"""
# # objects = cv2.CascadeClassifier.detectMultiScale( image[,scaleFactor
# #                      [,minNeighbors[, flags[, minSize[,maxSize]]]]] )
# # 其中,各个参数及返回值的含义如下。
# # ·image:待检测图像,通常为灰度图像。
# # ·scaleFactor:表示在前后两次相继扫描中搜索窗口的缩放比例。识别,扫描,按照不同比例来进行扫描
# # ·minNeighbors:表示构成检测目标的相邻矩形的最小个数。在默认情况下,该参数的值为 3,
# #       表示有 3 个以上的检测标记存在时才认为存在人脸。如果希望提高检测的准确率可以将该参数的值设置得更大,
# #       但这样做可能会让一些人脸无法被检测到。
# # flags: 该参数通常被省略。在使用低版本 OpenCV (OpenCV 1.X 版本)时,该参数可能会被设置为
# # CV_HAAR_DO_CANNY_PRUNING,表示使用 Canny 边缘检测器拒绝一些区域。
# # ·minSize: 目标的最小尺寸,小于这个尺寸的目标将被忽略。
# # ·maxSize: 目标的最大尺寸,大于这个尺寸的目标将被忽略。通常情况下,将该可选参数省略即可。
# #           若 maxSize 和 minSize 大小一致,则表示仅在一个尺度上查找目标。
# # ·objects: 返回值,目标对象的矩形框向量组。该值是一组矩形信息,
# #       包含每个检测到的人脸对应的矩形框的信息 (x轴方向位置、y轴方向位置、宽度、高度)。
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05,minNeighbors=9, minSize=(8, 8))
print("发现{0}张人脸!".format(len(faces)))
print("其位置分别是:", faces)
"""-------------- 标注人脸及显示 -------------------"""
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow("result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解析

  1. 导入库:首先导入 cv2 库,它是 OpenCV 的 Python 接口,提供了各种计算机视觉操作的函数。
  2. 读取图像:使用 cv2.imread('T1.jpg') 函数读取一张图片,将其存储在 image 变量中。
  3. 转换为灰度图像:由于人脸检测算法通常在灰度图像上运行,因此使用 cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 将彩色图像转换为灰度图像,并存储在 gray 变量中。
  4. 加载人脸检测器cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 加载了一个预训练的 Haar 级联分类器,这个分类器专门用于检测正面人脸。haarcascade_frontalface_default.xml 是一个包含了人脸特征的训练模型文件。
  5. 检测人脸faceCascale.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=1, minSize=(8,8)) 函数在灰度图像上检测人脸。scaleFactor 参数表示在每次图像缩放时的比例因子,minNeighbors 参数表示一个候选区域被认为是人脸所需的最小邻居数,minSize 参数指定了检测到的人脸的最小尺寸。
  6. 输出结果:检测到的人脸位置信息存储在 faces 变量中,通过打印语句输出检测到的人脸数量和位置信息。
  7. 绘制矩形框:遍历 faces 列表,使用 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) 函数在原始图像上绘制绿色矩形框,标记出人脸的位置。
  8. 显示图像:使用 cv2.imshow("result", image) 显示标记了人脸的图像,并使用 cv2.waitKey(0) 等待用户按键,最后使用 cv2.destroyAllWindows() 关闭所有窗口。

运行结果 

四、拓展 

faceCascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap=cv2.VideoCapture(0)
while True:
    ret,image=cap.read()
    image=cv2.flip(image,1)
    if ret is None:
        break
    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    faces=faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=16,minSize=(5,5))
    for (x,y,w,h) in faces:
        cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
    cv2.imshow('cv_xml',image)
    key=cv2.waitKey(10)
    if key==27:
        break
cap.release()
cv2.destroyAllWindows()

 上述是通过摄像头实现人脸检测的一段代码,大家感兴趣的可以复制下来自己去试一试!

运行结果如下 

 

五、总结 

      通过本文的介绍,我们了解了如何使用 OpenCV 进行人脸检测,并深入探讨了其背后的原理。OpenCV 提供的 Haar 级联分类器是一种简单有效的人脸检测方法,适用于大多数实际应用场景。希望本文对大家在计算机视觉领域的学习和实践有所帮助。最后,欢迎大家关注一起交流人工智能技术!

猜你喜欢

转载自blog.csdn.net/2201_75345884/article/details/146935651
今日推荐