OpenCV + Python 人脸检测

    • 必备知识
      • Haar-like
      • opencv api
        • 读取图片
        • 灰度转换
        • 画图
        • 显示图像
        • 获取人脸识别训练数据
        • 探测人脸
        • 处理人脸探测的结果
    • 实例
      • 图片素材
      • 人脸检测代码
      • 人脸检测结果
    • 总结

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


必备知识

Haar-like

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上共享出来的具有普适的训练好的数据。我们可以直接的拿来使用。

训练数据 参考地址

探测人脸

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

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)

实例

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

图片素材

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

人脸检测代码

# 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)

人脸检测结果

  • 输出图片:
  • 输出结果:
D:\Software\Python2\python.exe E:/Code/Python/DataStructor/opencv/Demo.py
发现3个人脸!

详情见 案例参考

总结

回顾一下,这次的实验就是简单的对opencv的常用的api的使用,重点在于训练数据的使用和人脸探测的处理。

时间: 2024-12-30 18:18:50

OpenCV + Python 人脸检测的相关文章

怎样实现c++利用opencv实现人脸检测与识别

问题描述 怎样实现c++利用opencv实现人脸检测与识别 就是指通过摄像头保存识别的人脸,再次识别时如果被识别的人是已经添加图片的,就把他的名字显示出来,如果没有就将人脸保存.求大神,提前谢谢. 解决方案 这你需要机器学习才能够实现. 具体学习方法可以用BOOSTING算法,随机森林算法或者K邻近算法,具体代码可以从<学习OPENCV>中找到,若是不想自己敲代码,也可以在百度中区找.其实OPENCV的sample里也有相关的代码.不过你自己需要建立自己的数据库.

如何在Android中用OPENCV实现人脸检测,人脸识别等功能,如何实现,用什么方法?

问题描述 如何在Android中用OPENCV实现人脸检测,人脸识别等功能,如何实现,用什么方法? 如何在Android中用OPENCV实现人脸检测,人脸识别等功能,如何实现,用什么方法? 解决方案 请问您做的怎么样了?

python结合opencv实现人脸检测与跟踪

  在Python下用起来OpenCV很爽,代码很简洁,很清晰易懂.使用的是Haar特征的分类器,训练之后得到的数据存在一个xml中.下面我们就来详细谈谈. 模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和pytho

python中使用OpenCV进行人脸检测的例子_python

OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: 复制代码 代码如下: $ sudo apt-get install python-opencv 具体原理就不多说了,可以参考一下这篇文章.直接上源码. 复制代码 代码如下: #!/usr/bin/python# -*- coding: UTF-8 -*- # face_detect.py # Face De

OpenCV+python 人脸识别

首先给大家推荐一本书:机器学习算法原理与编程实践 本文内容全部转载于书中,相当于一个读书笔记了吧 绪论 1992年麻省理工学院通过实验对比了基于结构特征的方法与基于模版匹配的方法,发现模版匹配的方法要优于基于特征的方法. 以支持向量机为代表的统计学习理论在随后被应用到了人脸识别与确认中去.但是由于算法运行效率问题,很快被一种新的算法替代了.这就是2001年康柏研究院提出的基于简单矩形特征和AdaBoost的实时人脸检测系统.该方法的主要贡献包括: 1.可以快速计算简单矩形特征作为人脸图像特征 2

利用OpenCV的人脸检测给头像带上圣诞帽

我们来看下效果 原图:   效果:           原理其实很简单: 采用一张圣诞帽的png图像作为素材,           利用png图像背景是透明的,贴在背景图片上就是戴帽子的效果了. 人脸检测的目的主要是为了确定贴帽子的位置,类似ps中自由变换的功能,检测到人脸中间的位置,resize圣诞帽子和人脸大小匹配,确定位置,贴上去,ok!       代码:非常简洁,根据参考博客给出的代码,由OpenCV自带的人脸检测代码经过简单修改即可. // getheader.cpp : 定义控制台

基于 OpenCV 的人脸识别

##一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影. OpenCV 起始于 1999 年 Intel 的一个内部研究项目.从那时起,它的开发就一直很活跃.进化到现在,它已支持如 OpenCL 和 OpenGL 等现代技术,也支持如 iOS 和 Android 等平台. 1

使用JavaScript 实现的人脸检测_javascript技巧

我一直对视频和图片中的人脸标记.检测和人脸识别技术很感兴趣.尽管我知道获取逻辑和算法去开发人脸识别软件或者插件已经超出了我的想象.当我知道Javascript库可以识别微笑,眼睛和脸部结构时,我得到启发去写一个教程.有许多的库,这些库要不就是纯粹的基于Javascript的,要不就是基于java语言的. 今天,我们开始学习tracking.js,它是一个由Eduardo Lundgren开发的轻量级的javascript库,它可以让你做实时的人脸检测,色彩追踪和标记好友的脸.在这个教程中,我们将

25 行 Python 代码实现人脸检测——OpenCV 技术教程

OpenCV OpenCV 是最流行的计算机视觉库,原本用 C 和 C++ 开发,现在也支持 Python. 它使用机器学习算法在图像中搜索人的面部.对于人脸这么复杂的东西,并没有一个简单的检测能对是否存在人脸下结论,而需要成千上万的特征匹配.算法把人脸识别任务分解成数千个小任务,每个都不难处理.这些任务也被称为分类器. 对于类似于人脸的对象,你或许需要不少于 6000 个分类器,每一个都需要成功匹配(当然,有容错率),才能检测出人脸.但这有一个问题:对于人脸识别,算法从左上角开始计算一个个数据