OpenCV-人脸识别

本文介绍了使用OpenCV的Haar分类器进行人脸识别和眼部检测。通过加载预训练的XML分类器,对图像进行灰度处理后,运用detectMultiScale方法检测面部和眼睛。调整参数如scaleFactor和minNeighbors可以优化检测效果。示例代码展示了如何在单张图片和视频流中应用该技术,绘制矩形框标注出检测到的人脸和眼睛。
摘要由CSDN通过智能技术生成

人脸识别

使用Haar分类器进行面部检测

  • Haar特征分类器对象检测技术
    它是基于机器学习的,通过使用大量的正负样本图像训练得到一个cascade_function,最后再用它来做对象检测

    如果你想实现自己的面部检测分类器,需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。可参考https://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html,这里不做介绍,现在我们利用OpenCV已经训练好的分类器,直接利用它来实现面部和眼部检测。

  • 主要步骤:

    1. 加载xml分类器,并将图像或者视频处理成灰度格式 cv.CascadeClassifier()
    2. 对灰度图像进行面部检测,返回若干个包含面部的矩形区域 Rect(x,y,w,h)face_detector.detectMultiScale()
    3. 创建一个包含面部的ROI,并在其中进行眼部检测
  • 重要方法分析:def detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, minSize=None, maxSize=None)
    原理:检测输入图像在不同尺寸下可能含有的目标对象
    #minSize – Minimum possible object size. Objects smaller than that are ignored.
    #maxSize – Maximum possible object size. Objects larger than that are ignored.
    入参:
    1)image:输入的图像
    2)scaleFactor:比例因子,图像尺寸每次减少的比例,要大于1,这个需要自己手动调参以便获得想要的结果
    3)minNeighbors:最小附近像素值,在每个候选框边缘最小应该保留多少个附近像素
    4)minSize,maxSize:最小可能对象尺寸,所检测的结果小于该值会被忽略。最大可能对象尺寸,所检测的结果大于该值会被忽略
    返回:若干个包含对象的矩形区域

detectMultiScale

示例

def face_detection(image):
    """人脸识别和人眼识别"""
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)  # 在灰度图上进行识别
    # 人脸xml分类器
    face_detector = cv.CascadeClassifier(r"C:\Users\22164\AppData\Local\Programs\Python\Python39\Lib\site-packages"
                                         r"\cv2\data\haarcascade_frontalface_alt_tree.xml")
    # 人眼xml分类器
    eyes_detector = cv.CascadeClassifier(r"C:\Users\22164\AppData\Local\Programs\Python\Python39\Lib\site-packages"
                                         r"\cv2\data\haarcascade_eye.xml")
    faces = face_detector.detectMultiScale(gray, 1.01, 5)  # 检测目标对象(人脸)
    for x, y, w, h in faces:
        img = cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 红色矩形框框出人脸
        roi_gray = gray[y:y + h, x:x + w]
        roi_color = img[y:y + h, x:x + w]
        
        # 在人脸识别基础上进行人眼识别
        eyes = eyes_detector.detectMultiScale(roi_gray, 1.3, 5)  # 检测目标对象(人眼)
        for ex, ey, ew, eh in eyes:
            cv.rectangle(roi_color, (ex, ey), (ex + ew, ey + ey), (0, 255, 0), 2)  # 绿色矩形框框出人眼

    cv.imshow("result", image)

在这里插入图片描述

示例

def video_detection():
    """打开摄像头进行人脸和人眼检测"""
    capture = cv.VideoCapture(0)
    cv.namedWindow("result", cv.WINDOW_AUTOSIZE)
    while True:
        ret, frame = capture.read()
        frame = cv.flip(frame, 1)
        face_detection(frame)
        c = cv.waitKey(10)
        if c == 27:
            break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬着棒棒糖闯天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值