018 OpenCV 人脸检测

目录

一、环境

二、分类器原理

2.1、概述

2.2、工作原理

三、人脸检测代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、分类器原理

CascadeClassifier是OpenCV(开源计算机视觉库)中的一个强大的类,用于实现级联分类器。这是一种机器学习技术,广泛应用于面部检测、物体识别等计算机视觉任务。以下是对CascadeClassifier的深入解析。

2.1、概述

在计算机视觉中,目标检测是一个重要的任务,其目标是在图像或视频中找出感兴趣的对象。对于人脸检测,我们需要从图像中找出并定位所有的人脸。为了完成这个任务,我们需要一个强大的分类器。然而,构建一个强大且高效的分类器是一个挑战,因为我们需要处理大量的数据,并且需要在各种条件下(不同的光照、姿态、表情等)都能准确地检测出人脸。

这就是CascadeClassifier发挥作用的地方。CascadeClassifier是一个级联分类器,它结合了多个"弱"分类器来创建一个强大的分类器。每个弱分类器都基于Haar特征或LBP(局部二值模式)特征。这些特征都是图像中的简单模式,可以用来描述图像的结构。通过结合这些弱分类器,我们可以得到一个能在各种条件下都能准确检测出人脸的强分类器。

2.2、工作原理

CascadeClassifier的工作原理可以分为两个阶段:训练和检测。

  1. 训练阶段:在这个阶段,我们需要提供大量的正样本(包含目标的图像)和负样本(不包含目标的图像)。然后,CascadeClassifier使用AdaBoost算法来训练分类器。AdaBoost算法通过迭代地增加错误分类的样本的权重来优化分类器的性能。这个过程会产生一系列的弱分类器,每个弱分类器都对一部分样本有很好的分类效果。然后,这些弱分类器被组合成一个强分类器。
  2. 检测阶段:在检测阶段,CascadeClassifier使用滑动窗口的方法来扫描图像。对于每个窗口,分类器都会计算一个分数,表示该窗口包含目标的可能性。然后,这个分数与一个阈值进行比较,如果分数高于阈值,那么这个窗口就被认为包含目标。这个过程会在不同的尺度和位置上重复进行,以便检测出不同大小和位置的目标。

三、人脸检测代码

代码需要一张图片,两个xml文件,文件我给出来了,

链接:https://pan.baidu.com/s/1cvPvhhuYD_KXHVVaG9dEng?pwd=1234

提取码:1234

以下代码中,先读取一张图片,然后读取两个xml文件(模型文件)。接着在原图上检测人脸,再将人脸区域图片用于检测眼睛。

python 复制代码
from __future__ import print_function
import cv2 as cv
import argparse

# 可视化
def detectAndDisplay(frame):
    # 彩色图转灰度图
    frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 使用直方图均衡化算法处理灰度图,防止图像太亮或者太暗
    frame_gray = cv.equalizeHist(frame_gray)

    # 人脸检测
    faces = face_cascade.detectMultiScale(frame_gray)
    for (x,y,w,h) in faces:
        center = (x + w//2, y + h//2)
        # 将人脸用椭圆标注出来
        frame = cv.ellipse(frame, center, (w//2, h//2), 0, 0, 360, (255, 0, 255), 4)
        # 取出人脸roi小图
        faceROI = frame_gray[y:y+h,x:x+w]
        # 在人脸roi小图上识别眼睛
        eyes = eyes_cascade.detectMultiScale(faceROI)
        for (x2,y2,w2,h2) in eyes:
            eye_center = (x + x2 + w2//2, y + y2 + h2//2) # 眼睛中心
            radius = int(round((w2 + h2)*0.25)) # 圆半径
            frame = cv.circle(frame, eye_center, radius, (255, 0, 0 ), 4) # 使用圆将眼睛圈出来

    cv.imshow('Capture - Face detection', frame)

parser = argparse.ArgumentParser(description='Code for Cascade Classifier tutorial.')
# 人脸模型路径
parser.add_argument('--face_cascade', help='Path to face cascade.', default='data/haarcascades/haarcascade_frontalface_alt.xml')
# 眼睛模型路径
parser.add_argument('--eyes_cascade', help='Path to eyes cascade.', default='data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')
parser.add_argument('--image', help='image path', type=str, default='data/6.jpg') 
args = parser.parse_args()

face_cascade_name = args.face_cascade
eyes_cascade_name = args.eyes_cascade
# 创建一个级联分类器对象(人脸)
face_cascade = cv.CascadeClassifier()
# 创建一个级联分类器对象(眼睛)
eyes_cascade = cv.CascadeClassifier()

#加载级联分类器参数文件(人脸)
if not face_cascade.load(cv.samples.findFile(face_cascade_name)):
    print('--(!)Error loading face cascade')
    exit(0)
#加载级联分类器参数文件(眼睛)
if not eyes_cascade.load(cv.samples.findFile(eyes_cascade_name)):
    print('--(!)Error loading eyes cascade')
    exit(0)

img_path = args.image
#头读取图像
frame = cv.imread(img_path)
detectAndDisplay(frame)
cv.waitKey(0)
相关推荐
GIS数据转换器2 分钟前
城市生命线安全保障:技术应用与策略创新
大数据·人工智能·安全·3d·智慧城市
无须logic ᭄5 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
Channing Lewis18 分钟前
flask常见问答题
后端·python·flask
Channing Lewis19 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月1 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉
一水鉴天1 小时前
为AI聊天工具添加一个知识系统 之65 详细设计 之6 变形机器人及伺服跟随
人工智能
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
m0_743106464 小时前
【论文笔记】MV-DUSt3R+:两秒重建一个3D场景
论文阅读·深度学习·计算机视觉·3d·几何学
m0_743106464 小时前
【论文笔记】TranSplat:深度refine的camera-required可泛化稀疏方法
论文阅读·深度学习·计算机视觉·3d·几何学
数据小爬虫@5 小时前
深入解析:使用 Python 爬虫获取苏宁商品详情
开发语言·爬虫·python