Python-OpenCV人脸检测(代码)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python-OpenCV人脸检测(代码),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5145字,纯文字阅读大概需要8分钟。
内容图文
Python-OpenCV人脸检测(代码)
@author:wepon
@blog:http://blog.csdn.net/u012162613/article/details/43523507
做人脸识别,首先要检测出图片/视频中的人脸,今天就研究了一下OpenCV的Python接口,把常用的一些功能模块写成函数。基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存、眼睛检测、笑脸检测。下面简单总结一下。
一、软件安装
安装Python-OpenCV以及其依赖库、PIL,通过软件包管理器安装即可(Ubuntu系统):
sudo apt-get install libopencv-* sudo apt-get install python-opencv 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 = 0 for ( 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
原文:http://blog.csdn.net/u012162613/article/details/43523507
内容总结
以上是互联网集市为您收集整理的Python-OpenCV人脸检测(代码)全部内容,希望文章能够帮你解决Python-OpenCV人脸检测(代码)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。