使用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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为