【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测

前言

人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸的外接矩形在图像中的坐标。使用 haar 特征和 cascade 检测器进行人脸检测是一种传统的方式,下面将给出利用 OpenCV 中的 haarcascade 进行人脸检测的代码。

请添加图片描述

程序流程

请添加图片描述

代码

import cv2

# 原图
img = xxx

# 使用预训练模型创建 Cascade 分类器
getCascade = lambda model_name: cv2.CascadeClassifier(cv2.data.haarcascades + model_name)
faceCascade = getCascade("haarcascade_frontalface_default.xml")

# 获取原图像灰度图
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 识别,将结果存储到 faces 变量中
faces = faceCascade.detectMultiScale(imgGray , 1.2 , 8)

for (x,y,w,h) in faces:
    
    # 将结果绘制到原图中
    cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255) ,2)

# 显示图像
cv2.imshow("img", img)
cv2.waitKey(0)

可选的人脸检测模型(区别是检测速度和精度不同):

  • haarcascade_frontalface_alt.xml
  • haarcascade_frontalface_alt2.xml
  • haarcascade_frontalface_alt_tree.xml
  • haarcascade_frontalface_default.xml
  • haarcascade_profileface.xml

说明:使用 haar 特征和 cascade 检测器进行目标检测属于传统机器学习的方式,检测精度较低,效果并不是非常理想

从图像中检测人脸

'''
Author: CloudSir
@Github: https://github.com/CloudSir
Date: 2023-04-05 10:03:53
LastEditTime: 2023-04-05 10:08:37
LastEditors: CloudSir
Description: 
'''
import cv2

# 原图
img = cv2.imread("./test.jpg")

# 使用预训练模型创建 Cascade 分类器
getCascade = lambda model_name: cv2.CascadeClassifier(cv2.data.haarcascades + model_name)
faceCascade = getCascade("haarcascade_frontalface_default.xml")

# 获取原图像灰度图
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 识别,将结果存储到 faces 变量中
faces = faceCascade.detectMultiScale(imgGray , 1.2 , 8)

for (x,y,w,h) in faces:
    
    # 将结果绘制到原图中
    cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255) ,2)

cv2.imshow("img", img)
cv2.waitKey(0)

原图:
请添加图片描述
结果:
请添加图片描述

从视频中检测人脸

'''
Author: CloudSir
@Github: https://github.com/CloudSir
Date: 2023-04-03 19:50:34
LastEditTime: 2023-04-05 09:59:51
LastEditors: CloudSir
Description: 
'''
import cv2
import numpy as np

cap = cv2.VideoCapture("./test.mp4")

while cap.isOpened():
    img = cap.read()[1]
    getCascade = lambda model_name: cv2.CascadeClassifier(cv2.data.haarcascades + model_name)
    faceCascade = getCascade("haarcascade_frontalface_default.xml")
    imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(imgGray, 1.2, 8)

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
        print(x, y, w, h)

    cv2.imshow("cam", img)
    if cv2.waitKey(1) == ord('q'): # 按下q退出
        cv2.destroyAllWindows()
        cap.release()
        break

从摄像头中实时检测人脸

'''
Author: CloudSir
@Github: https://github.com/CloudSir
Date: 2023-04-03 19:50:34
LastEditTime: 2023-04-05 09:59:51
LastEditors: CloudSir
Description: 
'''
import cv2
import numpy as np

cap = cv2.VideoCapture(0)
while cap.isOpened():
    img = cap.read()[1]
    img = cv2.flip(img, 1) # 镜像

    getCascade = lambda model_name: cv2.CascadeClassifier(cv2.data.haarcascades + model_name)
    faceCascade = getCascade("haarcascade_frontalface_default.xml")
    imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(imgGray, 1.2, 8)

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
        print(x, y, w, h)

    cv2.imshow("cam", img)
    if cv2.waitKey(1) == ord('q'): # 按下q退出
        cv2.destroyAllWindows()
        cap.release()
        break


致正在学习计算机视觉的小伙伴们:

计算机视觉往往离不开 Python 语言,Python 是调用计算机视觉工具的必备语言,如 OpenCV、TensorFlow、PyTorch、PaddlePaddle 等都需要使用 Python。

如果你正打算学习计算机视觉,而恰巧又是一个 Python 新手,需要找一个可以在线学习的网站,我建议你去牛客网 ,他们的python题单是从最基础的输出、字符串格式化输出开始,经过运算符、列表、循环语句、条件语句、元组、字典、函数等知识点,一步一步教你慢慢学会Python那为数不多的基本语法,最后再配合上8道具有实践意义的综合实践题,可以帮你更加有效的巩固前面学会的知识。

  • 牛客网 - Python学习专区

在这里插入图片描述

加油,希望在计算机视觉这条路上的前方遇见你。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ESP32设备驱动-MLX90615红外测温仪驱动

MLX90615红外测温仪驱动 文章目录 MLX90615红外测温仪驱动1、MLX90615介绍2、硬件准备3、软件准备4、驱动实现1、MLX90615介绍 MLX90615 是一款用于非接触式温度测量的微型红外温度计。 IR 敏感热电堆探测器芯片和信号调节 ASIC 都集成在同一个微型 TO-46 罐中。 红外测温仪出…

快速尝鲜Oracle 23c免费开发者版,惊喜多多

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

分布式一致性协议

1 两阶段提交协议(2PC) 1.1 两阶段提交协议 两阶段提交协议,简称 2PC(2 Prepare Commit),是比较常用的解决分布式事务问题的方式,要么所 有参与进程都提交事务,要么都取消事务,即实现 ACID 中的原子性(A)的常用手段。…

ctfshow web入门 爆破 21-28

web21 刚进去就要求我们登录,这里题目给了我们一个字典,就是这个字典为什么他那么多数字中 就一个字母的密码还不明显吗。 这里我们使用burp拦包,这里没有发现登录的账号密码,但是有一串可疑的字符串,尝试base64解密 这…

Java设计模式 07-装饰者模式

装饰者模式 套娃模式,直接new放构造器里面套 把抽象类聚合到它的子类里 该子类(装饰者)构造抽象类的实现(被装饰者) 一、星巴克咖啡订单项目(咖啡馆) 1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式…

【Spring】2—IOC容器

⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍…

教你如何搭建物业-后勤管理系统,demo可分享

1、简介 1.1、案例简介 本文将介绍,如何搭建物业-后勤管理。 1.2、应用场景 该应用包含疫情上报、绿化、安保等管理功能。 2、设置方法 2.1、表单搭建 1)新建表单【返区登记】,字段设置如下: 名称类型名称类型姓名单行文本…

静态路由的原理和配置(理论详细实验全面)

第五章:静态路由 目录 第五章:静态路由 5.1路由器的工作原理 5.1.1路由器根据路由表转发数据 5.1.2 路由信息获取的方式 5.2路由选路原则 5.2.1最长匹配原则 5.2.2路由优先级 5.2.3路由度量值 5.3静态路由 5.3.1静态路由实验 5.3.2缺省路由实…

初学对象存储OSS---学习笔记

文章目录前言一、OSS是什么?下面以一个小故事介绍OSS的作用:二、怎么使用OSS1.进入 -----> [阿里云官网](https://www.aliyun.com/)2.点击进入OSS控制台3.获取accessKeyId 和 accessKeySecret4.拿到了accessKeyId 和 accessKeySecret ,就可…

CTP_将C++封装为Python可调用接口

目录 写在前面: 前置准备: step 1 与上期所原始代码对比分析源码 td源码 1 配置属性-》常规-》配置类型 要为 “动态库(.dll)” 2 VC目录 -》包含目录 3 VC目录 -》 库目录 4 链接器-》常规-》附加库目录 5 链接器-》输入-》附加依赖项 vnctp.h 的功…

CTF杂项提纲

CTF的杂项是涉及编码,图片隐写,音频隐写,压缩包分析的方向,本文对MISC的知识点做了一个简单列举 常见编码 ASCII 0-9,48-57 A-Z 65-90 a-z 97-122 URL url编码又叫百分号编码,是统一资源定位的编码方式 base16/…

leetcode每日一题:数组篇(1/2)

😚一个不甘平凡的普通人,日更算法学习和打卡,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:每日算法学习 💬个人…

cmake 常用方法自我总结

目录 1. 编译一个库依赖另一个库 2. 把某一个CMakeLists.txt中变量设为整个工程中任意CMakeLists.txt都可以访问 3. 枚举目录下所有匹配文件 4. 拷贝文件 5. 解决方案下分Header Files,Source Files目录 6. 依赖头文件(附加依赖项) 7.…

通过阿里云函数计算解决ChatGPT API的调用问题

ChatGPT系列文章 与其被ChatGPT取代,不如征服ChatGPT,做它的主人! 文章目录ChatGPT系列文章前言命令行部署准备工作两行命令实现部署应用中心部署使用代理访问API总结前言 自2022年11月30日 OpenAI 发布 ChatGPT 以来,虽然时有唱…

算法训练第四十九天 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机II

动态规划part10121.买卖股票的最佳时机题目描述思路暴力贪心动态规划122.买卖股票的最佳时机II题目描述思路121.买卖股票的最佳时机 题目链接:121.买卖股票的最佳时机 参考:https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9…

entos7系统部署网站项目教程【超详细教程】

CentOS 7 系统部署项目教程 本文将介绍如何在 CentOS 7 系统上部署项目。在本教程中,我们将使用 Apache、PHP 和 MySQL 作为我们的主要开发工具。对于初学者来说,这是一个入门级的教程,旨在提供一些基本的概念和工具,以帮助您更好…

实践分享:如何在自己的App 中引入AI 画图

最近AIGC 简直是杀疯了,领导动不动就让我们在APP 里引入大语言模型,引入AI画图……说搞就搞!本期基于最近在app 里引入AI画图小程序的操作,给大家做一波实践分享。 Scribble Diffusion 是一个简单的在线服务,它使用 A…

Kotlin 面向对象(二)

【文字内容源于《疯狂Kotlin讲义》,代码内容原创】 Kotlin 面向对象(一)_桃子不出的博客-CSDN博客 目录 四、隐藏和封装 1、包和导包 2、Kotlin的默认导入 3、使用访问控制符 五、深入构造器 1、主构造器和初始化块 2、次构造器和构…

Redis —缓存常见异常

文章目录缓存雪崩解决办法缓存击穿解决办法缓存穿透缓存穿透的两种常见情况解决办法布隆过滤器工作原理缓存雪崩 大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理&#…

父子组件传值问题

文章目录前言一、问题描述二、问题解决前言 在写毕业设计,涉及了一些前端Vue.js的组件传值知识并出现了相关问题,因此进行记录。 问题 Vue.js的使用不熟练,相关组件、props等掌握不清晰前端代码书写不规范 望指正! 一、问题描述 …
最新文章