【OpenCV-Python】:基于视频的人脸检测、眼部检测与微笑检测

✨博客主页:米开朗琪罗~
✨博主爱好:羽毛球
✨年轻人要:Living for the moment(活在当下)!
推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】

目录

  • 一、分类器
  • 二、程序设计及结果可视化
    • 2.1 函数API
    • 2.2 程序设计
    • 2.3 结果可视化

一、分类器

OpenCV中有专门用来做人脸检测、人眼检测和微笑检测的工具。

在作者这个目录下:D:\anaconda\envs\keras21\Lib\site-packages\cv2\data,(注:keras21是作者的虚拟环境,如果没创建虚拟环境,在anaconda下寻找Lib就可以)存在很多.xml文件,这些文件是预训练好的各器官的Haar特征。
【OpenCV-Python】:基于视频的人脸检测、眼部检测与微笑检测_第1张图片
从名字中就可以看出哪个文件是做什么的!

二、程序设计及结果可视化

2.1 函数API

级联分类器:cv2.CascadeClassifier

检测函数:detectMultiScale

2.2 程序设计

import cv2

# 定义人脸检测器、眼部检测器、微笑检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')   # 人脸检测
# eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascades_eye.xml')       # 这个检测器不知道为啥用不了
lefteye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_lefteye_2splits.xml')        # 左眼检测
righteye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_righteye_2splits.xml')      # 右眼检测
smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascades_smile.xml')               # 微笑检测

cap = cv2.VideoCapture(0)

while(True):

    ret, frame = cap.read()

    # 人脸检测
    faces = face_cascade.detectMultiScale(frame, minNeighbors=12)
    img = frame

    # 绘制人脸(蓝色框)
    for(facex, facey, facew, faceh) in faces:

        img = cv2.rectangle(img, (facex, facey), (facex + facew, facey + faceh), (255, 0, 0), 1)

        face_area = img[facey: facey + faceh, facex: facex + facew]       # 人脸区域

        # 左眼检测(红色框)
        lefteye = lefteye_cascade.detectMultiScale(face_area, minNeighbors=12)

        # 绘制左眼(红色框)
        for(lefteyex, lefteyey, lefteyew, lefteyeh) in lefteye:
            cv2.rectangle(face_area, (lefteyex, lefteyey), (lefteyex + lefteyew, lefteyey + lefteyeh), (0, 0, 255), 1)

        # 右眼检测
        righteye = righteye_cascade.detectMultiScale(face_area, minNeighbors=12)

        # 绘制右眼(红色框)
        for (righteyex, righteyey, righteyew, righteyeh) in righteye:
            cv2.rectangle(face_area, (righteyex, righteyey), (righteyex + righteyew, righteyey + righteyeh), (0, 0, 255), 1)

        # 微笑检测
        smiles = smile_cascade.detectMultiScale(face_area, scaleFactor=1.16, minNeighbors=3, minSize=(1, 1), flags=cv2.CASCADE_SCALE_IMAGE)

        # 绘制微笑(绿色框)
        for (smilex, smiley, smilew, smileh) in smiles:
            cv2.rectangle(face_area, (smilex, smiley), (smilex + smilew, smiley + smileh), (0, 255, 0), 1)
            cv2.putText(img, 'smile', (smilex, smiley-7), 3, 1.2, (0, 255, 0), 2, cv2.LINE_AA)        # 字体

    cv2.imshow('detect', img)
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

haarcascades_eye.xmlhaarcascades_smile.xml这两个分类器不知道为什么有时候好使有时候不好使!眼部检测用不了可以用左右眼分别检测,但微笑检测有时候也用不了,同样的程序昨天能用,今天就用不了了!摄像头也没有被占用!不知道是什么原因!

【OpenCV-Python】:基于视频的人脸检测、眼部检测与微笑检测_第2张图片

2.3 结果可视化

放一张没有微笑检测的截图吧!
【OpenCV-Python】:基于视频的人脸检测、眼部检测与微笑检测_第3张图片

你可能感兴趣的:(图像处理,python,图像处理,opencv)