前言

和网上各种首先你要有一个女朋友的系列一样,想进行人脸判断,首先要有脸,

只要能靠确定人脸的位置,那么进行两张人脸是否相似的操作便迎刃而解了。

所以本篇文章着重讲述如何利用openCV定位人脸。

上一篇文章的地址:

安装openCV

在进行下一步操作时,我们需要安装openCV,本来安装openCV的步骤跟平常安装其他模块一样,而然

由于python的历史原因(用过都懂……),弄得一点都不友好。

先说一下,python2.7的用户,可以直接在openCV的官网上直接下载,然后在openCV的build\python

的目录下,根据自己的情况,选择x86,x64下的cv2.pyd放到你python的安装目录的

\Lib\site-packages\下。

至于python3.4的用户,即有点特别。你可以在StackOverFlow找到这样

和这样的答案,但我们不要这么麻烦。

进入这个网站,下载openCV相关whl文件,例如

opencv_python-3.1.0-cp35-none-win_amd64.whl

然后再对应目录下使用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值,两个矩阵的顺序是反的,但只要另外编写一个小函数将其反转即可。

载入xml数据

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,也欢迎给意见

本文参考文章

python识图打怪_利用python进行识别相似图片(二)相关推荐

  1. python识图打怪_识别×图片、打飞机游戏,Python这些事你都知道吗?

    Python是挺神奇的. 可以做很多好玩的事情,今天就带大家看看,Python做的那些神奇好玩的事. 1.Python - Django 搭建简易博客 使用 Django 开发一个简单的博客 Web应 ...

  2. python 桑基图 地理坐标_利用Python+Excel制作桑基(Sankey)图

    利用Python+Excel制作桑基(Sankey)图 桑基图的简介 桑基图 (Sankey  Diagram),是一种特定类型的流图,用于描述一组值到另一组值的流向.下图为1869年,查尔斯米纳德( ...

  3. python计算面积代码_利用Python求阴影部分的面积实例代码

    利用Python求阴影部分的面积实例代码 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  利用Python求阴影部分的面积实例代码.txt ] (友情提示:右键点 ...

  4. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

  5. python自定义函数画图_利用Python绘图和可视化(长文慎入)

    Python有许多可视化工具,但是我主要讲解matplotlib(http://matplotlib.sourceforge.net).此外,还可以利用诸如d3.js(http://d3js.org/ ...

  6. python做游戏代码_利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单!...

    相信许多80,90后都玩过2G时代的文字小游戏,它是来自QQ家园的专属回忆.偷菜,美味小镇,大乐斗,还有精武堂等等,虽然只是文字的输出,但是留给我们这一代的人的印象却是最深刻的.曾经流量很少,响应很快 ...

  7. 基于python的系统构建_利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  8. python朋友圈评论_利用Python实现朋友圈中的九宫格图片效果

    前言 大家应该经常在朋友圈看到有人发九宫格图片,其实质就是将一张图片切成九份,然后在微信中一起发这九张图即可. 说到切图,Python 就可以实现,主要用到的 Python 库为 Pillow,安装使 ...

  9. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

最新文章

  1. 个php反序列化漏洞,PHP反序列化漏洞学习(一)
  2. pycharm 使用anaconda python编译器时添加available packages 显示nothing to show的解决办法
  3. 【NLP】如何清理文本数据
  4. 归属地的判断规则有吗_IPO|创业板注册制规则-详解股权激励新规
  5. VTK:图表之DirectedGraphToMutableDirectedGraph
  6. PS提示错误1解决办法
  7. FastText原理总结
  8. python画五角星填充不同颜色_不同颜色牡丹怎么画?3种牡丹图解教你画,适合0基础学习,收藏...
  9. 【ElasticSearch】使用 _validate API 在不执行查询的情况下验证查询
  10. HDU - 6033 Add More Zero
  11. python学习if语句_python学习之if语句
  12. Leetcode - 广度优先遍历专题
  13. 混淆矩阵评价指标_机器学习模型评价指标 -- 混淆矩阵
  14. ubuntu18.04播放mp4提示需要安装MPEG-4 AAC解码器和H.264解码器的解决办法
  15. matlab三维热传导计算,matlab练习程序(差分法解二维热传导方程)
  16. yolov5火焰检测
  17. 用rollup打包vue组件库
  18. 苹果cms海螺大橙子首途v7模板源码
  19. IT开发工程师的五个等级,你现在几级?
  20. geoserver发布切片影像地图

热门文章

  1. Android开发丶带有类型的列表功能实现
  2. 纳米技术将为我们带来如普通眼镜般轻薄的VR/AR眼镜
  3. 人脸检测(七)--LBP特征原理及实现
  4. Camunda教程|Camunda视频
  5. Hibernate中clear()、evict()、flush()的方法使用说明
  6. asp.net core 多语言解决方案
  7. 氮化镓功率芯片公司纳微半导体和Live Oak II宣布就其正在进行的合并交易提交了S-4表格注册声明...
  8. feign调用第三方接口服务
  9. ARM裸板调试之JTAG调试体验
  10. 愿穷尽一生,探索查理芒格的普世智慧