专栏首页Python进阶之路python+opencv 实现图像人脸检测及视频中的人脸检测

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

文章目录

原文链接:https://yetingyun.blog.csdn.net/article/details/108153075 创作不易,未经作者允许,禁止转载,更勿做其他用途,违者必究。

一、数据和知识准备

1. 下载HAAR与LBP数据

人脸检测的常见步骤如下,如果想要将人脸准确地检测出来,需要通过建立人脸模型,获取准确区分人脸的分类器,这里我们使用网上公开的扩展包或已经训练好的分类器。

将 haarcascades 与 lbpcascades 里面的相关 xml 文件下载到本地,便于之后调用,辅助进行人脸检测。

下载地址:https://github.com/opencv/opencv/tree/master/data

2. opencv相关知识

  • cv.CascadeClassifier():是 OpenCV 中人脸检测的一个级联分类器,既可以使用 Haar 特征,也可以使用 LBP 特征。以 Haar 特征分类器为基础的对象检测技术是一种非常有效的技术,它是基于机器学习且使用大量的正负样本训练得到分类器。
  • detectMultiScale函数:检测人脸算法,其参数如下: image:要检测的输入图像 scaleFactor:表示每次图像尺寸减小的比例 minNeighbors:表示每一个目标至少要被检测到多少次才算是真的人脸,因为周围的像素和不同的窗口大小都可能检测成人脸 minSize:表示目标的最小尺寸 maxSize:表示目标的最小尺寸
  • Haar-like矩形特征:是用于物体检测的数字图像特征。这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。
  • LBP:是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的 LBP 算子是在 3X3 窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即 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()

运行效果如下:

检测人脸信息如下:
 [[ 61  53 110 110]]

Process finished with exit code 0

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()

运行效果如下:

检测人脸信息如下:
 [[329 157  49  49]
 [ 88 156  44  44]
 [157 158  54  54]
 [240 159  50  50]
 [ 86 370  68  68]
 [ 79 254  54  54]
 [339 250  58  58]
 [155 254  59  59]
 [251 247  59  59]
 [199 371  80  80]
 [308 370  69  69]]

Process finished with exit code 0

3. 视频中人脸检测

# -*- coding: UTF-8 -*-
"""
@Author  :叶庭云
@公众号  :修炼Python
@CSDN    :https://yetingyun.blog.csdn.net/
"""
import cv2


# 加载视频
cap = cv2.VideoCapture('test.mp4')
# 创建一个级联分类器 加载一个.xml分类器文件 它既可以是Haar特征也可以是LBP特征的分类器
face_detect = cv2.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')

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

# 释放资源
cv2.destroyAllWindows()
cap.release()

截取新版倚天屠龙记某一集36:35到36:39的片段,简单实现实时检测人脸并显示,运行效果如下:

任何算法都不会 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()

程序运行,即可调用电脑的摄像头识别面对摄像头的人脸,正脸和静止状态检测人脸的效果好。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/fyfugoyfa复制
如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

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

    人脸检测的常见步骤如下,如果想要将人脸准确地检测出来,需要通过建立人脸模型,获取准确区分人脸的分类器,这里我们使用网上公开的扩展包或已经训练好的分类器。

    叶庭云
  • 视频人脸检测——OpenCV版(三)

    Java中文社群-磊哥
  • 视频人脸检测——OpenCV版(三)

    视频人脸检测是图片人脸检测的高级版本,图片检测详情点击查看我的上一篇《图片人脸检测——OpenCV版(二)》 实现思路: 调用电脑的摄像头,把摄像的信息逐帧分...

    Java中文社群-磊哥
  • 干货 | 史上最全 OpenCV 活体检测教程!

    AI 科技评论按:本文来自著名的计算机视觉教学网站「pyimagesearch」,文章作者为 Adrian Rosebrock。在本文中,Adrian 将就「如...

    AI研习社
  • 干货 | 史上最全 OpenCV 活体检测教程!

    AI 科技评论按:本文来自著名的计算机视觉教学网站「pyimagesearch」,文章作者为 Adrian Rosebrock。在本文中,Adrian 将就「如...

    AI科技评论
  • 10行代码实现python人脸识别

    人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行...

    星星在线
  • 向「假脸」说 No:用OpenCV搭建活体检测器

    这样的用户可能会拿到另一个人的照片。甚至可能他们的手机上就有其他人的照片或视频,他们可以用这样的照片或视频来欺骗识别人脸的相机(就像本文开头的图片那样)。

    机器之心
  • 用OpenCV搭建活体检测器

    照片、视频中的人脸有时也能骗过一些不成熟的人脸识别系统,让人们对人脸解锁的安全性产生很大怀疑。在这篇 4 千多字的教程中,作者介绍了如何用 OpenCV 进行活...

    小白学视觉
  • 能去码也能打码!OpenCV实时检测视频流人脸并马赛克之,视频后期福音

    我们现在经常用到的马赛克其实起源于建筑上的图案装饰,如今马赛克常用于图像或视频的模糊处理。随着技术的进步,打码与去码变成了一种常见的技术研究方向,同时也掀起了一...

    大数据文摘
  • 13行代码实现:Python实时视频采集(附源码)

    本文是《人脸识别完整项目实战》系列博文第3部分:程序设计篇(Python版),第1节《Python实时视频采集程序设计》,本章内容系统介绍:基于Python+o...

    数据饕餮
  • 「秀操作」仅用25行Python代码,即可实现人脸检测!

    在本文中,我们将介绍一种使用 Python 和开源库 OpenCV 进行人脸识别的非常简单的入门方法。

    TSINGSEE青犀视频
  • 基于OpenCV的实时面部识别

    现在,面部识别已成为生活中的一部分。因此,在介绍主题之前我们先看看实时面部识别示例。我们在手机、平板电脑等设备中使用人脸信息进行解锁的时候,这时就要求获取我们的...

    小白学视觉
  • Python-OpenCV人脸检测(代码)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    李智
  • OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Dat...

    Amusi
  • 学习如何使用 OpenCV 和 Python 实现人脸识别

    每个人的人脸可能略有不同,但毕竟可以肯定地说,所有人脸都有特定的特征。目前存在各种人脸检测算法,但 Viola-Jones 算法是当今仍在使用的最古老的方法。

    TSINGSEE青犀视频
  • 独家 | COVID-19:利用Opencv, Keras/Tensorflow和深度学习进行口罩检测

    本文为大家介绍了如何使用Opencv,Keras/Tensorflow构建一个口罩检测模型,以及如何将该模型应用到图片和视频中。

    数据派THU
  • 人脸检测竟如此简单?手把手用Python教你搞定!

    在这篇文章中,我将向你展示如何使用 Python 构建一个简单的人脸检测器。 构建一个检测人脸的程序是一个非常好的开始计算机视觉的项目。 在上一篇文章中,我展示...

    TSINGSEE青犀视频
  • 只需 15 行代码即可进行人脸检测!(使用Python 和 OpenCV)

    无论你是最近开始探索OpenCV还是已经使用它很长一段时间,在任何一种情况下,您都一定遇到过“人脸检测”这个词。随着机器变得越来越智能,它们模仿人类行为的能力似...

    海拥
  • ApacheCN 计算机视觉译文集 20211110 更新

    ApacheCN_飞龙

扫码关注云+社区

领取腾讯云代金券