和网上各类首先你要有一个女友
的系列同样,想进行人脸判断,首先要有脸
,
只要能靠肯定人脸的位置,那么进行两张人脸是否类似的操做便迎刃而解了。python
因此本篇文章着重讲述如何利用openCV定位人脸。git
上一篇文章的地址:github
opencv官网ubuntu
在进行下一步操做时,咱们须要安装openCV,原本安装openCV的步骤跟日常安装其余模块同样,而然
因为python的历史缘由(用过都懂……),弄得一点都不友好。segmentfault
先说一下,python2.7的用户,能够直接在openCV的官网上直接下载,而后在openCV的build\python
的目录下,根据本身的状况,选择x86
,x64
下的cv2.pyd
放到你python的安装目录的\Lib\site-packages\
下。数组
至于python3.4的用户,即有点特别。你能够在StackOverFlow找到这样
和这样的答案,但咱们不要这么麻烦。python2.7
进入这个网站,下载openCV相关whl
文件,例如opencv_python-3.1.0-cp35-none-win_amd64.whl
ide
而后再对应目录下使用pip install opencv_python-3.1.0-cp35-none-win_amd64.whl
命令便可函数
安装完成后,能够在python的命令行下测试。
import cv2
若是没有报错的话,恭喜你安装成功。
不过不管是哪一个版本的用户,在python上使用openCV都须要先安装numpy这个模块。
opencv的人脸识别是基于了haar特征
,关于什么叫haar特征
,足以开另一篇文章说明了,碍于篇幅,这里不作介绍。
opencv提供已经训练好的数据写成了xml文件,放在了opencv\sources\data\haarcascades
的目录下。
若是只是安装了opencv_python-3.1.0-cp35-none-win_amd64.whl
的,能够在个人github上,下载cvdata
里面的内容
,地址会在文章底部给出。
除了人脸识别的数据外,还有人眼,上半身,下半身……等人体特征的数据,观察xml文件的命名,不难见名知义。
接下来会介绍如何利用这个已经训练好的数据,若是仍对haar
模型感兴趣,能够参考如下地址。
先讲关于openCV基本的一些操做。所有具体代码,请查看个人github。
cv2.imread(path)
若是你用type()
把其返回值的类型是numpy.ndarray
。
而一样,numpy.asarray(Image)
返回的亦是numpy.ndarray
对象,为何强调这两点?
cv2.imread(path)
不能读取中文路径,若路径中含有中文字符,其会返回None
在后面的操做中,包括是切割图片(人脸部分),再进行局部哈希,比较类似度,
等等都是用Image
对象进行操做,若是再用Image.open()
读入图片未免显得麻烦。
因此干脆统一用Image.open()
打开图片,再用numpy.asarray(Image)
转化便可。
须要注意有一个不一样的地方是虽然其返回的也是三维数组,但在第三维,即某个坐标下的RGB值,两个矩阵的顺序是反的,但只要另外编写一个小函数将其反转便可。
face_cascade = cv2.CascadeClassifier(xml_path)
if img.ndim == 3: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: gray = img # 若是img维度为3,说明不是灰度图,先转化为灰度图gray,若是不为3,也就是2,原图就是灰度图
img是以前读入的三维数组,虽然灰度图能够用Image
对象的convert('L')
完成,但因为不肯定
opencv的处理方法是否和该方法同样,因此仍是用opencv本身的方法进行处理比较好。
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(10,10),flags=cv2.CASCADE_SCALE_IMAGE)
scale_factor:被检测对象的尺度变化。尺度越大,越容易漏掉检测的对象,但检测速度加快;尺度越小,检测越细致准确,但检测速度变慢。
min_neighbors:数值越大,检测到对象的条件越苛刻;反之检测到对象的条件越宽松;
minSize:检测对象的大小
该方法返回的是一个列表,每一个列表元素是长度为四的元组,分别脸部的左上角的x,y值,脸部区域的宽度和高度。
经过上述的方法,咱们就已经获取到人脸的位置,下一步你能够经过ImageDraw
`对象进行绘图,框出人脸的位置。
一样,你也可使用Image
的crop
方法把人脸部分提取出来,而后进行局部哈希,
经过上一篇文章说起的算法,比较二者的类似度。
两种操做分别在个人github中实现了,请参考个人github中face1.py
,和face2.py
两个python文件。
在上一篇文章中,我说了会应用这些算法作成以只具备识别能力的图片爬虫,然如今我也确实是在作
但考虑到做为核心的图片识别和人脸识别的部分我已经写成文章分享出来,其他部分就是想写其余爬虫同样而已,因此我决定看看这两篇文章的反响后再决定是否继续该系列,把图片爬虫的制做过程和你们分享一下。
鉴于我的实力有限,本文未能详细说明人脸识别的原理,
但总结了如何利用已经训练好的数据进行人脸识别,但愿能帮到有须要的朋友。
若有不足之处,欢迎提出。
本文涉及内容的详细代码在下面的github地址。
欢迎star,也欢迎给意见
本文参考文章