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使用opencv进行人脸识别
- Python基于OpnenCV实现人脸识别
- 【Raspberry Pi 3试用体验】+Opencv+python的人脸识别
- 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)
- 使用Python结合Face++ API识别人脸
- python+opencv之视频人脸识别
- PCA人脸识别的python实现
- 树莓派用Python+OpenCV做人脸识别
- 【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)
- OpenCV+python 人脸识别
- 人脸识别(OpenCV+Python)
- 人脸识别(OpenCV+Python)
- python+opencv之视频人脸识别
- 人脸识别初探(Python)
- Python+opencv人脸识别
- python下的一个人脸识别包
- python下PCA算法与人脸识别
- Python opencv2 人脸识别
- OpenCV+python 人脸识别
- 利用Python sklearn的SVM对AT&T人脸数据进行人脸识别