详解如何用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 相关文章推荐
Python中的包和模块实例
Nov 22 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
Django 表单模型选择框如何使用分组
May 16 Python
Python 串口读写的实现方法
Jun 12 Python
wxPython实现列表增删改查功能
Nov 19 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
Python实现SMTP邮件发送
Jun 16 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 程序员也要学会使用“异常”
2009/06/16 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
php存储过程调用实例代码
2013/02/03 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
各种常用浏览器getBoundingClientRect的解析
2009/05/21 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python+Wordpress制作小说站
2017/04/14 Python
python中的随机函数小结
2018/01/27 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
后勤副校长自我鉴定
2013/10/13 职场文书
工程师岗位职责规定
2014/02/26 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
上党课的心得体会
2014/09/02 职场文书
班主任寄语2015
2015/02/26 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Linux安装apache服务器的配置过程
2021/11/27 Servers
JavaScript ES6的函数拓展
2022/01/18 Javascript