opencv学习二十三:人脸检测

人脸检测

OpenCV自带了函数detectMultiScale()可以实现对行人和人脸的检测,实现简单,但识别效果相对较差。

Opencv的人脸检测函数,定义了具体可跟踪对象类型的数据文件。

Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配。

两个图像的相似程度可以通过它们对应特征的欧式距离来度量。距离可能以空间坐标或颜色坐标来定义。类Haar特征是一种用于实现实时人脸跟踪的特征。每个类Haar特征都描述了相邻图像区域的对比模式。例如,边,顶点和细线都能生成具有判断性的特征。

Haar级联级具有尺度不变性,换句话说,它在尺度变化上具有鲁棒性。但是,opencv的Haar级联不具有旋转不变性。

在opencv源代码的副本中会有一个文件夹data/haarcascades,该文件夹包括了所有opencv的人脸检测的xml文件,这些文件可用于检测静止图像,视频和摄像头所得到图像中的人脸。
在开始写代码之前,先要下载opencv源代码包:
opencv官网(我下载的3.4的)
在这里插入图片描述

一、静态图像中的人脸检测:

import cv2 as cv
import numpy as np

def face_detect_demo():
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier("D:/opencv3.4.13/opencv/build/etc/haarcascades/haarcascade_frontalface_alt_tree.xml")
    faces = face_detect.detectMultiScale(gray, 1.02, 2)
    for x, y, w, h in faces:
        cv.rectangle(src, (x, y), (x+w, y+h), (0, 0, 255), 2)
    cv.imshow("face_detect", src)

src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/hezhao1.jpg")  #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
face_detect_demo()
cv.waitKey(0)
cv.destroyAllWindows()

运行截图:
在这里插入图片描述有时候会出现部分人脸检测不到:
修改face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=1) 里的参数值可以得到不同的识别精度,有的识别出的人多,有的少。

在这里插入图片描述

二、视频中人脸检测

import cv2 as cv
import numpy as np

def face_rec():
    # 加载视频
    cameraCapture = cv.VideoCapture('C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/xiaoyu3.mp4')
    # cv2级联分类器CascadeClassifier,xml文件为训练数据
    face_cascade = cv.CascadeClassifier("D:/opencv3.4.13/opencv/build/etc/haarcascades/haarcascade_frontalface_default.xml")
    # 读取数据
    success, frame = cameraCapture.read()
    while success and cv.waitKey(1) == -1:
        # 读取数据
        ret, img = cameraCapture.read()
        print(img.shape)
        # 进行人脸检测
        faces = face_cascade.detectMultiScale(img, 1.3, 5)
        # 绘制矩形框
        for (x, y, w, h) in faces:
            img = cv.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
        # 设置显示窗口
        cv.namedWindow('camera', 0)
        cv.resizeWindow('camera', 360, 640)
        # 显示处理后的视频
        cv.imshow('camera', img)
        # 读取数据
        success, frame = cameraCapture.read()
        c = cv.waitKey(50)
        if c == 27:
            break
    # 释放视频
    cameraCapture.release()
    # 释放所有窗口
    cv.destroyAllWindows()


if __name__ == '__main__':
    face_rec()

运行结果:
python3.7+opencv3人脸检测样例-1
python3.7+opencv3人脸检测样例-2
python3.7+opencv3人脸检测样例-3

猜你喜欢

转载自blog.csdn.net/weixin_44145452/article/details/112847758