OpenCV实例(一)人脸检测

news2024/11/13 9:40:06

OpenCV实例(一)人脸检测

  • 1.人脸检测和识别概述
  • 2.使用OpenCV进行人脸检测
    • 2.1静态图像中的人脸检测
    • 2.2视频中的人脸检测

作者:Xiou

1.人脸检测和识别概述

计算机视觉使很多任务成为现实,其中两项任务就是人脸检测(在图像中定位人脸)和人脸识别(将人脸识别为特定的人)。OpenCV实现了一些人脸检测和识别的算法。从安全到娱乐,这些技术在现实环境中都有应用。

介绍OpenCV的一些人脸检测和识别功能,并定义特定类型的可跟踪物体的数据文件。具体来说,将研究Haar级联分类器,通过分析相邻图像区域之间的对比度,确定给定图像或子图像是否与已知类型匹配。我们来考虑如何在层次结构中组合多个Haar级联分类器,以便用一个分类器识别父区域(就我们的目标而言,是一张人脸),用其他分类器识别子区域(比如眼睛)。

在OpenCV 3源代码的副本中会有一个文件夹data/haarcascades。该文件夹包含了所有OpenCV的人脸检测的XML文件,这些文件可用于检测静止图像、视频和摄像头所得到图像中的人脸。

找到haarcascades文件夹后,为项目创建一个文件夹,然后在该文件夹中创建名为cascades的子文件夹,并将haarcascades文件夹中的所有文件复制到cascades文件夹中:

在这里插入图片描述
从文件名可知这些级联是用于人脸、眼睛、鼻子和嘴的跟踪。这些文件需要正面、直立的人脸图像。在稍后创建人脸检测器时会使用这些文件。有了很大的耐心以及强大的计算机,就可以创建自己的级联,并训练这些级联来检测各种对象。

在这里插入图片描述

模型下载链接:

https://download.csdn.net/download/weixin_46274168/20822795

2.使用OpenCV进行人脸检测

在静态图像或视频中检测人脸的操作非常相似。视频人脸检测只是从摄像头读出每帧图像,然后采用静态图像中的人脸检测方法进行检测。当然,视频人脸检测还涉及其他的概念,例如跟踪,而静态图像中的人脸检测就没有这样的概念,但它们的基本理论是一致的。

2.1静态图像中的人脸检测

人脸检测首先是加载图像并检测人脸,这也是最基本的一步。为了使所得到的结果有意义,可在原始图像的人脸周围绘制矩形框。现在,项目中已经包含了haarcascades文件夹的内容,下面创建一个基本的脚本来实现人脸检测。

在OpenCV中,人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()函数,它可以检测出图片中所有的人脸。该函数由分类器对象调用,其语法格式为:

cv2.detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)

参数:

image: 输入图像, 灰度图;
scaleFactor: 图像尺寸缩小比例, 决定两个不同大小的窗口扫描之间有多大的跳跃;
minNeighbors: 被检测到几次才算目标;
minSize: 目标最小尺寸;
maxSize: 目标最大尺寸;

代码实例:

import cv2

# 读取待检测的图像
image = cv2.imread('girl1.jpg')
# 获取XML文件,加载人脸检测器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 色彩转换,转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 调用函数detectMultiScale
faces = faceCascade.detectMultiScale(gray,scaleFactor=1.15,minNeighbors=5,minSize=(5, 5))
print(faces)
# 打印输出的测试结果
print("发现{0}个人脸!".format(len(faces)))
# 逐个标注人脸
for (x, y, w, h) in faces:
    # cv2.rectangle(image, (x, y), (x+w, y+w), (0,255,0),2) #矩形标注
    cv2.circle(image, (int((x + x + w) / 2), int((y + y + h) / 2)), int(w / 2), (0, 255, 0), 2)
# 显示结果
cv2.imshow("dect", image)
# 保存检测结果
cv2.imwrite("re.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

在这里插入图片描述
我们逐步浏览一下前面的代码。首先,使用必要的cv2导入,本书的每个脚本都有这个导入。然后,声明一个face_cascade变量,这是一个CascadeClassifier对象,用于加载人脸检测级联。

然后,用cv2.imread加载图像文件,将其转换成灰度图像,因为Cascade Classifier需要灰度图像。下一步,用face_cascade.detectMultiScale进行实际的人脸检测。

detectMultiScale的参数包括scaleFactor和minNeighbors。scaleFactor参数应该大于1.0,确定人脸检测过程中每次迭代时图像的降尺度比率。minNeighbors参数是为了保留检测结果所需要的最小重叠检测次数。通常,我们期望可以在多个重叠窗口中检测到某人脸,更多的重叠检测使我们更加确信检测到的人脸是一个真正的人脸。

2.2视频中的人脸检测

现在,我们了解了如何在静态图像上进行人脸检测。如前所述,我们可以在视频(摄像头回传信号或者预先录制的视频文件)的每一帧上重复人脸检测的过程。

下一个脚本将打开一个摄像头回传信号,读取一帧,检查该帧中的人脸,并在检测到的人脸内扫描眼睛。最后,在人脸周围绘制蓝色的矩形,在眼睛周围绘制绿色的矩形。

代码实例:

import cv2

face_cascade = cv2.CascadeClassifier(
    './cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(
    './cascades/haarcascade_eye.xml')

camera = cv2.VideoCapture(0)
while (cv2.waitKey(1) == -1):
    success, frame = camera.read()
    if success:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(
            gray, 1.3, 5, minSize=(120, 120))
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
            roi_gray = gray[y:y+h, x:x+w]
            eyes = eye_cascade.detectMultiScale(
                roi_gray, 1.1, 5, minSize=(40, 40))
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(frame, (x+ex, y+ey),
                              (x+ex+ew, y+ey+eh), (0, 255, 0), 2)
        cv2.imshow('Face Detection', frame)

(1)像往常一样,导入cv2模块。之后,初始化两个CascadeClassifier对象,一个用于人脸,另一个用于眼睛。

(2)就像大多数交互式脚本一样,打开一个摄像头回传信号,开始迭代帧。继续,直到用户按下某个键。当成功捕捉到一帧时,将其转换为灰度作为处理的第一步。

在这里插入图片描述
(3)利用人脸检测器的detectMultiScale方法对人脸进行检测。正如之前所述,我们使用了scaleFactor和minNeighbors参数。我们还使用minSize参数指定了人脸的最小尺寸,具体为120×120,因此不会尝试去检测比这个尺寸小的脸。(假设用户坐在摄像头附近,可以有把握地说,图像中用户的脸将大于120×120像素。)以下是对detectMultiScale的调用:

在这里插入图片描述

(4)迭代检测到的人脸。在原始彩色图像的每个矩形周围绘制一个蓝色边界。然后,在灰度图像的同一个矩形区域内进行眼睛检测:

在这里插入图片描述
(5)循环遍历生成的眼睛矩形,并在其周围绘制绿色轮廓:

在这里插入图片描述

(6)最后,在窗口中显示生成的帧。

输出结果:

在这里插入图片描述

用此脚本进行实验,研究人脸和眼睛检测器在不同条件下的表现。试着在更亮或更暗的房间进行。如果戴着眼镜,试着摘掉眼镜再进行一次。尝试在不同人脸和不同的表情下进行。调整脚本中的检测参数,看看这些参数对结果的影响。当你感到满意时,我们再来考虑在OpenCV中还可以做些什么。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

psql Centos7安装postgresql-12

之前在centos7上下的postgresql,它的数据库实例在 “var/lib/pgsql/” 下。这就导致了系统用户的"postgres"的家目录跟postgresql数据库目录不在同一目录下。因此,今天趁着有闲暇时间把数据库装到"postgres"目录下,顺便把…

罗丹明荧光染料标记叶酸,FA-PEG2000-RB,叶酸-聚乙二醇-罗丹明; Folic acid-PEG-RB

FA-PEG-RB,叶酸-聚乙二醇-罗丹明 中文名称:叶酸-聚乙二醇-罗丹明 英文名称:FA-PEG-RB, Folic acid-PEG-RB 性状:粉红色固体或液体,取决于分子量 溶剂:溶于水和DMSO、DMF等常规性有机溶剂 保存条件:-2…

学习系统编程No.17【vscode实战】

引言: 北京时间:2023/4/11/7:25,昨天11点洗澡,洗完直接睡,导致现在头发愈发不能看,So,平头时刻将要来临,头发太长真的很不方便,昨天已经更文啦!这个星期一定…

miss_01(简单密码学及音频隐写)

下载附件,解压时提示输入密码 使用010editor打开,发现deFlags值被修改 (如果frFlags 或者 deFlags 的值不为0就会导致zip的伪加密) 将deFlags的值修改为0,并将文件另存为1.zip 再次打开,没有密码提示了 打…

酒吧攻略:一文解读酒吧类型

目前主流酒吧类型可以大致分为以下几类: 夜店:(NIGHT CLUB):KTV,夜总会,酒吧等总称club,主要指的就是夜店。 Bar:多指娱乐休闲类的酒吧,提供现场的乐队或歌…

UG导出点集坐标到txt文本文档中

文章目录 前言一、下载文件二、使用步骤1.运行Grip程序2.选择下载的points-file.grx文件3.选择要导出的文本文档的位置4.选择想要导出的点集5.查看文件 参考 前言 将UG中的离散的点或者点集坐标导出到文本文档; 原文地址 俩文件链接如下,失效了可以私信…

客快物流大数据项目(一百一十四):负载均衡 Spring Cloud Ribbon

文章目录 负载均衡 Spring Cloud Ribbon 一、Ribbon 简介 二、负载均衡源码跟踪探究 负载均衡 Spring Cloud Ribbon 为了增加服务并发访问量,我们搭建集群,集群的负载均衡怎么实现?

OpenAI-ChatGPT最新官方接口《速率并发限制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(八)(附源码)

Rate limits 速率并发限制前言Introduction 导言What are rate limits? 什么是速率限制?Why do we have rate limits? 为什么我们有速率限制?What are the rate limits for our API? 我们API的速率限制是什么?GPT-4 rate limits GPT-4速率…

【JavaEE】Spring + IoC + DI

目录 Spring概念 IoC DI Spring概念 Spring是包含众多工具方法的IoC容器。 IoC IoC:Inversion of Control 控制权反转 它是一种思想,是面向对象的一种设计原则。这种思想为了实现类与类之间的解耦。 比如当一个对象要使用另一个对象时,不再…

IO流相关知识

IO流 1.文件 保存数据的地方 2.文件流 文件在程序中以流的形式来操作的 流:数据在数据源(文件)和程序(内存)之间的经历的路程 输入流:数据从数据源(文件)到程序(内存…

【FPGA-DSP】第五期:FFT调用流程

目录 1. matlab输入信号编写 2. Simulink开发 2.1 模块搭建 2.2 Simulink运行 2.3 matlab信号处理 拓:输入信号位数改变 本章节主要说明如何在system generator中使用fft模块,话不多说,看操作: 参考教程第5期 - FFT调用流…

PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor

前言: 本文主要介绍了如何使用Python VTK高亮显示actor,使用Python语言,高亮显示选中的actor。当窗口中的圆球actor被选中时,会变成红色,并且会显示actor三遍面片边缘信息。 效果: VTK VTK,&…

Linux常见实用操作汇总(带示例版)

Linux常见实用操作汇总 1、各类快捷键1.1 强制停止1.2 退出、登出1.3 历史命令搜索1.4 光标移动1.5 清屏 2、软件安装2.1 在CentOS系统中,使用yum命令联网管理软件安装2.2 在Ubuntu系统中,使用apt命令联网管理软件安装。 3、systemctl4、软连接5、日期和…

Golang每日一练(leetDay0036) 二叉树专题(5)

目录 106. 从中序与后序遍历序列构造二叉树 Construct-binary-tree-from-inorder-and-postorder-traversal 🌟🌟 107. 二叉树的层序遍历 II Binary Tree Level-order Traversal II 🌟🌟 108. 将有序数组转换为二叉搜索树 C…

Nginx配置ssl证书实现https安全访问

目录 一、Nginx的安装与配置 安装步骤 二、SSL证书获取 三、Nginx配置 前题条件,拥有服务器与可以解析到该服务器的自己的域名。 一、Nginx的安装与配置 若已安装好了Nginx,则需查看自己的Nginx是否开启了SSL的模块功能: ./nginx -V 显…

多媒体信息发布系统解决方案

1.系统概述 多媒体信息发布系统主要是一个用于发布各种信息的平台,包括文字、图片、音频和视频等多种形式的信息。该系统旨在满足用户的信息需求,为信息发布者提供一个高效、安全、可靠的信息发布平台。 2.系统模块 (1)用户管理…

爬虫攻守道 - 猿人学第20题 - 殊途同归

写在开头 这题也是,自己搞顶多追踪到wasm代码,然后就走不下去了。找了2个参考方案,自己做的过程中还又遇到些新的问题,下面做个记录。解法1参考文章解法2参考文章 解法1:追根溯源 在 JS 代码中追踪到 Payload 赋值位…

漂亮实用的15个脑图模板,你知道哪些是AI做的吗?

对于很多第一次接触到思维导图的朋友,看到软件的时候往往找不到方向,不知道如何创作? 今天大家的好助手来了。 一是有大量的思维导图模板,大家看着模板做,慢慢就会做了。 二是ProcessOn 思维导图已经可以用AI 做思维…

鏖战大模型,未必能拯救商汤

在不被资本市场看好的质疑声中,商汤科技于近日跟风推出了自己的大模型产品,而且还直接打造了一个大模型超市,声称包括CV(计算机视觉)、NLP(​​​​​​​自然语言处理)、AIGC(人工智…

新电脑如何增加c盘空间

刚到手的台式机,发现C盘只分配了 100G 空间,对于我来说是不太够的(安装的软件太多,即使是一点点数据,几年就达到100G了)。对于经常不选择软件安装路径,全部都装在C盘的人,也是不够的…