使用Python + OpenCV来实现脸部和眼睛的检测

2023-10-18 04:10

本文主要是介绍使用Python + OpenCV来实现脸部和眼睛的检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


使用Python + OpenCV来实现脸部和眼睛的检测

本篇文章使用Python和OpenCV中的Haar特征分类器对人脸及眼睛进行检测和追踪。在开始之前,有几件准备工作要完成。

  • 第一,你需要有一个摄像头,如果没有的话也可以使用视频文件来替代。
  • 第二,需要在python中安装OpenCV库。具体的方法是在这里下载相应的wheel(.whl)文件,并使用pip进行安装。
  • 第三,下载OpenCV中的Haar特征分类器,你可以从Opencv官网下载源程序解压后获得Haar特征分类器,也可以直接下载所需的xml文件。

在完成准备工作后,我们开始进行人脸及眼睛的检测和追踪工作。首先导入所需使用的库文件。这里我们只需要使用numpy和cv2两个库。

 
  1. #导入所需库文件 
  2.  
  3. import numpy as np 
  4.  
  5. import cv2  

加载Haar特征分类器中的面部识别和眼睛识别两个xml文件。如何你还需要识别更多的元素也在这里一并加载。

 
  1. #加载面部识别文件(请按文件实际存储路径进行调整) 
  2.  
  3. #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml 
  4.  
  5. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml'
  6.  
  7. #加载眼部识别文件(请按文件实际存储路径进行调整) 
  8.  
  9. #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_eye.xml 
  10.  
  11. eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml' 

打开你的摄像头来获取视频,到这一步摄像头开始工作,但还没有任何影像输出。如果没有摄像头可以使用电脑里的视频文件进行替代。

 
  1. #打开摄像头获取视频 
  2. cap = cv2.VideoCapture(0)  

我们同时将对摄像头获取的图像进行保存,这里对视频文件进行处理并设置保存路径及视频尺寸。(这一步不是必须的操作)

 
  1. #编译并输出保存视频 
  2. fourcc = cv2.VideoWriter_fourcc(*'XVID'
  3. out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))  

开始获取并处理视频内容。下面是一个无限的循环结构,通过按键q可以结束循环。在这个循环中ret获取摄像头是否有返回的布尔值,img获取摄像头拍摄的视频内容。我们首先将摄像头获取的彩色图像转化为灰度图像。后续的操作将主要在灰度图像上完成,然后再使用灰度图像中的坐标对原始的彩色图像进行标记和输出。图像转化为灰度后首先进行人脸检测,然后在人脸检测的基础上再进行眼睛检测,这样做的原因有两点,1,避免面部以外的物体被错误的识别为眼睛,2,眼睛识别算法需要一些眼睛周围的面部特征来进行检测,从而提高准确率。

随后使用矩形绘制出人脸的位置和眼睛的位置,在设置绘制颜色时需要注意,OpenCV中的颜色值并不是RGB,而是BRG。检测和绘制完成后对图像进行输出。这时可以在视频窗口中看到被标记的面部和眼睛。由于我们使用的Haar特征分类器是正面面部识别,因此需要正对摄像头。如果面部发生偏转则无法识别。

 
  1. #无限循环 
  2. while(True): 
  3.     #获取视频及返回状态 
  4.     ret, img = cap.read() 
  5.     #将获取的视频转化为灰色 
  6.     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
  7.     #检测视频中的人脸,并用vector保存人脸的坐标、大小(用矩形表示) 
  8.     faces = face_cascade.detectMultiScale(gray, 1.3, 5) 
  9.   
  10.     #脸部检测 
  11.     for (x,y,w,h) in faces: 
  12.         cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 
  13.         roi_gray = gray[y:y+h, x:x+w] 
  14.         roi_color = img[y:y+h, x:x+w] 
  15.         #检测视频中脸部的眼睛,并用vector保存眼睛的坐标、大小(用矩形表示) 
  16.         eyes = eye_cascade.detectMultiScale(roi_gray) 
  17.         #眼睛检测 
  18.         for (ex,ey,ew,eh) in eyes: 
  19.             cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 
  20.   
  21.     #显示原图像 
  22.     cv2.imshow('img',img) 
  23.     #按q键退出while循环 
  24.     if cv2.waitKey(30) & 0xFF == ord('q'): 
  25.         break  

退出while循环后释放摄像头,完成视频输出并关闭所有窗口。

 
  1. #释放摄像头 
  2. cap.release() 
  3. #关闭视频输出 
  4. out.release() 
  5. #关闭所有窗口 
  6. cv2.destroyAllWindows() 

以下是完整的人脸及眼睛检测代码:

 
  1. def face_eye(): 
  2.     import numpy as np 
  3.     import cv2 
  4.   
  5.     face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml'
  6.     eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml'
  7.   
  8.     cap = cv2.VideoCapture(0) 
  9.     fourcc = cv2.VideoWriter_fourcc(*'XVID'
  10.     out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) 
  11.   
  12.     while(True): 
  13.         ret, img = cap.read() 
  14.         gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
  15.         faces = face_cascade.detectMultiScale(gray, 1.3, 5) 
  16.   
  17.         for (x,y,w,h) in faces: 
  18.             cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 
  19.             roi_gray = gray[y:y+h, x:x+w] 
  20.             roi_color = img[y:y+h, x:x+w] 
  21.             eyes = eye_cascade.detectMultiScale(roi_gray) 
  22.             for (ex,ey,ew,eh) in eyes: 
  23.                 cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 
  24.   
  25.         cv2.imshow('img',img) 
  26.         if cv2.waitKey(30) & 0xFF == ord('q'): 
  27.             break 
  28.     cap.release() 
  29.     out.release() 
  30.     cv2.destroyAllWindows() 
  31.   
  32. face_eye()  


本文作者:佚名

来源:51CTO

这篇关于使用Python + OpenCV来实现脸部和眼睛的检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/230102

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do