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

Read more: http://bluewhale.cc/2017-07-28/use-python-and-opencv-to-detect-faces-and-eyes.html#ixzz4o6BB3n4N   

本文作者:佚名

来源:51CTO

时间: 2024-10-22 21:32:06

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

python opencv 检测特定颜色

15-python opencv 检测特定颜色 15-python opencv 检测特定颜色 概述 实现过程 定义视频对象 设置HSV中蓝色天蓝色范围 获取视频帧并转成HSV格式 获取mask 图像按位操作 源代码 运行结果 参考 概述 本节实现的是使用OpenCV里自带的函数,检测出视频里图像中的蓝色和天蓝色.青色,比如我的手机背景.我衣服上的蓝色格子,墙砖的蓝色和学生证照片上的蓝色背景. 设置"蓝色"HSV范围 BGR转HSV 捕获摄像头视频 获取蓝色部分mask 图像按位与操作

Python OpenCV 读取并显示图像

01-Python OpenCV 读取并显示图像 01-Python OpenCV 读取并显示图像 概述 实现过程 引用 打开图片并显示 创建一个空图 将彩色图像转成灰度图像 等待键盘输入并关闭所有窗口 源代码 运行结果 参考 概述 Python作为一门极其易学的语言,在科学计算等领域存在较大的应用,同样,著名的OpenCV库也发布了支持Python的库,本节主不再介绍如何在Ubuntu上配置Python OpenCV,有需要的同学可以参考这里. 本节将利用Python OpenCV做一个简单的

视频-Python opencv帧 怎么 显示在GUI 中?

问题描述 Python opencv帧 怎么 显示在GUI 中? 现在要在做,将摄像头提取的视频处理后显示在python 的GUI 中,计划在GUI中可以选择对视频处理的方式,请问 大神 应该怎么做?使用什么控件? 一般显示是直接 将 帧 在cv2.imshow函数中显示,而在一个 完整的GUI中怎么做?

RPi 2B python opencv camera demo example

/************************************************************************************** * RPi 2B python opencv camera demo example * 声明: * 本文主要记录RPi 2B 使用python opencv来获取图片的方式. * * 2016-2-24 深圳 南山平山村 曾剑锋 **********************************************

opencv中的sift算法是不是只能检测一个匹配目标啊?

问题描述 opencv中的sift算法是不是只能检测一个匹配目标啊? 初学sift算法,现在做一个小程序,用opencv里的sift算法匹配目标,现在假设场景中存在多个匹配的目标,但是每次检测好像都只检测到第一个.怎样让它把多个目标都识别出来啊?小白求指导!先谢谢各位大神 解决方案 sift算法是基于图像特征进行匹配的,你可以尝试基于图像区域的一些算法,看你的匹配目标在哪里,将其设定为匹配区域就可以了

opencv自带的Harr-like特征人脸检测

问题描述 opencv自带的Harr-like特征人脸检测 如图是opencv自带的训练好的分类器文件haarcascade_frontalface_alt.xml,stage是级联层数,下面tree下面各结点代表的弱分类器的各参数值是什么意思啊?我知道这是弱分类器的组合,弱分类器是单层决策树吧?怎么有两个Rect和这么多阈值?多谢帮助 解决方案 [特征检测]Harr-like特征算法 解决方案二: 你可以参考 http://blog.csdn.net/hujingshuang/article/

opencv帧差法,移动物体检测

问题描述 opencv帧差法,移动物体检测 USB采集视频,用帧差法处理,得到移动物体的二值化后的白色图像,后面怎么判断已经检测到了移动物体? 各位大神,帮帮忙!先谢谢了 解决方案 OpenCV之帧差法检测运动目标 解决方案二: 首先,可以背景生成,通过一段时间,对图像的背景进行平均,这样就能够得到背景图 然后用当前帧与背景图做差,就可以获得移动的物体了

python opencv 使用摄像头捕获视频并显示

06-python opencv 使用摄像头捕获视频并显示 06-python opencv 使用摄像头捕获视频并显示 概述 实现过程 引用 创建摄像头对象 逐帧显示实现视频播放 释放摄像头对象和窗口 源代码 运行结果 参考 概述 本节实现的是使用内建摄像头捕获视频,并显示视频的每一帧以实现视频的播放. 创建摄像头对象 逐帧显示实现视频播放 实现过程 引用 不再赘述,代码如下. import cv2 import numpy import matplotlib.pyplot as plot 创建

python opencv 读取视频文件并显示

06-python opencv 读取视频文件并显示 06-python opencv 读取视频文件并显示 概述 实现过程 引用 创建摄像头对象 逐帧显示实现视频播放 释放摄像头对象和窗口 源代码 运行结果 参考 概述 本节实现的是使用内建摄像头捕获视频,并显示视频的每一帧以实现视频的播放. 创建摄像头对象,指向文件 逐帧显示实现视频播放 实现过程 引用 不再赘述,代码如下. import cv2 import numpy 创建摄像头对象 使用opencv自带的VideoCapture()函数定