opencv3/c++ Haar特征与Viola-Joines人脸检测_阿卡蒂奥的博客-程序员秘密

技术标签: OpenCV  Haar  opencv  

在人脸检测中,Viola-Jones人脸检测算法是一个经典的算法,由Viola.P.和 Jones.M在2001年的CVPR上提出。主要通过利用Haar特征结合adaboost算法进行训练,然后建立级连分类器分类。优点是速度快,正脸检测高效;缺点是对侧脸检测不够稳健。

Haar特征

由Viola和Jones根据Haar小波的方法开发(由Rainer Lienhart改进为Haar-like特征,用于目标检测)。Haar特征的作用有点类似卷积核,即通过下图中的矩形窗口,将检测窗口中的黑色矩形下的像素之和中减去白色矩形下的像素之和,结果作为特征值。然后遍历所有像素得到的即为Haar特征。
这里写图片描述
这样不同的矩形窗口可以获得不同的图像特征:
这里写图片描述
而在人脸图像中会有一些基本的共性:眼睛、眉毛、鼻子和嘴巴的位置相对固定,鼻子比周围亮等等。这样,Viola-Joines算法就通过Haar特征获得了人脸的共有属性。

产生的问题

按上述方法获得Haar特征会产生两个问题:

  • 运算量问题;
  • 特征选择问题;
运算量问题:

在获得Haar特征的时候,一个图像中可选择矩形窗口有大有小。若每个矩形窗口都用遍历所有像素再求和,那么就会产生巨大的运算量(一个24x24的窗口也会产生超过160000个特性)。这里采用的解决办法是引入积分图像,参见积分图像

特征选择问题:

特征选择问题即如何从如此多的Haar特征中选择最佳特征。这里采用Adaboost算法。在训练数据(包含人脸的和不包含人脸的图像)中对于每个特征,找到正确分类的最佳阈值,然后选择错误率最小的特征。每次分类之后,增加错误分类的图像的权重,然后执行相同的过程,计算新的错误率及新的权重。直到达到所需的准确度、错误率或找到所需数量的特征为止。opencv中最终选择的特征有6000个左右。

另外,在图像中,大部分图像是非人脸区域。为减少检测时间这里引入了分类器级联。即不在检测窗口上应用全部的6000个特征,而是分为不同的阶段逐一应用。那些非人脸的部分在开始阶段就会被丢弃;这样,可以花费更多时间检查可能的人脸区域。
如图,200个特征即能达到95%的准确度(横轴为假阳性率FPR,纵轴为真阳性率TPR):
这里写图片描述

OpenCV中的应用:

利用OpenCV自带的haarcascade_frontalface_alt.xml文件进行简单的人脸识别。haarcascade_frontalface_alt.xml文件位于opencv安装目录下的…/data/haarcascades/中。
示例:

#include "opencv2/opencv.hpp"   
#include "opencv2/objdetect/objdetect.hpp"   

using namespace std;   
using namespace cv;   

int main( int argc, char** argv )
{   
    Mat src;
    CascadeClassifier face_cascade;
    src =imread("E:/image/image/faces.jpg",1);
    if (src.empty())
    {
        printf("can not load the image...\n");
        return -1;
    }
    if( !face_cascade.load("haarcascade_frontalface_alt.xml") )
    {    
        printf("can not load the file...\n");
        return -1;
    }
    vector<Rect> faces;   
    Mat gray_image; 
    cvtColor( src, gray_image, CV_BGR2GRAY );  
    //直方图均衡化  
    equalizeHist( gray_image, gray_image );   
    face_cascade.detectMultiScale( gray_image, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(1, 1) );   
    //框选出脸部区域
    for (int i = 0; i < faces.size(); i++)
    {
        RNG rng(i);
        Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), 20);
        rectangle(src, faces[static_cast<int>(i)], color, 2, 8, 0);
    } 
    imshow("face", src );   
    waitKey(0);
    return 0;
}   

这里写图片描述


Robust Real-Time Face Detection

OpenCV:Face Detection using Haar Cascades

Wikipedia:Haar-like feature

An Extended Set of Haar-like Features for Rapid Object Detection

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/akadiao/article/details/79707034

智能推荐

Github资源中转至Gitlab_太阳花的小绿豆的博客-程序员秘密

文章目录1 Gitlab的安装与配置1.1Gitlab的安装1.2Gitlab的配置1.2.1gitlab自带nginx的配置1.2.2配置自己下载的nginx2 获取Github资源2.1 v3 api2.2 v4 graph api2.3 clone 仓库源文件3 上传资源至Gitlab3.1 push源码资源3.2 push tags信息3.3 push release信息3.4 修改项目可见性4 WIKI的下载与上传简单说下需求,由于公司内外网是隔离的,为了在内网能够学习github上的一些源码资

文件上传及多文件上传_Flykos的博客-程序员秘密

一、单文件上传注:1.我这里使用的是springmvc,所以在配置文件中,要添加如下配置(并添加commons-fileupload-1.2.1.jar)2.springmvc其余配置参照之前文章 表单: 处理:public Boolean upload(@RequestParam("myfile") MultipartFile file,Ht

SpringCloud OpenFeign单文件和多文件上传_czq_lh的博客-程序员秘密

1、单文件上传OpenFeign默认不支持文件上传,需要通过引入Feign的扩展包来实现,添加依赖 &lt;!--Feign上传文件--&gt; &lt;dependency&gt; &lt;groupId&gt;io.github.openfeign.form&lt;/groupId&gt; &lt;artifactId&gt;feign-form&lt;/artifactId&gt; &lt;

ExpandableListView 和CheckBox结合使用_huang_xiao_yu的博客-程序员秘密

先说说需求,这样便于理解代码:(以图来讲解说明)这是A页面:可以看到一个医疗组:组名是从B 页面拿到的。想要更换组名,点击这个组,就跳转到B页面。2.这是B页面:页面是分组选项,其中:A页面上次选的组名要在B页面展示出来,同时,用户也可以重新选择组名,再传递给A.3.做的过程中碰到的难点就是:A页面选择的组名怎么在B页面中展示。(1) 我刚开始的思路是:把A页面选择的组名的ID保留传递给B,然后

jsp不能使用EL解决方法_wenjie12201的博客-程序员秘密

加入&amp;lt;%@ page isELIgnored=&quot;false&quot;%&amp;gt;即可

随便推点

@RequestMapping Consumes 与 headers 区别_超凡脱俗 ~.~的博客-程序员秘密

1、RequestMapping接口的源码如下,里面定义了七个属性(1)@Target中有两个属性,分别为 ElementType.METHOD 和 ElementType.TYPE ,也就是说 @RequestMapping 可以在方法和类的声明中使用(2)可以看到注解中的属性除了 name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如 value()可以同时定...

hibernate映射关系 一对多、多对一单向关联 一对多双向关联_shiningHan的博客-程序员秘密

在讲hibernate的 一对多、多对一单向关联 一对多双向关联的映射关系之前首先来看看数据库表的设计。数据库表的设计好坏直接关系着程序设计的简单与复杂。人person和梦dream是一对多的关系,那么再设计数据库表的时候,是将personid添加到dream表中(即将一加入多的一方)好,还是将dreamid添加到person表中(即将多的一方加入到一)好呢?首先假设dreamid添加到p

无法在Mac Os下通过Gem安装Mysql_Thierryxing的博客-程序员秘密

在Mac Os下通过Gem安装Mysql时,老是报错:  Building native extensions. This could take a while...ERROR: Error installing mysql: ERROR: Failed to build gem native extension. /System/Library/...

android分析内存工具,Android Studio内存泄漏分析工具汇总_52赫兹的咸鱼的博客-程序员秘密

Android Studio内存泄漏分析工具汇总时间:2017-04-25来源:Android开发学习网在Android开发过程中,让人头疼的就是内存泄露问题了,很小的一个错误都会引起内存泄漏,那么如何分析内存泄漏呢?今天就和大家分享下Android Studio中常用的内存泄漏分析工具,希望对大家快速分析和定位Android内存泄漏有所帮助。1.Android MonitorAndro...

Hadoop NameNode启动后自动关闭解决方法_大数据张老师的博客-程序员秘密

Hadoop NameNode启动后过一会自动关闭了,查看日志文件报内存溢出异常:tail -100 /bigdata/logs/hadoop/hadoop-root-namenode-node1.log解决方法:修改配置文件$HADOOP_HOME/etc/hadoop/hadoop-env.sh,增加NameNode和SecondaryNamenode的内存。...

SourceTree通过PUTTY连接GitLab_sourcetree putty_鎏金六月的博客-程序员秘密

本文转自https://www.cnblogs.com/rslai/p/7840515.html赖荣生3、SourceTree通过PUTTY连接GitLab一、生成公钥和私钥使用命令行生成(两种生成方式选择一种即可)1、安装SourceTree打开SourceTree,点击“命令行模式”。2、输入如下命令生成key“[email protected]”是你在gitlab中注册的邮箱...

推荐文章

热门文章

相关标签