您的位置:首页 > 编程语言 > Python开发

python人脸识别

2017-03-20 17:35 357 查看

代码

Talk is cheap, show you the code!

代码参考自:这里

无注释版:

import cv2
faceClassifier=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
objImage=cv2.imread('test2.jpg')
cvtImage=cv2.cvtColor(objImage,cv2.COLOR_BGR2GRAY)
foundFaces=faceClassifier.detectMultiScale(cvtImage,scaleFactor=1.3,minNeighbors=9,minSize=(50,50))
for (x,y,w,h) in foundFaces:
cv2.rectangle(objImage,(x,y),(x+w,y+h),(0,0,255),2)
detectResult=str(len(foundFaces))+' faces detected'
cv2.imshow(detectResult, objImage)
cv2.waitKey(0)


注释版:

# -*- coding:utf-8 -*-
import cv2
'''
这里的 CascadeClassifier 是 层级分类器 的意思。为什么要 分层 呢?刚才提到在进行机器分析照片时,其实是对整个图片从上到下,
从左到右,一个像素一个像素的分析,这些分析又会涉及很多的 特征分析 ,比如对于人脸分析就包含识别眼睛,嘴巴等等,
一般为了提高分析的准确度都需要有成千上万个特征,这样对于每个像素要进行成千上万的分析,对于整个图片都是百万甚至
千万像素,这样总体的计算量会是个天文数字。但是,科学家很聪明,就想到分级的理念,即把这些特征分层,这样分层次去
验证图片,如果前面层次的特征没有通过,对于这个图片就不用判断后面的特征了。这样就提高了处理的速度与效率。
'''
#加载haarcascade_frontalface_default.xml这个文件
faceClassifier=cv2.CascadeClassifier('D:/Opencv2/opencv/build/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
objImage=cv2.imread('test2.jpg') #读取图片
'''
首先将图片进行灰度化处理,以便于进行图片分析。这种方法在图像识别领域非常常见,比如在进行验证码的机器识别时就会先
灰度化,去除不相关的背景噪音图像,然后再分析每个像素,以便抽取出真实的数据。不对针对此,你就看到非常多的验证码后
面特意添加了很多的噪音点,线,就是为了防止这种程序来灰度化图片进行分析破解。
'''
cvtImage=cv2.cvtColor(objImage,cv2.COLOR_BGR2GRAY) #将图片转为灰度图
'''
执行detectMultiScale方法来识别物体,因为我们这里使用的是人脸的cascade classifier分类器,因此调用这个方法会来
进行面部识别。后面这几个参数来设置进行识别时的配置,比如

scaleFactor: 因为在拍照,尤其现在很多都是自拍,这样照片中有的人脸大一些因为离镜头近,而有些离镜头远就会小一些,
因为这个参数用于设置这个因素,如果你在使用不同的照片时如果人脸远近不同,就可以修改此参数,请注意此参数必须要大于1.0

minNeighbors: 因为在识别物体时是使用一个移动的小窗口来逐步判断的,这个参数就是决定是不是确定找到物体之前需要判断多少个周边的物体

minSize:刚才提到识别物体时是合作小窗口来逐步判断的,这个参数就是设置这个小窗口的大小
'''

foundFaces=faceClassifier.detectMultiScale(cvtImage,scaleFactor=1.3,minNeighbors=9,minSize=(50,50)) #人脸检测

'''
遍历发现的“人脸”,需要说明的返回的是由4部分组成的位置数据,即这个“人脸”的横轴,纵轴坐标,宽度与高度。
然后使用 OpenCV 提供的方法在原始图片上画出个矩形。其中 (0,0,255) 是使用的颜色,这里使用的是R/G/B的颜色
表示方法,比如 (0,0,0)表示黑色,(255,255,255)表示白色,有些网页编程经验的程序员应该不陌生。
'''
for (x,y,w,h) in foundFaces:#循环读取人脸的矩形对象列表,获得人脸矩形的坐标和宽高, 然后在原图片中画出该矩形框
cv2.rectangle(objImage,(x,y),(x+w,y+h),(0,0,255),2)

detectResult=str(len(foundFaces))+' faces detected'
cv2.imshow(detectResult, objImage) #显示这个图片
cv2.waitKey(0)#等待用户按下键盘任意一个键来退出此图片的显示窗口


测试

测试样例1

test.jpg原图:



代码运行效果:



测试样例2

再换一张图片:



直接使用上面的代码测试的结果为:



发现检测效果不是很好,修改如下代码中的参数

foundFaces=faceClassifier.detectMultiScale(cvtImage,scaleFactor=1.3,minNeighbors=9,minSize=(50,50)) #人脸检测


为:

foundFaces=faceClassifier.detectMultiScale(cvtImage,scaleFactor=1.3,minNeighbors=2,minSize=(50,50)) #人脸检测


再次运行效果为:



这次运行效果就很不错了,所有人脸都可以被检测到了。

测试样例3

再换一张图片:



直接按照第一份代码运行的话,不能检测到任何一张人脸。修改detectMultiScale函数的参数为:

foundFaces=faceClassifier.detectMultiScale(cvtImage,scaleFactor=1.1,minNeighbors=5,minSize=(5,5)) #人脸检测


运行效果:



总结

那么可以总结,以后要使用这些代码的时候,可根据图片的特性(人脸的大小和分布)来修改

detectMultiScale这个函数参数(可以先修改minSize后再修改minNeighbors和scaleFactor)来达到人脸检测的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  脸部识别 python