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

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

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

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

流程图:

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

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

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

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

特征集是个啥?

可以用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用来限制得到的目标区域的范围,后者一般不自行设定

源代码:

1 importcv22

3 defpic_detect(filename):4 """

5 静态图片人脸、人眼检测6 :param filename: 被检测的图片路径7 :return: None8 """

9 #cv2级联分类器CascadeClassifier.xml文件为训练数据

10 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#人脸

11 eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')#人眼

12

13 img = cv2.imread(filename) #读取图片

14 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转灰度图

15 faces = face_cascade.detectMultiScale(gray, 1.1, 5, minSize = (5,5))#进行人脸检测,调整参数

16 eyes = eye_cascade.detectMultiScale(gray,1.1,5)17 print('发现了{0}个人的脸呦!'.format(len(faces)))18

19 #绘制人脸矩形框

20 for (x, y, w, h) infaces:21 img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 250, 0), 1)#中心位置、长宽、画笔颜色及大小

22 for (ex, ey, ew, eh) ineyes:23 img = cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (250, 0, 0), 1)24

25 cv2.namedWindow('face_detect')#命名显示窗口

26 cv2.imshow('face_detect', img)#显示图片

27 cv2.imwrite(filename+'_result.jpg', img)#保存图片

28 cv2.waitKey(0)#设置显示时间,0表示一直显示

29 cv2.destroyAllWindows()30 returnNone31

32 filename = 'kkw.jpg'

33 pic_detect(filename)

结果:

检测不了或者检测失误:

1. 侧脸

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

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

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

5. 莫名其妙的乱入……

总结:

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

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

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

python人脸检测代码_python3+openCV实现图片的人脸人眼检测,原理+参数+源代码相关推荐

  1. Python学习(1)OpenCV读取图片

    Python学习(1)OpenCV读取图片 前言 一. Python准备 二. Python仿真 三. 仿真结果 四. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断上升,由于Py ...

  2. python 视频人脸替换_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  3. python视频人脸检测_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  4. python3+openCV实现图片的人脸人眼检测,原理+参数+源代码

    上学时候用matlab学过一些图像处理的基础知识,当时课程作业是用haar实现人脸检测 but当时是心思根本不在图像处理上,so找了个同学帮忙做的,自己没上心 然鹅天道好轮回,现在捡起来了原来的算法一 ...

  5. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  6. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  7. python模块cv2人脸识别_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  8. python水印检测_TensorFlow Lite+OpenCV实现移动端水印的检测与去除

    摘要: TensorFlow Lite+OpenCV实现移动端水印的检测与去除 闲鱼技术:镇雷 概要: 本篇文章介绍了TensorFlow Lite与OpenCV配合使用的一个应用场景,并详细介绍了其 ...

  9. python连通域标记_使用OpenCV获取图片连通域数量,并用不同颜色标记函

    一,原图和效果图 二,代码 //#########################产生随机颜色######################### cv::Scalar icvprGetRandomCo ...

最新文章

  1. CloseableHttpClient加载证书来访问https网站
  2. linux支持异步io吗,Linux 异步IO
  3. 切换用户访问共享文件夹
  4. ACM题目————食物链
  5. ubuntu创建用户的两种方式
  6. hadoop本机运行 解决winutils.exe的问题
  7. boost::property_tree读取解析ini文件--推荐
  8. 算法笔记_面试题_22. 图与搜索(BFS/DFS)相关_模板及示例十几道
  9. (node:3872) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issue
  10. 银河麒麟桌面操作系统V10node.js 14安装小助手
  11. 人脸识别打卡机怎么调sj_人脸通怎么使用_人脸通考勤机怎么设置
  12. Hive之——Hive2.0函数大全
  13. 谁先倒(15 分) 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒
  14. java anon_shiro中的anon,authc啥意思
  15. 2021综述:计算机视觉中的注意力机制(续四):分支注意力
  16. ubuntu 调 2K 分辨率
  17. 梳理公司的组织架构 --- 组合模式
  18. Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,
  19. 什么是CV?CV和resume有什么区别?
  20. 深度学习---从入门到放弃(九)RNN入门

热门文章

  1. R语言临床预测模型的评价指标与验证指标实战:ROC曲线、AUC(C-Statistics)
  2. 2022年10月 前端面试题总结——(二)
  3. java截取中文_按字节截取混有中文汉字的字符串 中英文字符串截取
  4. 银豹收银系统零费率怎么切
  5. ArduinoUNO实战-第二十一章-通过调整电位器来改变9克舵机的角度
  6. debian Squeeze 安装gnome截图软件.
  7. pku 1830 开关问题(构造矩阵+高斯消元)
  8. Linux系统根目录各文件夹的含义
  9. python时间序列分析航空旅人_Python深度学习教程:LSTM时间序列预测小练习—国航乘客数量预测...
  10. 用java实现转圈数字