详解如何用OpenCV + Python 实现人脸识别


Posted in Python onOctober 20, 2017

下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建。于是迫不及待的想体验一下opencv的人脸识别,如下文。

必备知识

Haar-like

通俗的来讲,就是作为人脸特征即可。

Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。

opencv api

要想使用opencv,就必须先知道其能干什么,怎么做。于是API的重要性便体现出来了。就本例而言,使用到的函数很少,也就普通的读取图片,灰度转换,显示图像,简单的编辑图像罢了。

如下:

读取图片

只需要给出待操作的图片的路径即可。

import cv2
image = cv2.imread(imagepath)

灰度转换

灰度转换的作用就是:转换成灰度的图片的计算强度得以降低。

import cv2
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

画图

opencv 的强大之处的一个体现就是其可以对图片进行任意编辑,处理。

下面的这个函数最后一个参数指定的就是画笔的大小。

import cv2
cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)

显示图像

编辑完的图像要么直接的被显示出来,要么就保存到物理的存储介质。

import cv2
cv2.imshow("Image Title",image)

获取人脸识别训练数据

看似复杂,其实就是对于人脸特征的一些描述,这样opencv在读取完数据后很据训练中的样品数据,就可以感知读取到的图片上的特征,进而对图片进行人脸识别。

import cv2
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')

里卖弄的这个xml文件,就是opencv在GitHub上共享出来的具有普适的训练好的数据。我们可以直接的拿来使用。

训练数据参考地址:

https://github.com/opencv/opencv/tree/master/data/haarcascades

探测人脸

说白了,就是根据训练的数据来对新图片进行识别的过程。

import cv2

# 探测图片中的人脸

faces = face_cascade.detectMultiScale(
  gray,
  scaleFactor = 1.15,
  minNeighbors = 5,
  minSize = (5,5),
  flags = cv2.cv.CV_HAAR_SCALE_IMAGE
)

我们可以随意的指定里面参数的值,来达到不同精度下的识别。返回值就是opencv对图片的探测结果的体现。

处理人脸探测的结果

结束了刚才的人脸探测,我们就可以拿到返回值来做进一步的处理了。但这也不是说会多么的复杂,无非添加点特征值罢了。

import cv2

print "发现{0}个人脸!".format(len(faces))

for(x,y,w,h) in faces:
  cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)

实例

有了刚才的基础,我们就可以完成一个简单的人脸识别的小例子了。

图片素材

下面的这张图片将作为我们的检测依据。

详解如何用OpenCV + Python 实现人脸识别

人脸检测代码

# coding:utf-8

import sys

 

reload(sys)

sys.setdefaultencoding('utf8')

#  __author__ = '郭 璞'

#  __date__ = '2016/9/5'

#  __Desc__ = 人脸检测小例子,以圆圈圈出人脸

import cv2

# 待检测的图片路径

imagepath = r'./heat.jpg'

 

# 获取训练好的人脸的参数数据,这里直接从GitHub上使用默认值

face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')

 

# 读取图片

image = cv2.imread(imagepath)

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

 

# 探测图片中的人脸

faces = face_cascade.detectMultiScale(

  gray,

  scaleFactor = 1.15,

  minNeighbors = 5,

  minSize = (5,5),

  flags = cv2.cv.CV_HAAR_SCALE_IMAGE

)

 

print "发现{0}个人脸!".format(len(faces))

 

for(x,y,w,h) in faces:

  # cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)

  cv2.circle(image,((x+x+w)/2,(y+y+h)/2),w/2,(0,255,0),2)

 

cv2.imshow("Find Faces!",image)

cv2.waitKey(0)

人脸检测结果

输出图片:

详解如何用OpenCV + Python 实现人脸识别

输出结果:

D:\Software\Python2\python.exe E:/Code/Python/DataStructor/opencv/Demo.py
发现3个人脸!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
python实现合并两个数组的方法
May 16 Python
Python多线程实现同步的四种方式
May 02 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
Python各种扩展名区别点整理
Feb 27 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
Mar 19 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
python中的计时器timeit的使用方法
Oct 20 #Python
浅谈Python peewee 使用经验
Oct 20 #Python
Python 获得13位unix时间戳的方法
Oct 20 #Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 #Python
Python WXPY实现微信监控报警功能的代码
Oct 20 #Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 #Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 #Python
You might like
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
DWR Ext 加载数据
2009/03/22 Javascript
理解Javascript_09_Function与Object
2010/10/16 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
django表单实现下拉框的示例讲解
2018/05/29 Python
python常用数据重复项处理方法
2019/11/22 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
法定代表人授权委托书范文
2014/08/02 职场文书
怎样写观后感
2015/06/19 职场文书
婚礼家长致辞
2015/07/27 职场文书
应届生们该怎么书写求职信?
2019/07/05 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书