常见人脸检测器, 调用摄像头检测人脸

news2024/9/25 13:16:20

常见人脸检测器, 调用摄像头检测人脸


文章目录

  • 常见人脸检测器, 调用摄像头检测人脸
    • @[TOC](文章目录)
  • 前言
  • 一、导入相关包
  • 二、Haar检测器
  • 三、Hog检测器
  • 四、CNN检测器
  • 五、SSD检测器
  • 六、MTCNN检测器
  • 七、Opencv结合检测器检测人脸
    • 7.1 Hog 检测器
    • 7.2 Haar检测器

前言

主要介绍几种常见的人脸检测器, 并结合 opencv 调用摄像头进行人脸的实时检测。


一、导入相关包

import cv2
import numpy as np
import matplotlib.pyplot as plt
import dlib
from mtcnn.mtcnn import MTCNN

二、Haar检测器

  • Haar 特征: 边缘特征检测 + 线状特征检测算法会计算比较实际特征与理想特征接近程度
    1. 计算黑色像素平均值
    1. 计算白色像素平均值
    1. 计算黑色, 白色像素平均值差值越接近1, 说明越可能找到这个特征
  • 权重文件网上都能找到资源
img = cv2.imread('./images/faces2.jpg')

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

face_detector = cv2.CascadeClassifier('./weights/haarcascade_frontalface_default.xml')

# scaleFactor: 调整图片尺寸
# minNeighbors: 寻找人脸框的数量
# minSize: 最小人脸尺寸
# maxSize: 最大人脸尺寸
detections = face_detector.detectMultiScale(img_gray, scaleFactor=1.3, minNeighbors=7,
                                            minSize=(10, 10), maxSize=(100, 100))

for (x, y, w, h) in detections:

    # 绘制矩形框, 在 img 图上进行绘制
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 5)

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

在这里插入图片描述

三、Hog检测器

img = cv2.imread('./images/faces2.jpg')

# 构造 hog 检测器
hog_face_detector = dlib.get_frontal_face_detector()

# 检测人脸
# scale: 类似 haar 的 scaleFactor
detections = hog_face_detector(img, 1)

# 进行迭代, 解析 detections
for face in detections:
    x = face.left()
    y = face.top()
    r = face.right()
    b = face.bottom()
    cv2.rectangle(img, (x, y), (r, b), (0, 255, 0), 5)

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

在这里插入图片描述

四、CNN检测器

img = cv2.imread('./images/faces2.jpg')
cnn_face_detector = dlib.cnn_face_detection_model_v1('./weights/mmod_human_face_detector.dat')

# 检测人脸
detections = cnn_face_detector(img, 1)

# 解析 detections
for face in detections:
    x = face.rect.left()
    y = face.rect.top()
    r = face.rect.right()
    b = face.rect.bottom()

    # 置信度
    c = face.confidence

    cv2.rectangle(img, (x, y), (r, b), (0, 255, 0), 5)
    
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

在这里插入图片描述

五、SSD检测器

img = cv2.imread('./images/faces2.jpg')

# 加载模型
face_detector = cv2.dnn.readNetFromCaffe('./weights/deploy.prototxt.txt',
                                         './weights/res10_300x300_ssd_iter_140000.caffemodel')
# 原图尺寸
img_height = img.shape[0]
img_width = img.shape[1]

# 缩放至模型输入尺寸
img_resize = cv2.resize(img, (500, 300))

# 图像转为Blob
img_blob = cv2.dnn.blobFromImage(img_resize, 1.0, (500, 300), (104.0, 177.0, 123.0))

# 输入
face_detector.setInput(img_blob)

# 推理
detections = face_detector.forward()

# 检测人脸数量
num_of_face = detections.shape[2]
print(num_of_face)                                  # 200
print(detections.shape[3])                          # 7
# 迭代遍历人脸数量
for index in range(num_of_face):

    # 置信度
    detection_confience = detections[0, 0, index, 2]

    # 挑选置信度
    if detection_confience > 0.15:
        # 位置
        locations = detections[0, 0, index, 3:7] * np.array([img_width, img_height, img_width, img_height])

        # 打印置信度
        print(str(round(detection_confience * 100, 2)) + '%')

        l, t, r, b = locations.astype('int')

        # 绘制矩形框
        cv2.rectangle(img, (l, t), (r, b), (0, 255, 0), 3)
# 绘制
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

在这里插入图片描述

六、MTCNN检测器

  • MTCNN 检测人脸, 传入图片是RGB顺序
img = cv2.imread('./images/faces2.jpg')

# MTCNN 需要RGB顺序
img_cvt = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 加载模型
face_detector = MTCNN()

# 检测人脸
detections = face_detector.detect_faces(img_cvt)

# 解析
for face in detections:
    (x, y, w, h) = face['box']
    cv2.rectangle(img_cvt, (x, y), (x+w, y+h), (0, 255, 0), 3)

plt.imshow(img_cvt)
plt.show()

在这里插入图片描述

七、Opencv结合检测器检测人脸

  • 给出两种检测人脸器+获取摄像头画面,可以检测出人脸
  • 参数需要自己调,效果会更好点

7.1 Hog 检测器

cap = cv2.VideoCapture(0)

hog_face_detector = dlib.get_frontal_face_detector()


while True:

    rec, frame = cap.read()

    frame = cv2.flip(frame, 1)

    detections = hog_face_detector(frame, 1)

    for face in detections:
        x = face.left()
        y = face.top()
        r = face.right()
        b = face.bottom()
        cv2.rectangle(frame, (x, y), (r, b), (0, 255, 0), 5)

    cv2.imshow('face', frame)

    if cv2.waitKey(10) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

7.2 Haar检测器

cap = cv2.VideoCapture(0)

face_detector = cv2.CascadeClassifier('./weights/haarcascade_frontalface_default.xml')

while True:

    rec, frame = cap.read()

    frame = cv2.flip(frame, 1)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 添加 minNeighbors 会降低误检率
    detections = face_detector.detectMultiScale(gray, minNeighbors=7)

    for (x, y, w, h) in detections:

        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 3)

    cv2.imshow('face', frame)

    if cv2.waitKey(10) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

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

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

相关文章

【花雕】全国青少年机器人技术一级考试模拟题(之一)

一.单选题(20题,每题3分) 1.下列图片中,哪个不是机器人() 答案:D 2.机器人的英文单词是() A. botre B. boret C. robot D. rebot 答案:C 3.机器人结构中&am…

网络安全进阶学习第六课——服务器解析漏洞

文章目录 1、概念2、Apache解析漏洞 CVE-2017-157153、Apache AddHandler解析漏洞4、IIS6 解析漏洞(;)5、IIS6 解析漏洞(*.asp/目录)6、IIS7 解析漏洞(ISAP或CGI的模式下)7、nginx解析漏洞(cgi.…

USB 3.0 Rx Detect之超速U盘的识别

1 USB超速SerDes原理介绍 1.1 SerDes Rx.Detect SerDes Rx.Detect的原理比较简单,就是通过一个逻辑电路比较RC时间常数的大小。 - 当Rx不存在时,RC时间常数较小。 - 当Rx存在时,RC时间常数较大。 下面将详细描述其原理。 Figure 1-1 USB 3.0电…

SuperMap 的 Environment.initialization(this)空指针

如果你把ndk和动态权限等等都设置好了,还发现Environment.initialization(this)还有空指针问题存在。就试试我这个方法 许可文件要用10i的,别用11i的 SuperMap 有个so库文件是放在armeabi-v7a文件夹下的,armeabi-v7a不要放在jniLibs目录下&…

深度理解:Redis Hash(散列表)实现原理

Redis是一种开源的,基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。它支持多种类型的数据结构,例如字符串、散列表、列表、集合、有序集合等。今天我们将重点讨论Redis的一个重要数据结构:Hash,也叫散列…

Linux网络概念

1.1网络 是由若干结点和连接这些结点的链路组成,网络中的结点可以是计算机,交换机、路由器等设备 网络设备有:交换机、路由器、集线器 传输介质有:双绞线、同轴电缆、光纤 1.2互联网 把多个网络连接起来就构成了互联网&#…

vue+antd——实现拖拽上传文件——技能提升

最近看到有2023年博客之星的入围状况&#xff0c;提示我还差24篇高质量文章才可以入围。前两年由于比较勤奋&#xff0c;文章篇数足够&#xff0c;因此没有遇到这种提示过。现在补上几篇文章&#xff0c;希望可以入围吧。 1.html代码 <template><div class"clea…

编译linux内核(三)

内核配置选项[Centos] 挑选核心功能选项介绍1. General setup&#xff08;通用选项&#xff09;2. Enable loadable module support3. Enable the block layer4. Processor type and features(CPU 的类型与功能选择)5. Power management and ACPI options(电源管理功能)6. Bus …

【Python 随练】❀ 绘制正方形

题目&#xff1a; 画图&#xff0c;学用rectangle画方形。 简介&#xff1a; 在本篇博客中&#xff0c;我们将介绍如何使用Python的绘图库来画方形。我们将使用rectangle函数来绘制方形&#xff0c;并提供一个完整的代码示例来演示其用法。 绘制方形&#xff1a; 要绘制方…

Dom4j在某节点上添加已有的Element节点

需求&#xff1a;有两个xml文件需要解析&#xff0c;将A文件的节点解析之后放到了一个List<Element> list的集合中了&#xff0c;然后解析B文件&#xff0c;将list的内容填充到B中去。 众所周知&#xff0c;下面这段代码是可以添加一个节点元素的。 SAXReader reader n…

数通王国历险记之以太网和MAC地址

系列文章目录 数通王国历险记&#xff08;3&#xff09; 目录 前言 一&#xff0c;以太网的定义 二&#xff0c;如何理解以太网 2.1&#xff0c;以太网是一种广播式数据链路层协议 2.2&#xff0c;以太网支持多点接入 2.3&#xff0c;个人电脑的网络接口遵循的就是以太网…

Apikit 自学日记:如何分享 API、项目

开启/关闭在线分享 您可以在线分享项目给团队以外的人&#xff0c;其他人可以通过分享链接在线查看API文档并且进行API测试。通过这种方式查看API文档不需要注册账号&#xff0c;用户可方便查看接口文档和测试接口。 在项目内&#xff0c;点击进入项目管理菜单&#xff0c;选择…

【国产虚拟仪器】基于ZYNQ7045+V7 FPGA的多通道数据同步采集设计方案(二)

多通道数据采集电路主要流程为实现4路模拟信号接收&#xff0c;通过模数转换、信 号处理后的数据经过光纤传输到总站。多通道数据采集电路由模拟信号采集单元、 数字信号处理单元和信号转接板构成&#xff0c;组成框图如图4-1所示。 为了对带宽内的多个关键频点进行侦察监测&a…

Qt的未来发展趋势:跨平台、用户体验和AI的突破

Qt的未来发展有以下几个方面的趋势&#xff1a; 跨平台和多端支持&#xff1a;随着移动设备和嵌入式系统的普及&#xff0c;Qt将继续扩展其跨平台和多端支持能力。Qt已经在移动平台上取得了一定的成功&#xff0c;并且正在不断改进和优化移动开发工具和功能。未来&#xff0c;Q…

Tcl常用命令汇总

往期文章链接&#xff1a; 1&#xff09;基础篇&#xff1a;包括置换方法&#xff0c;特殊字符&#xff0c;incr与append用法&#xff0c;以及执行方式。 Tcl常用命令备忘录: 基础篇 2&#xff09;列表篇&#xff1a;包括list、concat、lrepeat、lindex、llength、lrange、l…

有趣的turtle(一)

关注“Python专栏”微信公众号&#xff0c;回复暗号【面试大全】&#xff0c;立即领取面试题简历模板。 turtle 是 Python 中用来绘图的标准库&#xff0c;它简单且有趣&#xff0c;很多Python初学者都愿意将它作为第一个学习对象。 下面的内容主要包含 turtle 的基本用法和一…

OpenCV(加载、修改、保存图像)

目录 1、图像加载 2、显示图像 3、修改图像 4、图像保存 OpenCV官方文档查询地址&#xff1a;OpenCV: OpenCV modules 1、图像加载 加载图像&#xff08;用cv::imread )imread功能是加载图像文件成为一个Mat对象&#xff0c;其中第一个参数表示图像文件名称 第二个参数&…

还在一步步搭建平台吗?找对方法更重要喔~

前言&#xff1a; 如今&#xff0c;随着信息化时代互联网的高速发展&#xff0c;繁琐的流程和线下的工作已经不能满足社会发展的需求&#xff0c;这个时候大家都知道系统是唯一一个可以快速解决的方法。但每个企业的需求不一样&#xff0c;成品型的系统未必能满足企业的属性。但…

MySQL数据库--------简单理解文件的相关信息

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com ———————————————————————————————————— 目录 文件的信息 文件的权限 权限的赋予 —————————————————————————————— 插播一些…

INFORMIX存储过程

一、存储过程概述 存储过程是一个用户定义的函数,由存储过程语句(SPL) 和一组SQL语句组成&#xff0c;以可以执行代码形式存储在数据库中&#xff0c;和表、视图、索引等一样&#xff0c;是数据库的一种对象。 存储过程语言SPL&#xff08;Stored Procedure Language&#xf…