Python-OpenCV人脸检测(代码)

@author:wepon

@blog:http://blog.csdn.net/u012162613/article/details/43523507

做人脸识别,首先要检测出图片/视频中的人脸,今天就研究了一下OpenCV的Python接口,把常用的一些功能模块写成函数。基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存、眼睛检测、笑脸检测。下面简单总结一下。

一、软件安装

安装Python-OpenCV以及其依赖库、PIL,通过软件包管理器安装即可(Ubuntu系统):

[python] view plaincopy
  1. sudo apt-get install libopencv-*
  2. sudo apt-get install python-opencv
  3. sudo apt-get install python-imaging

安装完后,在”/usr/share/opencv/haarcascades/”目录下,可以看到很多的xml文件,如下图。这些文件保存的就是训练好之后的haar特征,关于人脸检测的haar分类器,推荐博文:《浅析人脸检测之Haar分类器方法》、《目标检测的图像特征提取之(三)Haar特征》。本文不阐述原理,只介绍怎么用这些xml文件来进行人脸检测。

二、python-opencv实现人脸检测

  • 人脸检测

定义人脸检测函数detectFaces(),检测图片中所有出现的人脸,并返回人脸的矩形坐标(矩形左上、右下顶点坐标)。使用上面提到的xml文件(haar特征),haarcascades目录下有好几个是关于人脸检测的文件,这里选择haarcascade_frontalface_default.xml,当然也可以使用其他的。另外需要注意的是,必须以灰度图作为haar分类器的输入。

def detectFaces(image_name):img = cv2.imread(image_name)face_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml")if img.ndim == 3:gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)else:gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图faces = face_cascade.detectMultiScale(gray, 1.2, 5)#1.3和5是特征的最小、最大检测窗口,它改变检测结果也会改变result = []for (x,y,width,height) in faces:result.append((x,y,x+width,y+height))return result

代码很好理解,先加载xml文件生成级联分类器face_cascade,然后用这个级联分类器对灰度图进行检测face_cascade.detectMultiScale(gray, 1.2, 5),返回值即图片中所有人脸的坐标(x,y,w,h),在上面的函数中,我们转化了一下,使得函数返回的是人脸矩形的左上、右下顶点坐标。(注:坐标零点即原始图像左上顶点,往下y增加,往右x增加)。

  • 截取保存人脸图

上面的detectFaces函数我们获得了图片中所有人脸的坐标,在有些时候,我们希望把人脸截取出来,然后进行下一步操作(比如做人脸身份识别、表情识别等),保存人脸图的函数如下,使用了PIL的Image模块:

def saveFaces(image_name):faces = detectFaces(image_name)if faces:#将人脸保存在save_dir目录下。#Image模块:Image.open获取图像句柄,crop剪切图像(剪切的区域就是detectFaces返回的坐标),save保存。save_dir = image_name.split('.')[0]+"_faces"os.mkdir(save_dir)count = 0for (x1,y1,x2,y2) in faces:file_name = os.path.join(save_dir,str(count)+".jpg")Image.open(image_name).crop((x1,y1,x2,y2)).save(file_name)count+=1
  • 框出人脸

有些时候,为了展示或者方便观察,需要在原始图像上框出人脸,用矩形将人脸框出,这个功能的实现如下,主要用到PIL的ImageDraw模块(另外,opencv也有画矩形工具,也可以实现):

#在原图像上画矩形,框出所有人脸。
#调用Image模块的draw方法,Image.open获取图像句柄,ImageDraw.Draw获取该图像的draw实例,然后调用该draw实例的rectangle方法画矩形(矩形的坐标即
#detectFaces返回的坐标),outline是矩形线条颜色(B,G,R)。
#注:原始图像如果是灰度图,则去掉outline,因为灰度图没有RGB可言。drawEyes、detectSmiles也一样。
def drawFaces(image_name):faces = detectFaces(image_name)if faces:img = Image.open(image_name)draw_instance = ImageDraw.Draw(img)for (x1,y1,x2,y2) in faces:draw_instance.rectangle((x1,y1,x2,y2), outline=(255, 0,0))img.save('drawfaces_'+image_name)

好了,先看一下效果,运行drawFaces(‘obama.jpg’),得到右图:

运行saveFaces(‘obama.jpg’),将在当前目录下生成一个文件夹,并保存上面框出来的人脸,当然,有一些人脸没被检测出来,有些不是人脸被误认为人脸。

  • 眼睛检测

在haarcascades目录下,也有一些关于眼睛检测的xml文件。可以像函数detectFaces()那样,将检测face的xml文件换成检测eyes的xml文件即可。但是,由于眼睛在人脸上,我们往往是先检测出人脸,再细入地检测眼睛。故detectEyes可在detectFaces基础上来进行,代码中需要注意“相对坐标”。detectEyes()函数同样返回所有eyes在原图中的坐标。

def detectEyes(image_name):eye_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_eye.xml')faces = detectFaces(image_name)img = cv2.imread(image_name)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)result = []for (x1,y1,x2,y2) in faces:roi_gray = gray[y1:y2, x1:x2]eyes = eye_cascade.detectMultiScale(roi_gray,1.3,2)for (ex,ey,ew,eh) in eyes:result.append((x1+ex,y1+ey,x1+ex+ew,y1+ey+eh))return result
  • 框出眼睛
def drawEyes(image_name):eyes = detectEyes(image_name)if eyes:img = Image.open(image_name)draw_instance = ImageDraw.Draw(img)for (x1,y1,x2,y2) in eyes:draw_instance.rectangle((x1,y1,x2,y2), outline=(0, 0,255))img.save('draweyes_'+image_name)

运行drawEyes(‘obama.jpg’),看下效果,非常差:

  • 笑脸检测
def detectSmiles(image_name):img = cv2.imread(image_name)smiles_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_smile.xml")if img.ndim == 3:gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)else:gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图smiles = smiles_cascade.detectMultiScale(gray,4,5)result = []for (x,y,width,height) in smiles:result.append((x,y,x+width,y+height))return result
  • 框出笑脸
def drawSmiles(image_name):smiles = detectSmiles(image_name)if smiles:img = Image.open(image_name)draw_instance = ImageDraw.Draw(img)for (x1,y1,x2,y2) in smiles:draw_instance.rectangle((x1,y1,x2,y2), outline=(100, 100,0))img.save('drawsmiles_'+image_name)

运行drawSmiles(‘obama.jpg’),看下效果,奥巴马的眼睛会笑了:

总之,利用opencv里训练好的haar特征的xml文件,在图片上检测出人脸(眼睛、鼻子、笑脸…)的坐标,利用这个坐标,我们可以将人脸区域剪切保存,也可以在原图上将人脸框出。剪切保存人脸以及用矩形工具框出人脸,本程序使用的是PIL里的Image、ImageDraw模块。此外也可以用opencv里的画图工具画矩形。

代码文件放在我的github上:wepe/OpenCV-demo/FaceDetection_python-opencv

参考:

1、OpenCV-Python Tutorials » Object Detection » Face Detection using Haar Cascades

2、 Python Imaging Library Handbook

Python-OpenCV人脸检测(代码)相关推荐

  1. python+OpenCV视频检测+代码以及注解

    这部分是关于检测摄像头中的人脸,以及对mp4中的文件人脸检测,上代码: #导入cv模块 import cv2 as cv #检测函数 def face_detect_demo(img):gary = ...

  2. Python+opencv 人脸识别

    python+opencv人脸检测+识别示例及原理解析 一.开发环境搭建 二.图片人脸检测 2.1 文件准备与编程 2.2 注意事项 三.视频人脸识别 3.1文件准备与编程 3.2 注意事项 四.人脸 ...

  3. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  4. OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

    OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...

  5. python人脸检测代码_python实现人脸识别代码

    从实时视频流中识别出人脸区域,从原理上看,其依然属于机器学习的领域之一,本质上与谷歌利用深度学习识别出猫没有什么区别.程序通过大量的人脸图片数据进行训练,利用数学算法建立建立可靠的人脸特征模型,如此即 ...

  6. 教你用OpenCV人脸检测自动给头像戴圣诞帽(附代码)

    来源:老王和他的IT界朋友们 作者:流川疯 本文长度为3400字,建议阅读7分钟 跟着代码走,教你自动给头像带上圣诞帽. 原图: 效果: 原理其实很简单: 采用一张圣诞帽的png图像作为素材 利用pn ...

  7. python视频人脸检测_OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  8. Python+OpenCV人脸识别签到考勤系统(新手入门)

    Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...

  9. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

  10. 基于python opencv人脸识别的签到系统

    基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...

最新文章

  1. git 获取最新代码_常用命令之git操作(入门篇)
  2. C/C++中Static和Const的作用
  3. mysql-Federated存储方式,远程表,相当于sql server的linked server
  4. 外联接、自联接与联合
  5. 进行判断使用class_记一次使用 Arthas 热更新线上代码
  6. PHP基本语法(实例)
  7. 页面无法访问 css文件加载问题
  8. python在json文件中查找指定数据_Python中json的取值 如何使用python提取json中指定字段的数据...
  9. TensorFlow 学习初步-环境搭建
  10. 维信诺全柔AMOLED产线启用 对“加入华为供应链”一事避而不谈
  11. java callable
  12. Struts2 页面url请求怎样找action
  13. php调用谷歌翻译接口_PHP调用谷歌翻译
  14. linux进程通信方式总结
  15. 运行计算机名找不到打印机,电脑找不到打印机怎么解决
  16. Clion 2021解决中文输出乱码问题-亲测有效
  17. C++Programming Guidelines
  18. 计算机开机最快,教你如何让你的电脑快速开机
  19. 学习淘淘商城第三十四课(在业务逻辑中添加缓存)
  20. Web自动化【7】——python 使用QQ邮箱发送邮件,端口号25,465,578,的区别,及错误码535,530的解决办法

热门文章

  1. 数据--第25课 - 队列课后练习
  2. 快速部署PostgreSQL
  3. 全国多地元旦迎雾霾天气 京津冀霾明天短暂减弱
  4. 一些有意思的博客收藏
  5. 使用自制ADempiere 3.6.0 LTS安装软件进行安装(基于Ubuntu Desktop 12.04 LTS)
  6. 实践实践在实践,才能牛逼得一逼。Python
  7. TCPClient例子(3)基于委托和事件的TcpHelper程序
  8. Eclipse断点种类
  9. RecyclerView混合布局
  10. linux中mysql基本操作