详解如何用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中使用item()方法遍历字典的例子
Aug 26 Python
wxPython窗口的继承机制实例分析
Sep 28 Python
python绘图方法实例入门
May 19 Python
Python作用域用法实例详解
Mar 15 Python
python 处理string到hex脚本的方法
Oct 26 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
python查看数据类型的方法
Oct 12 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
Python预测2020高考分数和录取情况
Jul 08 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 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
PHP5 面向对象(学习记录)
2009/12/02 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
Python脚本实现集群检测和管理功能
2015/03/06 Python
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
台湾森森购物网:U-mall
2017/10/16 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
工作中的自我评价如何写好
2013/10/28 职场文书
学生自我鉴定
2013/12/18 职场文书
农村婚礼证婚词
2014/01/08 职场文书
标准单位租车协议书
2014/09/23 职场文书
周年庆典答谢词
2015/01/20 职场文书
法人身份证明书
2015/06/18 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
一条慢SQL语句引发的改造之路
2022/03/16 MySQL