python+opencv入门-基于Harr特征的人脸检测分类器

任务描述

理解Harr分类器原理,使用OpenCV中的Harr分类器进行人脸检测。

相关知识

主要思想

openCV的人脸检测,使用Harr分类器。该分类器采用的Viola-Jones人脸检测算法。它是在2001年由Viola和Jones提出的基于机器学习的人脸检测算法。
算法首先需要大量的积极图片(包含人脸的图片)和消极图片(不包含人脸的图片)。然后从中提取类Harr特征( Harr-like features),之所以称为 Harr分类器,是正是因为它使用了类Harr特征。最后,训练出一个级联检测器,用其来检测人脸。

类Harr特征

图像中的特征通常是指,图片的像素点经过一系列的运算之后得到的结果,这些结果可能是向量、矩阵和多维数据等等。类Harr特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。

Harr特征类别

它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑色两种矩形框组成为特征模板。
1.边缘特征:

2.线性特征:

3.中心特征和对角线特征:

特征值计算

特征模板的特征值计算的方式,是用黑色矩形像素总和的均值减去白色矩形像素总和的均值。

例如,对于4x4的像素块。
理想情况下,黑色和白色的像素块分布如下:

符合边缘特征的情况(a)。
但是通常情况,一张灰阶照片的黑白分布并非如此的明显,例如:
根据公式,
第一张图特征值为1,第二张图特征值为0.75-0.18=0.56。
一张图中,对于识别人脸,只有部分特征是有效的。例如,用下图中的特征模板可以看出,眉毛区域比额头要亮,鼻梁区域比眼镜区域要亮。嘴唇区域比牙齿区域要暗。这样的类Harr特征能很好的识别出人脸。

为简化特征值计算,可以使用积分图算法。得到类Harr特征后,使用AdaBoost的方法选择出有效特征。最后再使用瀑布型级联检测器提高检测速度。其中,瀑布的每一层都是一个由Adaboost算法训练得到的强分类器。
Harr人脸检测一个简单的动画过程如下:

红色的搜索框不断移动,检测出是否包含人脸。一般来说,输入的图片会大于样本,为了检索出不同大小的目标,分类器可以按比例的改变自己的尺寸,对输入图片进行多次的扫描。

训练Harr分类器

训练 Harr 分类器的主要步骤如下:

搜集制作大量的“消极”图像
搜集制作大量“积极”图像,确保这些图像中包含要检测的对象
创建“积极”向量文件
使用 OpenCV 训练 Harr 分类器

因为训练需要花费较多的资源和时间,所以我们学习时,先使用 OpenCV 中已经训练好的 Harr 分类器。

使用Harr分类器检测人脸

OpenCV 中的人脸训练模型格式为 XML,可以从 官网下载 。在此我们使用Harrcascade_frontalface_default.xml模型检测人脸。
声明分类器:

CascadeClassifier(模型文件路径)

调用分类函数:

detectMultiScale(图片对象,scaleFactor, minNeighbors, minSize)

参数说明:

1.图片对象:待识别图片对象;
2.scaleFactor:图像缩放比例;
3.minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏;
4.minSize:特征检测点的最小尺寸,可选参数。
示例如下:

import numpy as np
import cv2 as cv
# 读取图片
img = cv.imread('face.jpg')
# 转换为灰度图片
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 人脸检测器
face_cascade = cv.CascadeClassifier('Harrcascade_frontalface_default.xml')
# 识别人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)for (x,y,w,h) in faces:    print(x,y,w,h)

其中,图片坐标系以左上角为原点,x,y代表人脸区域左上角坐标,w代表宽度,h代表高度。
如图所示:

绘制人脸将在下个关卡学习。

编程要求

请在右侧编辑器补充代码,调用 Harr 完成人脸识别,具体任务如下:

*读取图片;
*转化图片为灰度图片;
*声明人脸检测器;
*调用人脸检测函数,scaleFactor参数设定为1.3, minNeighbors参数设定为5。

import numpy as np
import cv2 as cv
#********** Begin **********#
# 读取图片image_path = 'step3/image/face.jpg'
img = cv.imread(image_path)
# 转换为灰度图片
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 人脸检测器
modle_path = 'sample/data/haarcascades/haarcascade_frontalface_default.xml'
#补齐
# 识别人脸
#补齐
#********** End **********#
print(faces)

=================== =answer== ==================

python+opencv入门-基于Harr特征的人脸检测分类器相关推荐

  1. 基于Adaboost算法的人脸检测分类器!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈锴,Datawhale优秀学习者,中山大学数学系 人脸检测属于计 ...

  2. OpenCV中基于LBP算法的人脸检测测试代码

    下面是OpenCV 3.3中基于CascadeClassifier类的LBP算法实现的人脸检测,从结果上看,不如其它开源库效果好,如libfacedetection,可参考 https://blog. ...

  3. Python+OpenCV 调用手机摄像头并实现人脸识别

    文章内容: 1.windows 环境下安装 OpenCV 机器视觉环境搭建: 2.基于通过 Python+OpenCV调用手机摄像头并实现人脸检测识别. 目录 1 实验环境 2 实验准备 2.1 下载 ...

  4. 基于ACF多通道特征的人脸检测——从原理到实现

    首先说明一下,这个项目并不是博主在实验室负责的项目,而是博主的一门两学分的课的大作业(张学工老师的模式识别基础,有兴趣的可以百度一下),所以并没有投入太多时间去弄,还有很多地方可以改进,后文会陆续提到 ...

  5. Python调用笔记本摄像头,并实现人脸检测功能

    回家第一天感觉好无聊,一天睡了十几个小时,电视剧也看完了,就玩玩Python调用笔记本摄像头并实现人脸检测. 我们使用的是Python中的opencv库实现人脸检测,前面已经有一篇博客介绍如何下载op ...

  6. opencv实战3: CascadeClassifier+Haar特征进行人脸检测

    1.级联分类器CascadeClassifier OpenCV官方文档:https://docs.opencv.org/3.4.3/d5/d54/group__objdetect.html 分类器: ...

  7. 基于深度学习的人脸检测和关键点检测推理实践(OpenCV实现,含代码)

    目录 一.任务概述 二.环境准备 三.实现步骤 3.1 Python推理 3.2 C++推理 3.2.1 环境准备 3.2.2 推理 3.3 Java推理 一.任务概述 最近项目中大量场景需要用到人脸 ...

  8. 照片美妆---基于Haar特征的Adaboost级联人脸检测分类器

    本文转载自张雨石http://blog.csdn.net/stdcoutzyx/article/details/34842233 基于Haar特征的Adaboost级联人脸检测分类器 基于Haar特征 ...

  9. Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示

    Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + openc ...

  10. Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM)

    Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM) dsize = 20 affine_flags = lmc_cv.WARP ...

最新文章

  1. PowerDesigner导出
  2. 全球及中国汽车后视镜行业供需分析与需求前景预测报告2022-2027年
  3. UTC/GMT/CST几种常见的时间概述
  4. Android程序运行时出现java.lang.OutOfMemoryError 错误
  5. codeforce-600C. Make Palindrome(贪心)
  6. P4245 【模板】任意模数多项式乘法
  7. [css] H5如何禁止显示系统菜单?
  8. mysql中表格 列变行_MySQL数据透视表的列数据作为行
  9. iOS病毒门还没完:美国210家企业仍在用感染App
  10. 142. 环形链表 ||
  11. 《必玩》!学习大师们的游戏设计经验,激发你的游戏创造力!
  12. Juniper SRX210恢复密码过程
  13. lorawan服务器通信协议,LoRaWAN协议(三)–Server端数据协议
  14. 亚马逊SP-API市场端点接口文档整理
  15. 串口 单片机 文件_DIY迷你单片机学习板
  16. 进击的Libra:路在何方?中国应如何应对?
  17. 高性能服务器开发基础系列 (七)——开源一款即时通讯软件的源码
  18. NB物联网之天翼物联(7)——一次性通过电信NB平台自助测试
  19. 2018深信服java笔试题,深信服2018秋招编程题
  20. css中字体之间的距离是什么意思,css字符间距(css文字间距怎么设置)

热门文章

  1. (附源码)Node.js图书管理小程序 毕业设计 250858
  2. MySQL中GA、RC、Alpha的区别
  3. html5允许属性值不使用引号,HTML5概述 - 阿振的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. java启动临时文件_springboot临时文件存储目录配置
  5. 计算机创建修改ip知识,恢复系统后让每台计算机自动修改IP和计算机名的方法...
  6. 自建exchange邮箱有什么成熟的超大附件解决方案?
  7. 从猎豹到山狮-苹果操作系统热衷于猫科动物代号
  8. OSI模型工作模式解析
  9. 疫情过后,制造业中小企业应用工业互联网数字化转型之路的探讨
  10. 虚拟吉他手合集 UJAM Instruments Virtual Guitarist Bundle WiN-MAC