OpenCV3计算机视觉+Python(五)
人脸检测和识别
本章将介绍Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配。本章将考虑如何将多个Haar级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸),而其他的分类器可识别小的区域(眼睛、鼻子和嘴)。
Haar级联的概念
当谈到目标分类和位置跟踪时,希望精确定位什么?什么才是目标的可识别部分?
摄影作品(甚至是来自网络摄像头的图像)可能包含很多令人愉悦的细节。但是,由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,图像细节变得不稳定。人们在分类时不会受这些物理细节方面差异的影响。
提取出图像的细节对产生稳定分类结果和跟踪结果很有用。这些提取的结果被称为特征,专业的表述为:从图像数据中提取特征。虽然任意像素都可能影响多个特征,但特征应该比像素数少得多。两个图像的相似程度可以通过它们对应特征的欧式距离来度量。
例如,距离可能以空间坐标或颜色坐标来定义。类Haar特征是一种用于实现实时人脸跟踪的特征。文献《Robust Real-Time Face Detection,Paul Viola and Michael Jones,Kluwer Academic Publishers,2001》首次采用这种特征来进行人脸检测。每个类Haar特征都描述了相邻图像区域的对比模式。例如,边、顶点和细线都能生成具有判别性的特征。
对给定的图像,特征可能会因区域大小而有所不同,区域大小也可被称为窗口大小。即使窗口大小不一样,仅在尺度上不同的两幅图像也应该有相似的特征。因此,能为不同大小的窗口生成特征非常有用。这些特征集合称为级联。Haar级联具有尺度不变性,换句话说,它在尺度变化上具有鲁棒性。OpenCV提供了尺度不变Haar级联的分类器和跟踪器,并可将其保存成指定的文件格式。
OpenCV的Haar级联不具有旋转不变性。例如,Haar级联不认为倒置的人脸图像和直立的人脸图像一样,而侧面的人脸图像与正面的人脸图像也不一样。更可通过多种图像变换和多种窗口大小来提高Haar级联的旋转鲁棒性,但这样会变得很复杂,而且会耗费更多计算资源。
获取Haar级联数据
在OpenCV3源代码的副本中会有一个文件夹data/haarcascades.该文件夹包含了所有OpenCV的人脸检测的XML文件,并将haarcascades文件夹中的所有文件复制到cascades文件夹中:
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml
haarcascade_russian_plate_number.xml
haarcascade_smile.xml
haarcascade_upperbody.xml
从文件名可知这些级联是用于人脸、眼睛、鼻子和嘴的跟踪。这些文件需要正面、直立的人脸图像。在稍后创建人脸检测器时会使用这些文件。有了很大的耐心以及强大的计算机,就可以创建自己的级联,并训练这些级联来检测各种对象。
使用OpenCV进行人脸检测
在静态图像或视频中检测人脸的操作非常相似。视频人脸检测只是从摄像头读出每帧图像,然后采用静态图像中的人脸检测方法进行检测。当然,视频人脸检测还涉及其他的概念,例如跟踪,而静态图像中的人脸检测就没有这样的概念,但它们基本理论是一致的。
静态图像中的人脸检测
人脸检测首先是加载图像并检测人脸,这也是最基本的一步。为了使所得到的结果有意义,可在原始图像的人脸周围绘制矩形框。
现在,项目中已经包含了haarcascades文件夹的内容,下面创建一个基本的脚本来实现人脸检测。
import cv2
filename='3.jpg'
def detect(filename):
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade.load('C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml')
img=cv2.imread(filename)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces=face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.namedWindow('Vikings Detected')
cv2.imshow('Vikings Detected',img)
cv2.waitKey() detect(filename)
注意:
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_cascade.load('C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml')
该变量为CascadeClassifier对象
face_cascade.detectMultiScale传递参数是scaleFactor和minNeighbors,它们分别表示人脸检测过程中每次迭代时图像的压缩率以及每个人脸矩形保留近邻数目的最小值。
检测操作的返回值为人脸矩形数组。函数cv2.rectangle允许通过坐标来绘制矩形(x和y表示左上角的坐标,w和h表示人脸矩形的宽度和高度)
通过依次提取faces变量中的值来找到人脸,并在人脸周围绘制蓝色矩形,这是在原始图像而不是图像的灰色版本上进行绘制。
视频中的人脸检测
在视频的帧上重复这个过程就能完成视频(如摄像头的输入或视频文件)中的人脸检测。
该脚本将执行以下任务:打开摄像头,读取帧,检测帧中的人脸,扫描检测到的人脸中的眼睛,对人脸绘制蓝色的矩形框,对眼睛绘制绿色的矩形框。
import cv2
def detect():
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade=cv2.CascadeClassifier('haarcascade_eye.xml')
face_cascade.load('C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml')
eye_cascade.load('C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_eye.xml')
camera=cv2.VideoCapture(0)
while(True):
ret,frame=camera.read()
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces=face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
img=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) roi_gray=gray[y:y+h,x:x+w]
eyes=eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40))
for (ex,ey,ew,eh)in eyes:
cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow("camera",frame) camera.release()
cv2.destroyAllWindows()
if __name__=="__main__":
detect()
首先用detect函数加载Haar级联文件,由此可以执行人脸检测。
然后打开一个VideoCapture目标(初始化摄像头)。VideoCapture构造函数的参数用来表示要使用的摄像头
接下来捕获帧。read()函数会返回两个值:第一个值为布尔值,用来表明是否成功读取帧,第二个值为帧本身。捕捉到帧后,将其转换为灰度图像。这个操作很有必要。
与静态图像的例子一样,对具有灰度色彩空间的帧调用detectMultiScale
在眼睛检测中还有另外几个参数,因为眼睛是在确定了人脸的基础上,在比较小的图像上确定眼睛。
同样用循环输出检测眼睛的结果,并在其周围绘制绿色的矩形框
人脸识别
人脸检测是OpenCV的一个很不错的功能,它是人脸识别的基础。什么是人脸识别?其实就是一个程序能识别给定图像或视频中的人脸。实现这一目标的方法之一(OpenCV也采用这种方法)是用一系列分好类的图像(人脸数据库)来训练程序,并基于这些图像来进行识别。
这就是OpenCV及其人脸识别模块进行人脸识别的过程。
人脸识别模块的另一个重要特征是:每个识别都具有转置信评分,因此可在实际应用中通过对其设置阈值来进行筛选。
人脸识别所需要的人脸可以通过两种方式来得到:自己获得图像或从人脸数据库免费获得可用的人脸图像
1.生成人脸识别数据
下面继续介绍生成图像的脚本。这里需要一些包含不同表情的图像,但是,必须确保样本图像满足如下条件:
1)图像是灰度格式,后缀名为.pgm
2)图像形状为正方形
3)图像大小要一样
import cv2
def generate():
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade=cv2.CascadeClassifier('haarcascade_eye.xml')
face_cascade.load('C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_frontalface_default.xml')
eye_cascade.load('C:/Users/yif/Anaconda3/envs/tensorflow/Lib/site-packages/opencv_python-3.4.0.dist-info/haarcascades/haarcascade_eye.xml')
camera=cv2.VideoCapture(0)
count=0
while(True):
ret,frame=camera.read()
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces=face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h)in faces:
img=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) f=cv2.resize(gray[y:y+h,x:x+w],(200,200))
cv2.imwrite('./data/%s.pgm'%str(count),f)
count+=1
cv2.imshow("camera",frame)
if (cv2.waitKey(int(1000/12)))&(0xff==ord("q")):
break
camera.release()
cv2.destroyAllWindows()
if __name__=="__main__":
generate()
2.人脸识别
OpenCV3有三种人脸识别的方法,它们分别基于三种不同的算法:Eigenfaces、Fisherfaces和Local Binary Pattern
OpenCV3计算机视觉+Python(五)的更多相关文章
- 《OpenCV3 计算机视觉--Python语言实现 第二版》源代码及纠错
1.源代码下载地址 <OpenCV3 计算机视觉--Python语言实现 第二版>由我们翻译,英文书名<Learning OpenCV3 Computer Vision with P ...
- OpenCV3计算机视觉Python语言实现笔记(五)
图像的几何变换主要包括:平移.扩大与缩小.旋转.仿射.透视等等.图像变换是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到对应关系. 1. 图像的平移 图像的平移,沿着x方向tx距离,y方向ty距离 ...
- OpenCV3计算机视觉+python(三)
使用OpenCV3处理图像 下面要介绍的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 不同色彩空间的转换 O ...
- OpenCV3计算机视觉Python语言实现笔记(四)
1. Canny边缘检测 OpenCV提供了Canny函数来识别边缘.Canny边缘检测算法有5个步骤:使用高斯滤波器对图像进行去噪.计算梯度.在边缘上使用非最大抑制(NMS).在检测到的边缘上使用双 ...
- OpenCV3计算机视觉Python语言实现笔记(三)
一.使用OpenCV处理图像 1.不同颜色空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机视觉中有三种常用的色彩空间:灰度.BGR以及HSV(Hue, Saturat ...
- OpenCV3计算机视觉Python语言实现笔记(二)
1. 图像与原始字节之间的转换 从概念上讲,一个字节能表示0到255的整数.目前,对于多有的实时图像应用而言,虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示. 一个OpenCV图像是.a ...
- OpenCV3计算机视觉+python(二)
不同色彩空间的转换 当前,在计算机视觉中有三种常用的色彩空间:灰度.BGR以及HSV 1.灰度色彩空间是通过去除彩色信息来将其转换为灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测 2.BGR,即蓝 ...
- opencv3计算机视觉+Python(一)
基本I/O脚本 读/写图像文件 OpenCV的imread函数和imwrite函数能支持各种静态图像文件格式.不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG.JPEG和TIFF ...
- OpenCV3计算机视觉Python语言实现笔记(一)
Python3下OpenCV的安装 :http://blog.csdn.net/lwplwf/article/details/61616493 1. 读/写图像文件 OpenCV的imread()函数 ...
随机推荐
- ucosii任务切换OS_TASK_SW()
stm32F103中任务切换定义 //任务切换宏,由汇编实现. #define OS_TASK_SW() OSCtxSw() os_cpu_a.asm中任务切换函数的定义 NVIC_INT_CTRL ...
- 谈谈varnish,squid,apache,nginx缓存的对比
总是有人在问cache用什么,有varnish,squid,apache,nginx这几种,到底是我们用什么架构cache. 1.从这些功能上.varnish和squid是专业的cache服务,而ap ...
- TortoiseSVN客户端使用方法
SVN对于程序开发来说是非常重要的东西,它是非常不错的版本管理工具,下面介绍一下TortoiseSVN客户端的使用方法. 工具/原料 TortoiseSVN 方法/步骤 如果没有TortoiseS ...
- eclipse代码凝视之模板xml
曾经在eclipse中配置凝视的时候,都是各自在自己电脑上配置凝视,每一个同事风格不一样,并且配置繁琐.假设新来的同事忘了提醒,可能就没有配置凝视了.所以我就把类.方法的凝视写成xml文件.然后将配置 ...
- 从‘void*’到‘int’的转换损失精度
在CentOS6.2 64位下编译一下代码,不通过,提示 ./11_2.cpp: In function ‘int main(int, char**)’:./11_2.cpp:28: 错误:从‘voi ...
- MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析
作业Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程.Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件. 作业Job的全部状态维 ...
- linux内核常用函数或宏
1. simple_strtoul 用于将字符串转换为无符号长整数,第3个参数10意味着转换方式是10进制. ival = simple_strtoul(buffer, NULL, 10); 2. 大 ...
- Python tkinter 用键盘移动没反映修改代码
from tkinter import * def movetriangle(event): if event.keysym == 'Up': canvas.move(a1 ...
- 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数
/** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...
- 在linux虚机中装vmtools
很多用户在测试linux操作系统的时候喜欢用虚拟机,因为虚拟机方便而且可以同时在一台PC机上虚拟出来不同版本的linux操作系统,但是虚拟机和物理机之间的文件传输倒成了个问题,有人说可以使用vmtoo ...