Python+OpenCV人脸检测原理及示例详解

关于opencv

OpenCV 是 Intel 开源计算机视觉库 (Computer Version) 。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV 拥有包括 300 多个 C 函数的跨平台的中、高层 API 。它不依赖于其它的外部库 —— 尽管也可以使用某些外部库。 OpenCV 对非商业应用和商业应用都是免费 的。同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graphics user interface) 系统 :highgui 。 我们就通过 OpenCV 提供的一些方法来构造出这个人脸检测(face detection) 程序来。

opencv的python包装

OpenCV 本身是有 C/C++ 编写的,如果要在其他语言中使用,我们可以通过对其动态链接库文件进行包装即可,幸运的是, Python 下有很多个这样的包装,本文中使用的是 Cvtypes 。

事实上,在 Python 中很多的包都是来自第三方的,比如 PIL(Python Image Library) 即为 C 语言实现的一个图形处理包,被包装到了 Python 中,这些包装可以让你像使用 Python 的内建函数一样的使用这些 API 。

人脸检测原理

人脸检测属于目标检测(object detection) 的一部分,主要涉及两个方面

1.先对要检测的目标对象进行概率统计,从而知道待检测对象的一些特征,建立起目标检测模型。
2.用得到的模型来匹配输入的图像,如果有匹配则输出匹配的区域,否则什么也不做。

计算机视觉

计算机的视觉系统,跟人的眼睛是大不相同的,但是其中也有类似之处。人眼之能够看到物体,是通过物体上反射出来的光线刺激人眼的感光细胞,然后视觉神经在大脑中形成物体的像。计算机通过摄像头看到的东西要简单的多,简单来说,就是一堆由数字组成的矩阵。这些数字表明了物体发出的光的强弱,摄像头的光敏元件将光信号转化成数字信号,将其量化为矩阵。

如何从这些数字中得出:"这是一个人脸"的结论,是一个比较复杂的事情。物理世界是彩色的,一般来说,计算机中的彩色图片都是由若干个色彩通道累积出来的,比如RGB模式的图片,有红色通道(Red),绿色通道(Green)和蓝色通道(Blue),这三个通道都是灰度图,比如一个点由8位来表示,则一个通道可以表示2^8=256个灰度。那样三个通道进行叠加以后可以表3*8=24位种色彩,也就是我们常说的24位真彩。

对这样的图片做处理,无疑是一件很复杂的事,所以有必要先将彩色图转为灰度图,那样可以减少数据量(比如RGB模式,可以减少到原图片的1/3),同时可以去掉一些噪声信号。先将图片转化为灰度图,然后将这个灰度图的对比度增高,这样可以使得图片本来暗的地方更暗,亮的地方更亮一些。这样处理以后,图片就更容易被算法设别出来了。

Harr特征级联表

OpenCV在物体检测上使用的是haar特征的级联表,这个级联表中包含的是boost的分类器。首先,人们采用样本的haar特征进行分类器的训练,从而得到一个级联的boost分类器。训练的方式包含两方面:

1. 正例样本,即待检测目标样本
2. 反例样本,其他任意的图片

首先将这些图片统一成相同的尺寸,这个过程被称为归一化,然后进行统计。一旦分类器建立完成,就可以用来检测输入图片中的感兴趣区域的检测了,一般来说,输入的图片会大于样本,那样,需要移动搜索窗口,为了检索出不同大小的目标,分类器可以按比例的改变自己的尺寸,这样可能要对输入图片进行多次的扫描。

什么是级联的分类器呢?级联分类器是由若干个简单分类器级联成的一个大的分类器,被检测的窗口依次通过每一个分类器,可以通过所有分类器的窗口即可判定为目标区域。同时,为了考虑效率问题,可以将最严格的分类器放在整个级联分类器的最顶端,那样可以减少匹配次数。

基础分类器以haar特征为输入,以0/1为输出,0表示未匹配,1表示匹配。

Haar特征

边界特征,包含四种
 线性特征,包含8种
 中心围绕特征,包含两种

在扫描待检测图片的时候,以边界特征中的(a)为例,正如前面提到的那样,计算机中的图片是一个数字组成的矩阵,程序先计算整个窗口中的灰度值x,然后计算矩形框中的黑色灰度值y,然后计算(x-2y)的值,得到的数值与x做比较,如果这个比值在某一个范围内,则表示待检测图片的当前扫描区域符合边界特征(a),然后继续扫描。

关于这个算法的更详细描述已经超出了本文的范围,可以在参考资源中获得更多的信息。

非固定大小目标检测

因为是基于视频流的目标检测,我们事先不太可能知道要检测的目标的大小,这就要求我们的级联表中的分类器具有按比例增大(或者缩小)的能力,这样,当小的窗口移动完整个待检测图片没有发现目标时,我们可以调整分类器的大小,然后继续检测,直到检测到目标或者窗口与待检测图片的大小相当为止。

步骤一:图片预处理

在从摄像头中获得一个帧(一张图片)后,我们需要先对这张图片进行一些预处理:
1.将图片从RGB模式转为灰度图将灰度图
2.进行灰度图直方图均衡化操作

这两个步骤在OpenCV中是非常简单的:

image_size = cv.cvGetSize(image)#获取原始图像尺寸 

grayscale = cv.cvCreateImage(image_size, 8, 1)# 建立一个空的灰度图
cv.cvCvtColor(image, grayscale, cv.CV_BGR2GRAY)#转换 

storage = cv.cvCreateMemStorage(0)#新建一块存储区,以备后用
cv.cvClearMemStorage(storage) 

cv.cvEqualizeHist(grayscale, grayscale)# 灰度图直方图均衡化

步骤二:检测并标记目标

OpenCV中,对于人脸检测的模型已经建立为一个XML文件,其中包含了上面提到的harr特征的分类器的训练结果,我们可以通过加载这个文件而省略掉自己建立级联表的过程。有了级联表,我们只需要将待检测图片和级联表一同传递给OpenCV的目标检测算法即可得到一个检测到的人脸的集合。

# detect objects
cascade = cv.cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml',
                      cv.cvSize(1,1))
faces = cv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
                cv.CV_HAAR_DO_CANNY_PRUNING,
                cv.cvSize(50, 50))#设置最小的人脸为50*50像素 

if faces:
  print 'face detected here', cv.cvGetSize(grayscale)
  for i in faces:
    cv.cvRectangle(image, cv.cvPoint( int(i.x), int(i.y)),
           cv.cvPoint(int(i.x + i.width), int(i.y + i.height)),
           cv.CV_RGB(0, 255, 0), 1, 8, 0)#画一个绿色的矩形框

步骤三:用highgui画出视频窗口

highgui.cvNamedWindow ('camera', highgui.CV_WINDOW_AUTOSIZE)
highgui.cvMoveWindow ('camera', 50, 50) 

highgui.cvShowImage('camera', detimg)

可以看到,OpenCV的API相当清晰,使用Python的包装,可以使得代码非常小。好了,我们可以看看程序的运行结果:

由于视频流是动态的,所以我们可以在程序的入口中使用一个无限循环,在循环中,每次从视频中读入一个帧,将这个帧传输给人脸检测模块,检测模块在这个帧上进行标记(如果有人脸的话),然后返回这个帧,主程序拿到这个帧后,更新显示窗口。

opencv的其他特性

拉普拉斯边缘检测

def laplaceTransform(image):
  laplace = None
  colorlaplace = None
  planes = [None, None, None] 

  image_size = cv.cvGetSize(image)
  if not laplace:
    for i in range(len(planes)):
      planes[i] = cv.cvCreateImage(image_size, 8, 1)
    laplace = cv.cvCreateImage(image_size, cv.IPL_DEPTH_16S, 1)
    colorlaplace = cv.cvCreateImage(image_size, 8, 3) 

  cv.cvSplit(image, planes[0], planes[1], planes[2], None) 

  for plane in planes:
    cv.cvLaplace(plane, laplace, 3)
    cv.cvConvertScaleAbs(laplace, plane, 1, 0) 

  cv.cvMerge(planes[0], planes[1], planes[2], None, colorlaplace)
  colorlaplace.origin = image.origin 

  return colorlaplace

效果图:

CVtypes中自带了一个关于图像色彩空间的直方图的例子:

结束语

OpenCV的功能十分强大,而且提供了大量的算法实现,文中涉及到的内容只是计算机视觉中很小的一部分。读者可以考虑将采集到的人脸进行标识,从而实现特定人的人脸识别。或者考虑将人脸检测移植到网络上,从而实现远程监控。试想一下,原来没有生命的机器,我们可以通过自己的思想,动作来使得它们看起来像是有思想一样,这件事本身就非常的有趣。

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

(0)

相关推荐

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

    下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等. opencv api 要想使用opencv,就必须先知道其能干什么,怎么做.于是API的重要性便体现出来了.就本例而言,使用到的函数

  • python使用opencv进行人脸识别

    环境 ubuntu 12.04 LTS python 2.7.3 opencv 2.3.1-7 安装依赖 sudo apt-get install libopencv-* sudo apt-get install python-opencv sudo apt-get install python-numpy 示例代码 #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv d

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

    模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

  • python利用OpenCV2实现人脸检测

    最近,带领我的学生进行一个URTP项目设计,需要进行人脸识别.由于现在的OpenCV已经到了2.X版本,因此就不想用原来的1.X版本的代码,而网上存在的代码都是1.X版本的代码,尝试自己写一段2.X版本的代码,反复查阅资料,今天终于测试成功(很明显2.X版本的代码要比1.X的代码更简单),供大家好参考,代码如下:(2017年5月12日在python3.6.1下做一简单的修改) import cv2 import numpy as np cv2.namedWindow("test")#命

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

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

  • python实现人脸识别代码

    从实时视频流中识别出人脸区域,从原理上看,其依然属于机器学习的领域之一,本质上与谷歌利用深度学习识别出猫没有什么区别.程序通过大量的人脸图片数据进行训练,利用数学算法建立建立可靠的人脸特征模型,如此即可识别出人脸.幸运的是,这些工作OpenCV已经帮我们做了,我们只需调用对应的API函数即可,先给出代码: #-*- coding: utf-8 -*- import cv2 import sys from PIL import Image def CatchUsbVideo(window_name

  • Python 40行代码实现人脸识别功能

    前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了.这些人里包括曾经的我自己.其实如果如果你不是非要深究其中的原理,只是要实现这一工作的话,人脸识别也没那么难.今天我们就来看看如何在40行代码以内简单地实现人脸识别. 一点区分 对于大部分人来说,区分人脸检测和人脸识别完全不是问题.但是网上有很多教程有无无意地把人脸检测说成是人脸识别,误导群众,造成一些人认为二者是相同的.其实,人脸检测解决的问题是确定一张图上有木有人脸,而人

  • python+opencv实现的简单人脸识别代码示例

    # 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def detect_object(image): '''检测图片,获取人脸在图片中的坐标''' grayscale = cv.CreateImage((image.width, image.height), 8, 1) cv.CvtColor(image, grayscale, cv.CV_BGR2GR

  • Python+OpenCV人脸检测原理及示例详解

    关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) .它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 C 函数的跨平台的中.高层 API .它不依赖于其它的外部库 -- 尽管也可以使用某些外部库. OpenCV 对非商业应用和商业应用都是免费 的.同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了一个简单的 GUI(graph

  • 基于Python的人脸检测与分类过程详解

    目录 人脸识别 算法简介 人脸检测 简述 数据集介绍 算法介绍 测试网络 结果预览 人脸识别 算法简介 我们的算法可以分成两个部分,识别人脸位置和确定人脸分类.这两个部分可以看成:1.检测出人脸之间相似性.2.检测出人脸之间不同性.由于这两项工作截然相反,所以我们使用了两个网络来分别完成这两项工作. 人脸检测 简述 我们的人脸检测网络采用了和Faster RCNN类似的策略,但我们在ROI Polling上进行了创新,兼顾了小目标检测和大目标检测,为此,我们还使用了改进后的RESNET101_V

  • python opencv肤色检测的实现示例

    1 椭圆肤色检测模型 原理:将RGB图像转换到YCRCB空间,肤色像素点会聚集到一个椭圆区域.先定义一个椭圆模型,然后将每个RGB像素点转换到YCRCB空间比对是否再椭圆区域,是的话判断为皮肤. YCRCB颜色空间 椭圆模型 代码 def ellipse_detect(image): """ :param image: 图片路径 :return: None """ img = cv2.imread(image,cv2.IMREAD_COLOR)

  • python opencv人脸检测提取及保存方法

    注意这里提取到的人脸图片的保存地址要改成自己要保存的地址 opencv人脸的检测模型的路径也要更改为自己安装的opencv的人脸检测模型的路径 import cv2 save_path = 'F:\\face_photo_save\\chenym\\' cascade = cv2.CascadeClassifier("D:\\opencv249\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt_tree.xml&q

  • Python OpenCV实现识别信用卡号教程详解

    目录 通过与 OpenCV 模板匹配的 OCR 信用卡 OCR 结果 总结 今天的博文分为三个部分. 在第一部分中,我们将讨论 OCR-A 字体,这是一种专为辅助光学字符识别算法而创建的字体. 然后我们将设计一种计算机视觉和图像处理算法,它可以: 本地化信用卡上的四组四位数字. 提取这四个分组中的每一个,然后单独分割 16 个数字中的每一个. 使用模板匹配和 OCR-A 字体识别 16 个信用卡数字中的每一个. 最后,我们将看一些将信用卡 OCR 算法应用于实际图像的示例. 通过与 OpenCV

  • Python实现过迷宫小游戏示例详解

    目录 前言 开发工具 环境搭建 原理简介 主要代码 前言 今天为大家带来解闷用的过迷宫小游戏分享给大家好了.让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 游戏规则: 玩家通过↑↓←→键控制主角行动,使主角从出发点(左上角)绕出迷宫,到达终点(右下角)即为游戏胜利. 逐步实现: 首先,当然是创建迷宫啦,为了方便,这里采用随机生成迷

  • 浅谈Python Opencv中gamma变换的使用详解

    伽马变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正. 伽马变换的基本形式如下: 大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢). #分道计算每个通道的直方图 img0 = cv2.imread('12.jpg') hist_b = cv2.calcHist([img0],

  • python模式 工厂模式原理及实例详解

    这篇文章主要介绍了python模式 工厂模式原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 工厂模式是一个在软件开发中用来创建对象的设计模式. 工厂模式包涵一个超类.这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建. 为了实现此方法,需要创建一个工厂类创建并返回. 当程序运行输入一个"类型"的时候,需要创建于此相应的对象.这就用到了工厂模式.在如此情形中,实现代码基于工厂模式,可以达到可

  • Python OpenCV对图像进行模糊处理详解流程

    其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作.那么它是什么操作呢?它就是图像的模糊(滤波)处理. 均值滤波 使用 opencv 中的cv2.blur(src, ksize)函数.其参数说明是: src: 原图像 ksize: 模糊核大小 原理:它只取内核区域下所有像素的平均值并替换中心元素.3x3 标准化的盒式过滤器如下所示: 特征:核中区域贡献率相同. 作用:对于椒盐噪声的滤除效果比较好. # -*-coding:utf-8-*- ""&q

  • python机器学习Sklearn实战adaboost算法示例详解

    目录 pandas批量处理体测成绩 adaboost adaboost原理案例举例 弱分类器合并成强分类器 pandas批量处理体测成绩 import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt data = pd.read_excel("/Users/zhucan/Desktop/18级高一体测成绩汇总.xls") cond =

随机推荐