《深度学习》OpenCV 人脸检测、微笑检测 原理及案例解析

news/2024/10/15 15:57:54/

目录

一、人脸检测

1、如何实现人脸识别

2、haar特征

1)什么是哈尔特征

2)工作原理

3)关于预先定义的哈尔特征矩形框

• 矩形框位置

• 矩形框大小

• 矩形框类型

4)举例

3、级联分类器

4、级联分类器的使用

二、人脸检测、微笑检测 案例实现

1、人脸检测完整代码

运行结果:

2、使用摄像头来直接检测

3、人脸微笑检测

完整代码:


一、人脸检测

1、如何实现人脸识别

        调用 OpenCV 中训练好的分类器实现人脸检测。OpenCV 提供了训练好的haar 级联分类器,OpenCV 还提供了使用 HOG 特征(主要用于行人检测)和 LBP 算法级联分类器

2、haar特征

        1)什么是哈尔特征

                哈尔特征(Haar-like features)是一种基于图像亮度差异的特征描述符,通常用于描述图像的局部特征。这些特征通常是矩形区域的亮度差异,例如眼睛周围的黑色和白色区域。哈尔特征可以捕捉到目标的边缘线条纹理等信息,从而可以用来区分目标和背景。

        2)工作原理

                通过对图像中的不同位置尺度的窗口应用一组预先定义的哈尔特征,然后计算这些特征的加权和,根据加权和的值来判断窗口中是否包含感兴趣的目标。

        3)关于预先定义的哈尔特征矩形框
                • 矩形框位置

                        矩形框要逐像素点地划过(遍历) 整个图像获取每个位置的特征值。

                • 矩形框大小

                        矩形的大小可以根据需要进行任意调整。

                • 矩形框类型

                        包含垂直、水平、对角等不同类型,如下所示。

                特征值 = ∑特征区域中白色区域的像素值-黑色区域像素值(Haar特征反映的是图像的灰度变化)

        4)举例

        有上述多个人脸的灰度图,以及haar特征预先定义的矩形框,这些矩形框对这张图片进行扫描,即从开头位置开始,设置好矩形框大小以及步长,从左到右依次扫描,然后每次扫描得到的灰度值进行处理,矩形框中分为黑白区域,对每个扫描出来的灰度值进行白色区域减去黑色区域,然后求和得到扫描出来的特征值。

        

3、级联分类器

        在实际应用中,哈尔特征分类器通常与级联分类器(Cascade Classifier)结合使用级联分类器是由大量的弱分类器组成的级联结构,每个弱分类器用于检测图像的一个特定特征。通过级联的方式,可以逐步筛选出可能包含目标的区域,从而提高了检测的准确性和效率。级联分类器能够快速排除非目标区域,减少计算量,提高检测速度。

        例如,在识别一个动物是狗(正类)还是其他动物(负类)时,直接根据多个条件进行判断,流程是非常烦琐的。如果先判断该动物有几条腿。有四条腿的动物被判断为可能为狗,并对此范围内的对象继续进行分析和判断。没有四条腿的动物直接被否决,即不可能是狗。只通过比较腿的数目就能排除样本集中大量的负类(如鸡、鸭、鹅等不是狗的动物的实例)。级联分类器就是基于这种思路将多个简单的分类器按照一定的顺序级联而成的。

4、级联分类器的使用

        OpenCV 提供了opencv_createsamples.exeopencv_traincascade.exe 文件,这两个 exe 文件需要去手动下载来说使用,他们可以用来训练级联分类器,训练级联分类器很耗时,如果训练的数据量较大,可能需要几天才能完成。

        OpenCV 提供了一些训练好的级联分类器供用户使用。这些分类器可以用来检测人脸、脸部特征(眼睛、鼻子)、人类和其他物体。这些级联分类器以XML 文件的形式存放在 OpenCV 源文件的 data 目录下,因为在我们pip安装时已经下载好了,加载不同级联分类器的 XML 文件就可以实现对不同对象的检测。

二、人脸检测、微笑检测 案例实现

1、人脸检测完整代码

import cv2
image = cv2.imread('people2.png')   # 导入待检测图像
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)  # 转变成灰度图"""加载分类器"""
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')    # 将data文件下的分类器复制到代码同目录下
"""分类器检测人脸"""# #image:待检测图像,通常为灰度图像
# #scaleFactor:表示在前后两次相继扫描中窗口的缩放比例。识別,扫描,按照不同比例来进行扫描
# #minNeighbors:表示构成检测目标的相邻矩形的最小个数。在默认情况下,该参数的值为3,表示有 3 个以上的检测标记存在时才认为存在人脸。如果希望提高检测的准确率可以将该参数的值设置得更大,但这样微可能会让一些入脸无法被检测到。
# # flags: 该参数通常被省略。在使用低版本 0penCV(openCV 1.X 版本)时,该参数可能会被设置为,CV HAAR_DO_CANNY_PRUNING,表示使用 Canny 边缘检测器拒绝一些区域。
# #minsize:目标的最小尺寸,小于这个尺寸的目标将被忽略。
# #maxSize: 目标的最大尺寸,大于这个尺寸的目标将被忽略。通常情况下,将该可选参数省略即可。
# # 若 maxsize 和 minsize 大小一致,则表示仅在一个尺度上査找目标。faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05,minNeighbors=10, minSize=(10,10))  # gray为待检测图像的灰度图,scaleFactor为图像缩放的比例因子,minNeighbors表示每个候选矩形区域需要有多少个相邻的矩形区域来保留该区域,minSize表示人脸可能的最小尺寸
# 返回检测到的所有的人脸坐标和大小的数组
print("发现{0}张人脸!".format(len(faces)))
print("其位置分别是:",faces)"""--------------标注人脸及显示-------------------"""
for (x,y,w,h) in faces:   # 将检测出来的人脸的数组遍历出来,返回给x、y坐标,宽高cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)   # 在三通道的原图上绘制矩形
cv2.imshow("result",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
        运行结果:

2、使用摄像头来直接检测

        只需导入摄像头,遍历每一帧画面,对每一帧画面进行识别,然后对识别到的画面进行标注,完整代码如下:

import cv2cap = cv2.VideoCapture(0)   # 确保摄像头是可以启动的状态
if not cap.isOpened():   # 打开失败print("Cannot open camera")exit()while True:ret,image = cap.read()  # 如果正确读取帧,ret为Truegray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)if not ret:  # 读取失败,则退出循环print("不能读取摄像头")break"""加载分类器"""faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')"""分离器检测人脸"""faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05,minNeighbors=40, minSize=(10,10))print("发现{0}张人脸!".format(len(faces)))print("其位置分别是:",faces)"""--------------标注人脸及显示-------------------"""for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)cv2.imshow("result",image)key = cv2.waitKey(10)if key==27:breakcap.release()  # 释放捕获器节省资源
cv2.destroyAllWindows()   # 关闭图像窗口

        检测结果自行实验。

3、人脸微笑检测

        同样需要将OpenCV根目录下的一个用来进行微笑检测的xml文件级联分类器复制到代码文件同目录下,首先检测人脸,然后再判断是否是微笑的脸

        完整代码:
import cv2faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile = cv2.CascadeClassifier('haarcascade_smile.xml')
cap = cv2.VideoCapture(0)while True:ret,image = cap.read()  # 如果正确读取帧,ret为True# image = cv2.flip(image,1)   # 图片翮转,水平翻转(镜像)if ret is None:  # 读取失败,则退出循环breakgray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)   # 灰度图faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1,minNeighbors=10, minSize=(5,5))  # 检测人脸print("发现{0}张人脸!".format(len(faces)))print("其位置分别是:",faces)"""处理每个人脸"""for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x + w,y + h),(0, 255,0), 2)  # 绘制每一张人脸的轮廓,用绿色标注,此处还未展示roi_gray_face = gray[y:y + h,x:x + w]   # 定位出来每个人脸的位置# 微笑检测,在人脸区域内检测smiles = smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=15,minSize=(50,50))  for (sx, sy, sw, sh) in smiles:# 使用putText绘制文字,显示文字smile"表示微笑了cv2.putText(image,"smile",(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1,(0,255,255),thickness=2)# 显示结果cv2.imshow("dect", image)key = cv2.waitKey(25)if key == 27:break
cap.release()  # 释放捕获器
cv2.destroyAllWindows()   # 关闭图像窗口


http://www.ppmy.cn/news/1539492.html

相关文章

Spark算子使用-Map,FlatMap,Filter,diatinct,groupBy,sortBy

目录 Map算子使用 FlatMap算子使用 Filter算子使用-数据过滤 Distinct算子使用-数据去重 groupBy算子使用-数据分组 sortBy算子使用-数据排序 Map算子使用 # map算子主要使用长场景,一个转化rdd中每个元素的数据类型,拼接rdd中的元素数据&#xf…

分治算法(7)_归并排序_计算右侧小于当前元素的个数

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 分治算法(7)_归并排序_计算右侧小于当前元素的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论&…

全面掌握 Linux 服务管理:从入门到精通

全面掌握 Linux 服务管理:从入门到精通 引言 在 Linux 系统中,服务管理是系统管理员和开发者的基本技能之一。无论是启动、停止、重启还是查看服务状态,systemctl 命令都能让你轻松完成这些操作。今天,我们将深入探讨如何使用 sy…

Linux操作系统——外存的管理(实验报告)

实验 Linux系统外存管理 一、实验目的 熟练Linux系统外存管理的方法与命令。 二、实验环境 硬件:PC电脑一台,网络正常。 配置:win10系统,内存大于8G 硬盘500G及以上。 软件:VMware、Ubuntu16.04。 三、实验内容 …

Python和CUDA(C++)量子退火和伊辛二次算法模型

🎯要点 简化量子退火或离散优化算法处理,使用张量网络模拟和动态系统方法及神经网络逼近。实现并行退火算法和CUDA支持下穷举搜索法。使用大都会算法模拟二维自旋玻璃伊辛模型并测量磁化率、比热容和能量。对比其他组合优化解方法,使用英伟达…

上百种【基于YOLOv8/v10/v11的目标检测系统】目录(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

待更新(持续更新),早关注,不迷路............................................................................... 目标检测系统操作说明【用户使用指南】(pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff…

玩机搞机基本常识-----如何在 Android 中实现默认开启某个功能 修改方法列举

我们有时候需要对安卓系统进行修改。实现其中的某些功能。让用户使用得心应手。节约时间。那么如果要实现系统中的有些功能选项开启或者关闭。就需要对系统有一定的了解。那么在 Android 中实现默认开启某个功能可以通过以下几种方式: 一、在应用的设置中添加选项 …

【mysql】统计两个相邻任务/事件的间隔时间以及每个任务的平均用时

准备步骤1. 设置查询参数部分1.1 设置需要分析的起始时间1.2. 设置需要分析的时间的长度(分析的结束时间)1.3. 设置分析内容1.4. 设置需要分析的表和字段 2. 自动计算分析2.1 设置起始序号2.2. 筛选user_log表数据并生成带序号的临时表temp_ria2.3. 通过…