上学时候用matlab学过一些图像处理的基础知识,当时课程作业是用haar实现人脸检测

but当时是心思根本不在图像处理上,so找了个同学帮忙做的,自己没上心

然鹅天道好轮回,现在捡起来了原来的算法一脸懵逼,自己挖的坑再深也得跳下去啊!

先上一张经典的lena图镇场子!

流程图:

读取一张图片→转灰度图→人眼/人脸检测→标识出来→显示/保存结果

其中,重中之重就是怎样进行检测?下面主要讲一下openCV中现成的一种算法——Haar

算法详解请参考https://blog.csdn.net/playezio/article/details/80471000

如果看不懂很正常,这里用到了太多的数学、图像处理的相关知识,要补的知识点实在是太多太多了!

简单一句话来说:用一个“特征集”去“滑动”匹配待检测的图片,如果图片中某个部分“符合”要求则会标记出来

特征集是个啥?

可以用openCV里封装好的,比如人脸的特征集合(具体是什么我也没有看懂内部算法……)、还有其他的比如eye、body、汽车等等,这些是openCV里已经写好的,具有普适性可以供大家直接调用;

当然也可以自己建立,比如你想建立一个鼠标的特征集等等,难度较大

滑动?还摩擦摩擦呢……

如果特征集是个10*10的窗口,待检测图片是100*100的大小,那么这个小窗口会在图片上从上到下,从左到右,步长为1(顺序和步长不确定,只是推测是这么进行的)进行匹配,这称为滑动窗口技术(sliding window)

在此条件下,遍历一张图片所需要的匹配次数是(100/10*1)*(100/10*1)=100次

“金字塔流程”——不是埃及辣个

如果有个10*10的眼睛的特征集,待检测图片是一张100*100的大头照,一只眼睛的部分可能占了50*50(比例肯定不对,领会一下精神),那么用这个小窗口怎么匹配都匹配不到啊,怎么办?

把图片缩小到原来的五分之一或者把特征集扩大到5倍不就好了嘛!

在算法中是一点一点试验这个缩放倍数的,就如同金字塔横切面一样。因此从默认的窗口遍历一遍不够,因此最终结果比100次要大的多,这个缩放倍数越小,计算量越大

符合要求?这里不展开讲解了,太难!总之一旦符合,就会被标记出来,因此一幅图中如果只有一张脸,但是周围可能会有很多标记的方框(滑动窗口技术和金字塔流程共同导致的)以及可能看起来像人脸的部分,如下图:

(测试结果不是我做的,网上找的)

但是我们想要的结果就是标记出来两张脸就好了,该合并的就合并,该抛弃的就抛弃(所以说人还是要比机器智能一点的嘛)

首先,一个矩形在图片中有四个参数(x,y,width,height),即(中心横坐标、中心纵坐标、半宽、半长),判断两个矩形这四个参数的差值,在一定范围内则可认为这些矩形是“同一个组织”

结果是一幅图片中可能有不同的组织,每个组织的人数(也就是相似的矩形)不同,保留人数多的组织,抛弃人数少的组织(自定义阈值)。

其中,人数多的组织需要选定一个为代表(在算法里是取平均值),因此结果就是

到此为止,基本检测的重点就说完了,下面讲一下在Python3中怎么结合openCV实现

安装环境什么的请自行百度吧,需要引用的是cv2模块,这个模块里的两个方法比较重要

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

CascadeClassifier是一种级联分类器,目前提供的分类器包括Haar分类器和LBP分类器,可选的特征池(xml文件)已经写好,看名称大体有:人脸、人眼、身体等等。
我这里存储的目录是:D:\Anaconda3\Library\etc,其中有两个文件夹

本例中使用的是laarcascades下的这两个xml文件:

选定好特征池后,下面是调用方法detecMultiScale()
faces = face_cascade.detectMultiScale(gray, 1.1, 5)

官方定义:


其中需要注意的几个参数设置:

scaleFactor : 指定每个图像缩放比例(也有文档上说是滑动窗口扩大比例,理论上说后者的运算速度会快一丢丢),有些参考文献上说是默认为1.1,但是我并没有找到相关默认参数值。数值越小(但是也需要大于1),遍历的次数越多,计算时间越长

minNeighbors:应该是“团伙中成员的个数”,(有些参考文献上说默认是3,同样我没找到依据,表明至少有3次重叠检测,程序才认为目标确实存在)。数值越大,检测结果理论上会越少,但是过大或过小都会影响准确率,一般取值3~6

flags:对于新的分类器没有用

minSize和maxSize用来限制得到的目标区域的范围,后者一般不自行设定

源代码:

 import cv2

 def pic_detect(filename):
"""
静态图片人脸、人眼检测
:param filename: <str> 被检测的图片路径
:return: None
"""
# cv2级联分类器CascadeClassifier.xml文件为训练数据
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#人脸
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')#人眼 img = cv2.imread(filename) # 读取图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 转灰度图
faces = face_cascade.detectMultiScale(gray, 1.1, 5, minSize = (5,5))# 进行人脸检测,调整参数
eyes = eye_cascade.detectMultiScale(gray,1.1,5)
print('发现了{0}个人的脸呦!'.format(len(faces))) # 绘制人脸矩形框
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 250, 0), 1)#中心位置、长宽、画笔颜色及大小
for (ex, ey, ew, eh) in eyes:
img = cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (250, 0, 0), 1) cv2.namedWindow('face_detect')# 命名显示窗口
cv2.imshow('face_detect', img)# 显示图片
cv2.imwrite(filename+'_result.jpg', img)# 保存图片
cv2.waitKey(0)# 设置显示时间,0表示一直显示
cv2.destroyAllWindows()
return None filename = 'kkw.jpg'
pic_detect(filename)

结果:

检测不了或者检测失误:

1. 侧脸

2. 脸角度偏斜,比如将图片旋转90度以后……

3. 戴墨镜的话可以检测到人脸,但是眼睛就gg了

4. 不清楚的图片或者有遮挡的

5. 莫名其妙的乱入……

总结:

1. 调整参数可能会得到不同的结果

2. 总体来说,此方法的对被检测的图片要求较高,检测质量一般

3. 应该算是检测的一个入门方法,这条路上可优化的地方太多了……研究算法的都是人才啊

python3+openCV实现图片的人脸人眼检测,原理+参数+源代码的更多相关文章

  1. OpenCV Facial Landmark Detection 人脸关键点检测

    Opencv-Facial-Landmark-Detection 利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Note: OpenCV3.4 ...

  2. SmileyFace——基于OpenCV的人脸人眼检测、面部识别程序

    项目地址 https://github.com/guoyaohua/SmileyFace 开发环境 Visual Studio 2010 MFC + OpenCV 功能描述 静态图像人脸检测 视频人脸 ...

  3. OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...

  4. 漏洞检测方法如何选?详解源代码与二进制SCA检测原理

    摘要:本文探讨的是SCA具体的检测原理,源代码SCA检测和二进制SCA检测有哪些相同点和不同点,在进行安全审计.漏洞检测上各自又有什么样的优势和适用场景. 本文分享自华为云社区<源代码与二进制文 ...

  5. Python使用OpenCV实现简单的人脸检测

    文章目录: OpenCV安装 安装numpy 安装opencv OpenCV使用 OpenCV测试 效果图: 注意: 图片人脸检测 程序要求: 技术实现思路 注意 本文使用的环境是:Windows+P ...

  6. OpenCV 学习笔记 05 人脸检测和识别

    本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个  Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...

  7. OpenCV实践之路——人脸检测(C++/Python) 【转】

    转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉 ...

  8. Opencv与dlib联合进行人脸关键点检测与识别

    前言 依赖库:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不记录如何配置,重点在实现上.使用libfacedetection实现人脸区域检测,联合dlib标记 ...

  9. 【从零学习openCV】IOS7根据人脸检测

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

随机推荐

  1. Hadoop计数器

    1. MapReduce计数器是什么 计数器是用来记录Job的执行进度和状态的,其作用类似于日志.我们可以在程序的某个位置插入计数器,记录数据或进度的变化情况. 2. MapReduce计数器能做什么 ...

  2. Linux安装配置相关

    1.常用汇总 useradd usertemp //添加用户 passwd usertemp //修改/设置密码 userdel usertemp //删除用户 2. profile/baserc等配 ...

  3. clipboard JS(剪切板)的使用

    引入js(根据路径需要修改url) <script src="lib/clipboard/clipboard.min.js" type="text/javascri ...

  4. 微信支付配置参数:支付授权目录、回调支付URL

    一.开通微信支付的首要条件是:认证服务号或政府媒体类认证订阅号(一般认证订阅号无法申请微信支付) 二.微信支付分为老版支付和新版支付,除了较早期申请的用户为老版支付,现均为新版微信支付. 三.公众平台 ...

  5. Django---ORM简介丶单表操作丶增删改查

    一丶ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  6. while循环,break和continue,运算符,格式化输出

    一丶while循环 while条件: 代码块(循环体) #数数 打印1-100 count = 1 while count <= 100: print(count) count += 1 执行顺 ...

  7. click事件的累加绑定

    click事件的累加绑定,绑定一次点击事件,执行多次. 在页面中为一个元素绑定事件,事件执行后页面未刷新且元素还在,然后你再次点击,元素又被绑定一个点击事件,这样第二次点击就会执行两次,以此类推. 如 ...

  8. SQL Server 08版与14版处理重复行的方式

    在项目中,利用循环拼接成了插入多行数据的SQL语句: Insert into table(col1,col2)vaules(value11,value21); Insert into table(co ...

  9. RF的一些技术知识

    1. dBm 定义的是 miliwatt(毫瓦特).0 dBm=1mw:    dBw 定义 watt.0 dBW = 1 W =1000 mw = 10lg(1000/1)dBm=30dbm. dB ...

  10. 爬虫爬取代理IP池及代理IP的验证

    最近项目内容需要引入代理IP去爬取内容. 为了项目持续运行,需要不断构造.维护.验证代理IP. 为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP. 一.服务器如何获取客户端IP ...