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

原文地址:https://www.cnblogs.com/do-hardworking/p/9866258.html

时间: 2024-07-30 19:39:24

python中使用Opencv进行人脸检测的相关文章

python中使用Opencv进行人脸识别

上一节讲到人脸检测,现在讲一下人脸识别.具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别. 人脸识别前所需要的人脸库可以通过两种方式获得:1.自己从视频获取图像   2.从人脸数据库免费获得可用人脸图像,如ORL人脸库(包含40个人每人10张人脸,总共400张人脸),ORL人脸库中的每一张图像大小为92x112.若要对这些样本进行人脸识别必须要在包含人脸的样本图像上进行人脸识别.这里提供自己准备图像识别出自己的方法. 1.采集人脸信息:通过摄像头采集人脸信息,10张以上

C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数

这个项目主要包含三部分:人脸检测.特征提取.性别分类: 这篇博客中我们重点介绍OpenCv的人脸检测函数.这篇博客我们先不提MFC,而是在win32控制台下编写一段人脸检测的程序. 一.开启摄像头 我们先讲解如何通过摄像头来采集图像,这听起来更有实际意义. 1.新建工程并配置OpenCv(注意工程类型选择win32控制台应用程序): 2.包含头文件 OpenCv2.x版本包含头文件非常方便,一句话搞定: #include <opencv2\opencv.hpp> using namespace

OpenCV&amp;Qt学习之四——OpenCV 实现人脸检测与相关知识整理

开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译安装OpenCV. 网上能够找到关于OpenCV人脸检测的例子也比较多,大多也都是基于这个例程来更改,只是多数使用的是OpenCV 1.0的版本,而OpenCV2.0以后由于模块结构的更改,很多人并没有将例程运行起来.如果是新版的OpenCV跑旧的例程,编译运行出错的话,需要确保: #include

基于opencv的人脸检测的web应用

参考资料 https://github.com/bsdnoobz/web-based-face-detect http://opencv-code.com/projects/web-based-interface-for-face-detection-with-opencv/ http://www.cnblogs.com/findingsea/archive/2012/03/31/2427833.html 流程如下图 背景知识 php调用exe的返回 <html> <body> &

python配置opencv实现人脸检测

模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

基于python+opencv的人脸检测+

人脸检测分为两种:一种是基于知识的,一种是基于深度学习的.深度不会学习 人脸识别属于目标检测,主要涉及两个方面: ①先对检测的物体进行概率统计,从而知道待检测对象的一些特征,建立其目标的检测模型 ②用得到的模型来匹配输入的图像,如果有匹配则则输出匹配的区域,否则什么也不做. 我们看到的图片和计算机不一样,计算机看到的是一串串数字矩阵,图片由多个像素组成,拿我们熟悉的RGB图像来说,每个像素又有红绿蓝三个通道,假如每个像素的单个通道由uint8类型字符组成,那么三通道的像素便会有24位,这是我们常

Python学习案例之视频人脸检测识别

前言 上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统.人脸动态跟踪识别系统等等. 案例 这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸. 代码实现: # -*- coding: utf-8 -*- __author__ = "小柒" __blog__ = "https://blog.52itstyle.vip/" import cv2 i

人脸检测真的不难,50行Python代码就能实现人脸检测

Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程,都放在了文章结尾,欢迎前来领取! *注意:全文代码可以滑动查看 现在的人脸识别技术已经得到了非常广泛的应用,支付领域.身份验证.美颜相机里都有它的应用.用iPhone的同学们应该对下面的功能比较熟悉. iPhone的照片中有一个"人物"的功能,能够将照片里的人脸识别出来并分类,背后的原理也是人脸识别技术. 这篇文章主要介绍怎样用Python实现人脸检测.人

基于Opencv的人脸检测及识别

一.实验目的:我这里完成的是,将8张人脸图片(4组,每组两张)存入库中,选取1张图片,程序识别出与其匹配的另一张. 这里介绍分三个步骤完成该工作,①程序读取摄像头.拍照 ②程序从电脑文档中读取图片   ③检测人脸,并用红框框出人脸 ④使用感知哈希算法匹配最相似的图片 二.实验环境: Win 7(x64).visual studio 2010.openCV-2.4.3 使用语言:C++ 三.实验准备:①安装好vs2010,本文不予介绍.   ②配置opencv : 1'进入官网下载http://o