B站Python与OpenCV人脸识别项目超详细记录(对图片、视频、摄像头人脸的检测)

news2024/9/22 14:00:21

课程来源:一天搞定人脸识别项目!学不会up直接下跪!(python+opencv)_哔哩哔哩_bilibili

图片来源:感谢王鹤棣先生友情出镜~

环境配置详见:

在conda虚拟环境中安装OpenCv并在pycharm中使用_conda虚拟环境安装opencv_好喜欢吃红柚子的博客-CSDN博客



一、读取图片

 1.1 代码实现

#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('1.png')
#显示图片
cv.imshow('showFace',img)
#等待delay
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

1.2 效果展示 

二、图片灰度化

2.1 图片灰度化作用 

 图像处理时为什么灰度化_图像灰度化处理的目的_whaosoft143的博客-CSDN博客 


 为什么做图片识别要将彩色图像灰度化呢?

图像灰度化的目的是为了简化矩阵,提高运算速度。

        彩色图像中的每个像素颜色由R、G、B三个分量来决定,而每个分量的取值范围都在0-255之间,这样对计算机来说,彩色图像的一个像素点就会有256*256*256=16777216种颜色的变化范围!

        而灰度图像是R、G、B分量相同的一种特殊彩色图像,对计算机来说,一个像素点的变化范围只有0-255这256种。

        彩色图片的信息含量过大,而进行图片识别时,其实只需要使用灰度图像里的信息就足够了,所以图像灰度化的目的就是为了提高运算速度。

        当然,有时图片进行了灰度处理后还是很大,也有可能会采用二值化图像(即像素值只能为0或1)。


2.2 所需方法

2.2.1 设置灰度方法

cvtColor() 

 2.2.2 保存图片方法

imwrite()

2.3 代码实现

#导入模块
import cv2 as cv
#读取图片
img = cv.imread("face1.png")
#灰度转换
gray_img = cv.cvtColor(img,cv.COLOR_BGRA2GRAY)
#显示灰度
cv.imshow("greyImg",gray_img)
#保存灰度图片
cv.imwrite('gray_face1.png',gray_img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

 2.4 效果展示

2.4.1 显示灰度图片 

2.4.2 保存灰度图片

        在关闭显示的灰度图片后,会将该图片进行保存

三、尺寸转换

3.1  尺寸转换方法

resize()

3.2 代码展示 

import cv2 as cv

#读取图片
img = cv.imread("face1.png")
#修改尺寸
img_resized = cv.resize(img,(200,200))
#显示原图
cv.imshow("face01",img)
#显示修改尺寸后的图
cv.imshow("face01_resized",img_resized)
#打印原图和修改图的尺寸
print("原图大小:",img.shape,"\n修改后大小:",img_resized.shape)
#保存修改大小后的图片
cv.imwrite("resize_face1.png",img_resized)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

3.3 效果展示

3.3.1 显示修改后的图片

3.3.2 保存图片

3.3.3 输出图片的大小

3为彩色图片的通道数。

3.4 按下英文输入法中的m键后退出程序

import cv2 as cv

#读取图片
img = cv.imread("face1.png")
#修改尺寸
img_resized = cv.resize(img,(200,200))
#显示原图
cv.imshow("face01",img)
#显示修改尺寸后的图
cv.imshow("face01_resized",img_resized)
#打印原图和修改图的尺寸
print("原图大小:",img.shape,"\n修改后大小:",img_resized.shape)
#按下m键时退出程序
while True:
    if ord('m') == cv.waitKey(0):
        break
#释放内存
cv.destroyAllWindows()

四、绘制矩形和圆形框

 4.1 绘制矩形

 cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

参数介绍: 

 python版opencv函数学习笔记-cv.rectangle()全参数理解_风一样的夏天001的博客-CSDN博客

作用:根据给定的左上顶点和右下顶点画矩形 

 参数说明:

  • img:指定一张图片,在这张图片的基础上进行绘制;
  • pt1: 矩形的一个顶点;
  • pt2: 与pt1在对角线上相对的矩形的顶点;
  • color:指定边框的颜色,由(B,G,R)组成,当为(255,0,0)时为绿色,可以自由设定;
  • thinkness:线条的粗细值,为正值时代表线条的粗细(以像素为单位),为负值时边框实心;
     

4.2 绘制圆形

cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None):

作用:根据给定的圆心和半径等画圆

参数说明:

  • img:输入的图片data
  • center:圆心位置
  • radius:圆的半径
  • color:圆的颜色
  • thickness:圆形轮廓的粗细(如果为正)。负厚度表示要绘制实心圆。

4.3 代码实现

import cv2 as cv
x,y,w,h = 100,100,100,100
#读取图片
img = cv.imread("face1.png")
#绘制矩形
cv.rectangle(img,pt1=(x,y),pt2=(x+w,y+h),color=(0,0,255),thickness=1)
#绘制圆形
cv.circle(img,center=(x,y),radius=100,color=(255,0,0),thickness=2)
#显示图片
cv.imshow("draw_face1",img)

while True:
    if ord('m')==cv.waitKey(0):
        break
cv.destroyAllWindows()

 4.4 效果展示

 
五、人脸检测

5.1 OpenCV自带的分类器

         在下图的路径中,我们可以看到需要xml文件,这些都是OpenCV中自带的分类器,根据文件名我们可以看到有识别眼睛的,身体的,脸的,等等。

        使用cv.CascadeClassifier(参数:分类器所在路径)方法定义一个分类器对象。

     

我的分类器所在位置: 

  • OpenCV分类器路径:G:\conda\envs\testOpencv\Lib\site-packages\cv2\data
  • 本次使用的分类器文件名:haarcascade_frontalface_alt2.xml
  • 在代码中输入的完整路径(需要把右下划线改为左下划线): G:/conda/envs/testOpencv/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml

5.2 detectMultiScale方法

opencv人脸检测--detectMultiScale函数_walker lee的博客-CSDN博客_detectmultiscale

detectMultiScale

                    (self,
                     image: Any,
                     scaleFactor: Any = None,
                     minNeighbors: Any = None,
                     flags: Any = None,
                     minSize: Any = None,
                     maxSize: Any = None) 

作用:

        它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小,用矩形Rect类表示,函数由分类器对象调用。

参数介绍:

  1. image: 待检测图片,一般为灰度图像加快检测速度
  2. scaleFactor:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,即每次搜索窗口依次扩大10%;   scale_factor参数可以决定两个不同大小的窗口扫描之间有多大的跳跃,这个参数设置的大,则意味着计算会变快,但如果窗口错过了某个大小的人脸,则可能丢失物体
  3. minNeighbors:默认值为3,表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
  4. flags:一般使用默认值0;
  5. minSize和maxSize用来限制得到的目标区域的最大/最小尺寸。

5.3 代码

import cv2 as cv

def face_detect_methed():
    # 图片灰度化
    grey_img = cv.cvtColor(img,cv.COLOR_BGRA2GRAY)
    # 定义分类器,使用OpenCV自带的分类器
    face_detector = cv.CascadeClassifier('G:/conda/envs/testOpencv/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
    # 使用分类器
    face = face_detector.detectMultiScale(grey_img)
    # 在图片中对人脸画矩阵
    for x,y,w,h in face:
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
    cv.imshow('result',img)

#读取图像
img = cv.imread("face1.png")
#调用检测函数
face_detect_methed()


while True:
    if ord('m') == cv.waitKey(0):
        break

cv.destroyAllWindows()

5.4 效果展示 

 此时为没有设定参数,可以看到图片识别人脸出现了失误,把背景中的海浪也识别为了人脸。

在调整了参数后可以看到,人脸识别正确,识别出了一个人脸

六、检测多个人脸 

      此次可以识别多个人脸,与识别一个人脸的代码基本相同,这次换了一个分类器,即OpenCV自带的默认人脸识别分类器,调整了一下detectMultiScale的参数,识别结果较为准确,但是有一个人脸未识别出来。

 6.1 代码实现

import cv2 as cv

def face_detect_methed():
    # 图片灰度化
    grey_img = cv.cvtColor(img,cv.COLOR_BGRA2GRAY)
    # 定义分类器,使用OpenCV自带的分类器
    face_detector = cv.CascadeClassifier('G:/conda/envs/testOpencv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
    # 使用分类器
    face = face_detector.detectMultiScale(grey_img,1.1,5,0,(10,10),(200,200))
    # 在图片中对人脸画矩阵
    for x,y,w,h in face:
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
    cv.imshow('result',img)

#读取图像
img = cv.imread("faceMorePeople.png")
#调用检测函数
face_detect_methed()

while True:
    if ord('m') == cv.waitKey(0):
        break

cv.destroyAllWindows()

6.2 效果展示

 可以看到识别的不算准确,c位的人脸没有被识别出来,我挑了很多次参数也换了分类器还是不行,就这样吧那~

 

七、对视频的检测

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

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

相关文章

已解决io.UnsupportedOperation: not readable

已解决Python读取文件报错:io.UnsupportedOperation: not readable亲测有效 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 一个小伙伴遇到问题跑来私信我,想用Python读取文件,但是发生了报错(当时他…

跟同事杠上了,Apache Beanutils为什么被禁止使用?

收录于热门专栏Java基础教程系列(进阶篇) 在实际的项目开发中,对象间赋值普遍存在,随着双十一、秒杀等电商过程愈加复杂,数据量也在不断攀升,效率问题,浮出水面。 问:如果是你来写…

Redis过期删除策略

目录引出Redis过期删除策略Redis的两种过期策略:定期删除 惰性删除定期删除惰性删除Redis两种过期删除策略存在的问题Redis缓存淘汰策略Redis中的LRU和LFU算法1、LRU(Least Recently Userd最近最少使用)LFU 算法的引入2、LFU(lea…

Netty 组件学习

Netty 组件学习Netty 各个组件通俗理解EventLoopEventLoopGroup关闭ChannelFuture & PromiseHandler & PipelineByteBuf创建直接内存和堆内存池化和非池化组成方法扩容机制读取retain和release方法Netty 各个组件通俗理解 Channel即数据通道 Msg是数据,传…

对KMP简单的理解

声明:下边的例子均表示下标从1开始的数组 ne数组的定义: next[i] 就是使子串 s[1…i] 有最长相等前后缀的前缀的最后一位的下标。ne[i]也可以表示相等子串的长度 准备执行jne[j]时, 表示当前s[i]!p[j1] , 如果ne[j]1 ,那么下…

Dubbo和Zookeeper集成分布式系统快速入门

文件结构 代码部分 1、新建provider-server导入pom依赖 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.3</version></dependency><dependency>&l…

golang的web框架Gin(一)---Gin的安装与初体验

简介 1.1 介绍 Go世界里最流行的Web框架&#xff0c;Github上有32Kstar。 基于httprouter开发的Web框架。 中文文档齐全&#xff0c;简单易用的轻量级框架。 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有…

C++模板初阶

C模板初阶泛型编程函数模板概念函数模板格式函数模板原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程 我们前面学习了C的函数重载功能&#xff0c;那么我们如何实现一个通用的交换函数呢&#xff0c;比如:我传入int就是交换int&#xff…

JavaSE XML语法规则和文档约束介绍

文章目录XMLXML基本介绍XML创建和语法规则XML文档约束认识文档约束DTD约束(了解)schema约束(了解)XML XML基本介绍 XML概述: XML是可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;的缩写&#xff0c;它是一种可以自定义数据的表示格式&#xff0c;可以描述…

【mysql数据库】

目录SQL数据库分页聚合函数表跟表之间的关联关系SQL中怎么将行转成列SQL注入将一张表的部分数据更新到另一张表WHERE和HAVING的区别索引索引分类如何创建及保存MySQL的索引&#xff1f;怎么判断要不要加索引&#xff1f;索引设计原理只要创建了索引&#xff0c;就一定会走索引吗…

ESP-01S通过AT指令上报数据到阿里云物模型

ESP-01S使用AT指令上报数据到阿里云物模型 上篇文章介绍了如何用AT指令连接阿里云并进行通信&#xff1a;https://blog.csdn.net/weixin_46251230/article/details/128995530 但最终需要将传感器数据上报到云平台显示&#xff0c;所以需要建立阿里云物模型 阿里云平台建立物…

代码随想录第62天(单调栈):● 739. 每日温度 ● 496.下一个更大元素 I

今天开启单调栈的篇章&#xff0c;一般什么时候采用单调栈&#xff1f;通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。 一、每日温度 题目描述&#xff1a; 思路和想法&#xff1a; 这里单调栈里只放数组下标&#xff0c;再了…

删除Android Studio中重复的JDK配置

问题 可能因为一些不经意的操作&#xff0c;导致如下这种情况&#xff1a;出现多余重复的JDK路径配置&#xff0c;其实指向的是同一个路径。 强迫症犯了之后&#xff0c;就会想怎么干掉这个&#xff08;2&#xff09;。 解决 第一步&#xff1a;先打开你最近打开的项目&…

开篇之作——闲聊几句AUTOSAR(2)

开篇之作——闲聊几句AUTOSAR 我是穿拖鞋的汉子,魔都中坚持长期主义的工科男! 在上一篇文章中主要介绍了啥是AUTOSAR,AUTOSAR要干点啥,以及AUTOSAR的发展历史。接下来在本文中将继续介绍: -> AUTOSAR的合作伙伴关系; -> 组织架构; -> 基础标准规范。 言归正…

微信公众号网页在本地开发模式下如何使用正式环境的域名来调试

微信公众号网页在本地开发模式下如何使用正式环境的域名来调试&#xff1f; 鄙人之前也不知道&#xff0c;网上搜了一下&#xff0c;看到的几篇文章都是要使用代理&#xff0c;有用Nginx的&#xff0c;还有自己写代理的。主要是按照步骤做了并不行。于是自己折腾了一下&#x…

缓存中间件Caffeine超详细源码解读

读源码是一件非常复杂、困难、枯燥的过程&#xff0c;这个复杂过程我给大家踩了&#xff0c;各位看官躺平看就行啦初始化入口&#xff1a;//典型的工厂模式&#xff0c;初始化一个caffeine对象 Caffeine.newBuilder();CheckReturnValue public static Caffeine<Object, Obje…

(考研湖科大教书匠计算机网络)第四章网络层-第三节1:IPv4地址概述

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;IPv4地址概述二&#xff1a;IPv4地址表示方法&#xff08;1&#xff09;概述&#xff08;2&#xff09;8位无符号二进制数转十进制正整数&#xff…

大数据工具Maxwell的使用

1.Maxwell简介 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台。 官…

Elasticsearch7.8.0版本进阶——路由计算

目录一、路由计算1.1、路由计算的前提理解1.2、路由计算的概述1.3、路由计算的概述一、路由计算 1.1、路由计算的前提理解 当索引一个文档的时候&#xff0c;文档会被存储到一个主分片中。Elasticsearch 如何知道一个文档应该存放到哪个分片中呢&#xff1f;当我们创建文档时…

mycat连接mysql 简单配置

mycat三个配置文件位于conf下 可通过Notepad操作 首先配置service.xml中的user标签&#xff0c;设置用户名&#xff0c;密码&#xff0c;查询权限&#xff0c;是否只读等 只是设置了root用户&#xff0c;有所有权限 配置schema.xml <?xml version"1.0"?&g…