机器学习:opencv--人脸检测以及微笑检测

news/2024/10/16 19:25:07 标签: 机器学习, opencv, 人工智能

目录

前言

一、人脸检测的原理

1.特征提取

2.分类器

二、代码实现

1.图片预处理

2.加载分类器

3.进行人脸识别

4.标注人脸及显示

三、微笑检测


前言

        人脸检测是计算机视觉中的一个重要任务,旨在自动识别图像或视频中的人脸。它可以用于多种应用,如安全监控、身份验证、人机交互等。

 

一、人脸检测的原理

1.特征提取

  • Haar特征

    • 基于Haar小波变换,通过简单的矩形特征(如眼睛、鼻子、嘴巴的对比)来识别图像中的人脸。
    • Haar特征计算速度快,适合实时应用。

 

2.分类器

        这里使用的是python自带的库的分类器模型,是一种级联分类器

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

 

二、代码实现

1.图片预处理

import cv2

image = cv2.imread('quanjiafu2.jpg')
image = cv2.resize(image, None, fx=0.4, fy=0.4)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

 

2.加载分类器

"""-----------------加载分类器----------------"""
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

 

3.进行人脸识别

"""------------------- 分类器检测实现人脸识别--------------"""
# objects = cv2.CascadeClassifier,detectMultiscale( imagel, scaleFactor[,minNeighbors[,flags[,minsize[, maxsize]]]]])
# 其中,各个参数及返回值的含义如下:
# image:待检测图像,通常为灰度图像。
# scaleFactor:表示在前后两次相继扫描中搜索窗口的缩放比例。识别,扫描,按照不同比例来进行扫描
# minNeighbors:表示构成检测目标的相邻矩形的最小个数。在默认情况下,该参数的值为 3,
#           表示有 3 个以上的检测标记存在时才认为存在人脸。如果希望提高检测的准确率可以将该参数的值设置得更大。
#           但这样做可能会让一些人脸无法被检测到。
# flags: 该参数通常被省略。在使用低版本 OpencV(opencV 1.X 版本)时,该参数可能会被设置为
# CV_HAAR_DO_CANNY_PRUNING,表示使用 Canny 边缘检测器拒绝一些区域。
# minSize:目标的最小尺寸,小于这个尺寸的目标将被忽略。
# maxSize: 目标的最大尺寸,大于这个尺寸的目标将被忽略。通常情况下,将该可选参数省略即可
#           若 maxsize 和 minsize 大小一致,则表示仅在一个尺度上食找目标。
# objects: 返回值. 目标对象的矩形框向量组。该值是一组矩形信息.
#           包含每个检测到的人脸对应的矩形框的信息(x轴方向位置、y轴方向位置、宽度、高度)

faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=5, minSize=(8, 8))
print("发现{0}张人脸!".format(len(faces)))
print("其位置分别是:", faces)

 

4.标注人脸及显示

"""---------------标注人脸及显示------------------"""
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

 

三、微笑检测

  • 微笑检测是在人脸检测的基础上进行的
    1. 加载微笑检测分类器
    2. 打开摄像头
    3. 检测一帧图片
    4. 进行人脸检测
    5. 提取出每张人脸所在的矩形区域
    6. 对该矩形区域进行微笑检测
    7. 微笑时,在矩形框的左上角表上smile
    8. 按下esc结束
import cv2

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile = cv2.CascadeClassifier('haarcascade_smile.xml')

cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    frame = cv2.flip(frame, 1)  # 图片翻转 水平翻转
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=10, minSize=(5, 5))

    """--------处理每张人脸-------"""
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 提取人脸所在区域 多通道形式
        # roiColorFace = frame[y:y+h,x:x+w]
        # 单通道形式
        roi_gray_face = gray[y:y + h, x:x + w]
        # 微笑检测
        smiles = smile.detectMultiScale(roi_gray_face, scaleFactor=1.5, minNeighbors=10, minSize=(50, 50))

        for (sx, sy, sw, sh) in smiles:
            cv2.putText(frame, "smile", (x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 255, 255), 2)

    cv2.imshow('result', frame)
    a = cv2.waitKey(100)
    if a == 27:
        break

print(frame.shape)
# 释放摄像头赟源
cap.release()
# 关闭所有openCV创建的窗口
cv2.destroyAllWindows()

http://www.niftyadmin.cn/n/5708425.html

相关文章

mysql学习教程,从入门到精通,SQL导入数据(44)

1.SQL 导出数据 以下是一个关于如何使用 SQL 导出数据的示例。这个示例将涵盖从一个关系数据库管理系统(如 MySQL)中导出数据到 CSV 文件的基本步骤。 1.1、前提条件 你已经安装并配置好了 MySQL 数据库。你有访问数据库的权限。你知道要导出的表名。…

微信小程序中的文件查看方法

获得后缀名判断类型,如果是图片用ex.previewImage(),如果是视频,用uni.previewMedia(),如果是word文档这些的,用 uni.downloadFile来下载资源后用 uni.saveFile来保存到本地,uni.openDocument来打开新的网页,如果打不开的话则返回说到PC端去打开 const lookFile (url) > {l…

MySQL中FIND_IN_SET(),IN()和LIKE区别

在 MySQL 中, FIND_IN_SET() 和 LIKE 都可以用于字符串的匹配查找,但它们有以下不同: 一、语法及功能 1. FIND_IN_SET(str,strlist) : 用于在以逗号分隔的字符串列表中查找特定字符串,并返回其位置。如果未找到则返…

DOS时代渐行渐远,而国产新型平台,却在悄然换代

可能就是有点儿念旧吧,没事干的时候,就爱把那些DOS年代的经典软件找出来摆弄摆弄。 虽说它们现在都是老古董了,但在咱们70后、80后的心里头,这些当年闪闪发光的软件宝贝,还是有着独一无二的位置,谁也替代不…

60个java常用的代码(能够帮助您更好地理解Java编程)

以下是60个常用的Java代码片段,涵盖了基础语法、常用类和一些实用功能: 基础语法 Hello World public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } 变量声明 int number…

『网络游戏』客户端使用PESorket发送消息到服务器【14】

上一章服务器已经完成使用PESorket 现在我们将其导出在客户端中使用 生成成功后复制 粘贴到Unity项目中 进入Assets文件夹 粘贴两个.dll 创建脚本:ClientSession.cs 编写脚本: ClientSession.cs 编写脚本:GameStart.cs 将GameStart.cs脚本绑定在摄像机上 运行服务器 运行客户端…

UEFI学习笔记(十一):SMBIOS的概述与访问

UEFI学习笔记(十一):SMBIOS的概述与访问 一、概述1、硬件信息获取:2、系统管理:3、与固件的交互: 二、SMBIOS结构三、SMBIOS的访问1、获取 SMBIOS 入口点2、初始化和检查入口点3、访问 SMBIOS 结构表4、遍历…

IDEA如何用maven打包(界面和命令两种方式)

前言 我们在使用IDEA开发时,如果是springboot项目的话,一般是用maven来管理我们的依赖的。然后,当我们开发完成之后,就需要打包部署了。 那么,我们应该如何打包呢? 如何打包(jar包&#xff09…