《OpenCV计算机视觉》—— 人脸检测

文章目录

一、人脸检测流程介绍

  • 下面是一张含有多个人脸的图片
    • 第一步:读取图片后将图片转换成灰度图
    • 第二步:在灰度图中进行特征检测,并检测出各个人脸的特征信息
    • 第三步:将各个人脸的特征信息保存下来
    • 第四部:根据检测出的人脸的特征信息,在原图中用矩形框,框出每个人的脸部区域
  • 最终的结果如下:

二、用于人脸检测的关键方法

1.加载分类器(cv2.CascadeClassifier())

  • 在OpenCV库中,提供了多个用于检测人脸的Haar特征级联分类器 ,并以xml文件的形式存储,这些文件是预训练的,意味着它已经被训练好了,可以直接用于检测图像中的人脸
  • 下面链接中是对人脸检测的Haar特征和级联分类器的介绍:
  • 如何找到这些xml文件呢?
    • 这些 xml文件存在我们pycharm的环境中,通过下图中的步骤找到:
  • 找到这些文件后通过 cv2.CascadeClassifier() 加载分类器
    • cv2.CascadeClassifier 是 OpenCV 库中用于加载和训练级联分类器的一个类

2.检测图像中的人脸(cv2.CascadeClassifier.detectMultiscale())

  • 在OpenCV中,cv2.CascadeClassifier 类有一个非常重要的方法叫做 detectMultiScale(),这个方法专门用于在图像中检测对象。detectMultiScale() 方法会搜索图像中所有可能匹配预训练分类器(如Haar或LBP特征分类器)的对象,并返回这些对象的位置(通常以矩形框的形式)。

  • 下面是 detectMultiScale() 方法的一些关键参数和它们的含义

    • image:要搜索的输入图像,通常是一个灰度图像(因为颜色信息对于Haar特征来说不是必需的,而且灰度图像处理起来更快)。
    • scaleFactor:图像缩放的比例因子。在检测过程中,图像会按照这个比例因子逐步缩小,以便在不同的尺度上搜索对象。例如,scaleFactor=1.05 意味着每次迭代图像都会缩小5%。
    • minNeighbors:每个候选矩形框需要有多少个相邻的矩形框来保留该框。这个参数有助于消除错误的检测。例如,如果设置为3,那么只有当至少有3个矩形框重叠时,该框才会被保留。
    • flags:一些可选的标志,用于修改检测过程的行为。例如,cv2.CASCADE_SCALE_IMAGE 会告诉分类器在检测之前自动缩放图像(但通常这个标志是默认启用的,所以不需要显式设置)。
    • minSizemaxSize:对象的最小和最大可能尺寸(以像素为单位)。这些参数可以帮助减少不必要的搜索区域,并加快检测速度。
    • 返回值 :detectMultiScale() 方法返回一个矩形框的列表 (每个框都是一个 (x, y, w, h) 元组,其中 (x, y) 是矩形左上角的坐标,w 和 h 分别是矩形的宽度和高度

三、代码实现

  • 完整代码如下:

    python 复制代码
    import cv2
    
    """ 加载图片,并将图片转换为灰度图 """
    image = cv2.imread('face.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    """ 加载分类器 """
    # 'haarcascade_frontalface_default.xml' 用于检测正面人脸的Haar特征的级联分类器
    faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    
    """ 使用分类器对人脸进行检测 """
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=9, minSize=(8, 8))
    print("发现{}张人脸".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()
  • 结果如下:

相关推荐
冬奇Lab1 分钟前
开源项目第162期:code-review-graph — 给 AI 代码审查建一张代码结构地图,减少 82 倍 Token 消耗
人工智能
tntxia2 分钟前
自然语言处理发展历程
人工智能
观远数据7 分钟前
消费品牌选型BI的能力边界:三类差异化场景的适配清单与排除项
数据库·人工智能·microsoft
冬奇Lab7 分钟前
AI 评测系列(01):为什么 AI 评测难——不确定性、主观性与多维度
人工智能
B8017913Y15 分钟前
2026记者采访适用,在线录音转换成文字帮你高效整理访谈内容
人工智能
鼎艺创新科技18 分钟前
WAIC 2026观察:应急AI三维沙盘避坑 拆解3DGIS+AI真落地的3个核心技术门槛
大数据·人工智能·国产化·电子沙盘·三维电子沙盘
没落英雄20 分钟前
7. 从零开始搭建一个 AI Agent —— UI 卡片渲染系统
前端·人工智能·架构
Zzj_tju23 分钟前
Alignment Science 与可控生成:偏好学习、宪法式训练和可验证对齐
人工智能·学习·语言模型
moMo23 分钟前
让 AI 不再"凭感觉做事"——Claude Code Skills 的实践与思考
人工智能
万联WANFLOW24 分钟前
月之暗面发布 Kimi K3:全球首个开源 3T 级大模型,前端编程竞技场登顶第一
网络·人工智能·架构·业界资讯