小白教程

 找回密码
 立即注册
小白教程 首页 Python技术文章 查看内容

python+opencv 实现图像人脸检测及视频中的人脸检测

发布者: 小白教程

一、数据和知识准备

1. 下载HAAR与LBP数据

人脸检测的常用步骤如下。如果你想要准确的检测人脸,你需要建立一个人脸模型来获得能够准确识别人脸的分类器。这里我们使用开放的在线扩展包或训练好的分类器。
下载haarcascades和lbpcascades之间的相关XML文件到本地,方便后续调用,以协助人脸检测。
下载地址:https://github.com/opencv/opencv/tree/master/data
在这里插入图片描述

2. opencv相关知识

级联分类器():opencv中用于人脸检测的级联分类器,可以使用Haar特征和LBP特征。基于Haar特征分类器的目标检测技术是一种非常有效的技术。它基于机器学习,使用大量的正样本和负样本来训练分类器。
检测多尺度函数:人脸检测算法,其参数如下:
图像:要检测的输入图像
缩放系数:表示每幅图像缩小的比例
Minneighbors:表示每个目标需要检测多少次才能被认为是真正的人脸,因为周围的像素和不同的窗口大小可以检测成人的人脸
Minsize:目标的最小大小
Maxsize:目标的最小大小
哈尔样矩形特征:用于目标检测的数字图像特征。这种矩形特征模板是由两个或两个以上相等的黑白矩形组成,矩形特征值是白色矩形的灰度值减去黑色矩形的灰度值之和。矩形特征对一些简单的图形结构敏感,如线段和边。如果将这些矩形放置在非人脸区域,则计算出的特征值与人脸特征值不相同,因此用这些矩形对人脸特征进行量化,以区分人脸和非人脸。
LBP:是一种特征提取方法,可以提取图像的局部纹理特征。第一个LBP算子在3x3窗口中,以中心像素的像素值作为阈值,并与周围8个像素的像素值进行比较。如果像素值大于阈值,则将像素标记为1,否则标记为0。这样我们可以得到一个8位的二进制代码,它被转换成十进制的LBP代码,这样我们就可以得到这个窗口的LBP值,并用这个值来反映这个窗口的纹理信息。Lbph是对原来的LBP的改进。在OpenCV的支持下,可以直接调用函数来创建lbph人脸识别模型。
例如:cv2.face。lbphfacerecognizer_ create()。

二、python+opencv实现人脸检测

1. 图像单人脸检测


import cv2 as cv


def face_detection(image):
    # 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
    face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
    # 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息
    faces = face_detecter.detectMultiScale(image=image, scaleFactor=1.1, minNeighbors=5)
    print('检测人脸信息如下:\n', faces)
    for x, y, w, h in faces:
        # 在原图像上绘制矩形标识
        cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
    cv.imshow('result', image)


src = cv.imread(r'./test/036.jpg')
cv.imshow('input image', src)
face_detection(src)
cv.waitKey(0)
cv.destroyAllWindows()
在这里插入图片描述

2. 图像多人脸检测


import cv2 as cv


def face_detection(image):
	# 转成灰度图像
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    # 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
    face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
    # 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息
    faces = face_detecter.detectMultiScale(image=gray, scaleFactor=1.1, minNeighbors=5)
    print('检测人脸信息如下:\n', faces)
    for x, y, w, h in faces:
        # 在原图像上绘制矩形标识
        cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
    cv.imshow('result', image)


src = cv.imread(r'./test/044.jpg')
cv.imshow('input image', src)
face_detection(src)
cv.waitKey(0)
cv.destroyAllWindows()
在这里插入图片描述
任何算法都不是100%准确的。由于噪声、误差、算法、训练集等因素的影响,有时会出现一些错误的识别。当你做一个简单的测试时,你会发现人的动作,视频中镜头切换过快,背景变化等因素都可能导致视频中的人脸检测不准确

4. 摄像头人脸检测


import cv2 as cv


# 识别电脑摄像头并打开
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
face_detect = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')

while True:
    # 读取视频片段
    flag, frame = cap.read()
    frame = cv.flip(frame, 1)
    if not flag:   # 读完视频后falg返回False
        break
    # 灰度处理
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 多个尺度空间进行人脸检测   返回检测到的人脸区域坐标信息
    face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    # 绘制矩形和圆形检测人脸
    for x, y, w, h in face_zone:
        cv.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
        cv.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
    # 显示图片
    cv.imshow('video', frame)
    # 设置退出键q 展示频率
    if ord('q') == cv.waitKey(30):
        break

# 释放资源
cv.destroyAllWindows()
cap.release()
程序运行后,可以调用计算机的摄像头来识别摄像头的人脸,人脸和静态状态的人脸检测效果很好。

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-19 12:22 , Processed in 0.018395 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

返回顶部