python中使用Opencv进行人脸检测
这两天学习了人脸识别,看了学长写的代码,边看边码边理解搞完了一边,再又是自己靠着理解和记忆硬码了一边,感觉还是很生疏,就只能来写个随笔加深一下印象了。
关于人脸识别,首先需要了解的是级联分类器CascadeClassifier,它可以它既可以是Haar特征,也可以是LBP特征的分类器,可以加载OpenCV所提供的库当中的.xml文件,文件存放在anaconda\pkgs\libopencv-3.4.1-h875b8b8_3\Library\etc的haarcascades文件夹中,包含了许多个.xml文件,分别有不同的用途。而在使用级联分类器进行人脸检测时,需要调用 .detectMultiScale 方法,其中的参数为
  img:传入图像
                      object:被检测的物体的矩形框向量组
                      scaleFactor:表示前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,即每次搜索窗口扩大10%
                      minNegihbors,表示构成检测目标的相邻矩形的最小个数(默认为3个)
                      flags:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数会使用Canny边缘检测来排除边缘过多或者过少的区域,这些通常不会是人脸所在区域
                      minSize和maxSize:用来限制得到的目标区域的范围
其输出为一个vector矩阵,保存人脸的坐标和大小,需要注意的是,传入的图像必须为灰度图像,因为级联分类器检测需要接收灰度图像。

1.首先是静态图片中的人脸检测
这部分并不算难,看着注释应该也可以看懂,就不多做解释。
def StaticDetect(filename):
'''
静态图像的人脸检测
'''
#创建一个级联分类器,加载一个 .xml文件,它既可以是Haar特征,也可以是LBP特征的分类器
face_casecade=cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml') #加载图像
img=cv2.imread(filename,cv2.IMREAD_COLOR)
#转换为灰度图像
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
'''
detectMultiScale进行人脸检测
传入参数为args:
img:传入图像
object:被检测的物体的矩形框向量组
scaleFactor:表示前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,即每次搜索窗口扩大10%
minNegihbors,表示构成检测目标的相邻矩形的最小个数(默认为3个)
flags:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数会使用Canny边缘检测来排除边缘过多或者过少的区域,这些通常不会是人脸所在区域
minSize和maxSize:用来限制得到的目标区域的范围
输出为:vector保存各个人脸的坐标、大小(用矩形表示)
'''
faces=face_casecade.detectMultiScale(gray_img,1.2,5)
for (x,y,w,h) in faces:
#在原图上绘制矩形
img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.namedWindow('Face_Detected')
cv2.imshow('Face_Detected',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
检测的结果如下图,图片是我从网上随便找的一张图,如果有任何侵犯的地方,请及时联系我,会即刻删除。我们可以发现结果并不是太好,有许多漏检,由于是初学则不做过多改正尝试,可以尝试修改级联分类器中的文件以及搜索窗口比例系数来改变检测准确度。

2.动态人脸检测
这一部分采用了两个级联分类器,一个检测面部,一个检测眼睛,需要注意的是,眼睛的检测是在人脸检测后再进行检测,即先从大的人脸开始画出矩形再到眼睛画出的矩形。检测眼睛时可以把眼镜摘下,会准确很多。
def Video_detected():
'''
从视频中进行人脸检测
'''
#创建一个级联分类器,家在一个 .xml文件它既可以是Haar特征,也可以是LBP特征的分类器
face_cascade=cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
eye_cascade=cv2.CascadeClassifier('./haarcascades/haarcascade_eye.xml') #打开摄像头
camera=cv2.VideoCapture(0)
cv2.namedWindow('Dynamic') while(True):
#读取一帧图像 ret
ret,frame=camera.read()
#判断图片读取是否成功
if ret:
gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#人脸检测
faces=face_cascade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in faces:
#在原图上绘制矩形
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) #蓝色
roi_gray=gray_img[y:y+h,x:x+w]
#眼睛检测
eyes=eye_cascade.detectMultiScale(roi_gray,1.1,5,0,(40,40))
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(frame,(ex+x,ey+y),(ex+x+ew,ey+y+eh),(0,255,0),2) #绿色 cv2.imshow('Dynamic',frame)
#如果按下q键则退出
if cv2.waitKey(10) & 0xff==ord('q'):
break
camera.release()
cv2.destroyAllWindows()
检测结果如下图,可以发现对象不多的时候,人脸检测还是挺准确的,尝试过后,动态情况下多个人脸也是可以检测出来的。我们可以发现,在眼睛的检测中多了几个参数,这些参数是由于眼睛比较小,并且有鼻子等造成的阴影可能会产生假阳性,因此通过限制检测的眼睛大小为40*40可以去除假阳性的影响。后续可以尝试不同的参数的检测精度,这里就不多做描述。

这里附上原博客的连接:https://www.cnblogs.com/zyly/p/9410563.html
2018.10.28
python中使用Opencv进行人脸检测的更多相关文章
- OpenCV-Python(1)在Python中使用OpenCV进行人脸检测
		
OpenCV是如今最流行的计算机视觉库,而我们今天就是要学习如何安装使用OpenCV,以及如何去访问我们的摄像头.然后我们一起来看看写一个人脸检测程序是如何地简单,简单到只需要几行代码. 在开始之前, ...
 - python中使用Opencv进行人脸识别
		
上一节讲到人脸检测,现在讲一下人脸识别.具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别. 人脸识别前所需要的人脸库可以通过两种方式获得:1.自己从视频获取图像 2.从人 ...
 - 【转载】opencv实现人脸检测
		
全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...
 - OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现
		
# OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...
 - OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
		
开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译 ...
 - Python人工智能第二篇:人脸检测和图像识别
		
Python人工智能第二篇:人脸检测和图像识别 人脸检测 详细内容请看技术文档:https://ai.baidu.com/docs#/Face-Python-SDK/top from aip impo ...
 - OpenCV实现人脸检测
		
OpenCV实现人脸检测(转载) 原文链接:https://www.cnblogs.com/mengdd/archive/2012/08/01/2619043.html 本文介绍最基本的用OpenC ...
 - Python学习--使用dlib、opencv进行人脸检测标注
		
参考自https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/ 在原有基础上有一部分的修改(image ...
 - python+OpenCV进行人脸检测【转】
		
OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: $ su ...
 
随机推荐
- 在 Windows 上使用 Cygwin
			
引用:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_cygwin/#resources Cygwin 是一个用于 Microso ...
 - C# DateTime 月第一天和最后一天 取法
			
取得某月和上个月第一天和最后一天的方法 /// <summary> /// 取得某月的第一天 /// </summary> /// <param name="d ...
 - java学习之路之javaSE基础1
			
<h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用 ...
 - couldn't launch the emulator make sure the sdk directory is properly setup
			
android sdk 路径中不能有空格.转到一个没有空格的文件夹下即可.
 - Eclipse设置相同变量背景色高亮显示
			
在Eclipse中,鼠标选中或者光标移动到java类的变量名时,相同变量会被标识显示(设置背景色高亮), 并且侧边滚动条会标出变量的位置, 查找变量十分方便. 1.相同变量标识高亮显示: Window ...
 - 异步FIFO跨时钟域亚稳态如何解决?
			
跨时钟域的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域 ...
 - 安卓秘钥生成命令以及SHA1值获取办法
			
切换到秘钥所在目录,例如:cd C:\Program Files\Java\jdk1.8.0_171\bin 执行命令:keytool -genkey -alias demo.keystore -ke ...
 - SpringCloud负载均衡笔记
			
SpringCloud的负载均衡组件用的是Ribbon,这个东西就是服务消费者.它只是一个配置用的中转器,放在 Zuul 和 Eureka Client 之间用来转发的,它里面写了好多规则,用来指定负 ...
 - ThinkJava-持有对象
			
11.3 添加一组元素 在java.util包中的Arrays和Collection类中都有很多实用方讼,可以在一个Collection中添加 一组元素.Arrays.asList()方法接受一个数组 ...
 - Spring AOP的注解方式实现
			
spring也支持注解方式实现AOP,相对于配置文件方式,注解配置更加的轻量级,配置.修改更加方便. 1.开启AOP的注解配置方式 <!-- 开启aop属性注解 --> <aop:a ...