opencv 35.级联分类器_GaryHm的博客-程序员秘密

技术标签: OpenCV  

一、人脸检测算法分类

目前人脸检测方法主要分为两大类,基于知识和基于统计。

基于知识的人脸检测方法主要包括:模板匹配,人脸特征,形状与边缘,纹理特征,颜色特征。
基于统计的人脸检测方法主要包括:主成分分析与特征脸法,神经网络模型,隐马尔可夫模型,支持向量机,Adaboost算法。

基于知识的方法将人脸看成不同特征的特定组合,即通过人脸的眼睛、嘴巴、鼻子、耳朵等特征及其组合关系来检测人脸。
基于统计的方法将人脸看成统一的二维像素矩阵,通过大量的样本构建人脸子空间,通过相似度的大小来判断人脸是否存在。

二、Haar分类器算法

Haar算法实际上是运用了boosting算法中的Adaboost算法。Haar分类器利用Adaboost算法构建一个强分类器进行级联,而在底层特征抽取上采用的是高校的矩形特征以及积分图方法。

Haar分类器=类Haar特征+积分图法+Adaboost算法+级联

Haar分类器主要步骤如下:1. 提取类Haar特征;2. 利用积分图法对类Haar特征提取进行加速;3. 使用Adaboost算法训练强分类器,区分出人脸和非人脸;4. 使用筛选式级联把强的分类器级联在一起,从而提高检测准确度。

2.1 人脸检测的大概流程

我们用一个小的窗口在一幅图片中不断的滑动,每滑动到一个位置,就对该小窗口内的图像进行特征提取,若提取到的特征通过了所有训练好的强分类器的判定,则我们判定该小窗口的图片内含有人脸。

2.2 Haar-like特征

Viola们提出的Haar-like特征如下:
在这里插入图片描述
将Haar-like特征在图片上进行滑动,在每个位置计算白色区域对应的像素值的和减去黑色区域对应的像素值的和,从而提取出该位置的特征,人脸区域与非人脸区域提取出的特征值不同,从而区分出人脸区域和非人脸区域。

我们可以用多个矩形特征计算得到一个区分度更大的特征值,从而增加人脸区域和非人脸区域的区分度。那么该怎么组合这些矩形特征才能得到更好的区分度呢?Adaboost算法就是用来解决这个问题的。

2.3 Adaboost算法

Adaboost算法是一种一般性的分类器性能提升算法,不仅仅是限定于一种算法。Adaboost算法可以用来更好地选择矩形特征的组合,而这些矩形特征的组合就构成了分类器,分类器以决策树的方式存储这些矩形特征组合。

Adaboost是基于boosting算法的,而boosting算法涉及到弱分类器和强分类器的概念。弱分类器是基于弱学习的,其分类正确率较低,但是较容易获得,强分类器是基于强学习,其分类正确率较高,但是较难获得。Kearns和Valiant两个大神提出弱学习和强学习是等价的,并且证明只要样本充足,弱学习可以通过一定的组合获得任意精度的强学习。这个证明为boostting算法提供了理论基础,使其成为一个能够提高分类器性能的一般性方法。而boosting算法主要存在两个问题,一个是它需要预先知道弱分类器的误差,另一个是它在训练后期会专注于几个难以分类的样本,因此会变得不稳定。针对这些问题,后来Freund和Schapire提出了实际可行的Adaboost算法。

2.4 弱分类器的构建

我们可以用决策树来构建一个简单的弱分类器, 将提取到的特征与分类器的特征进行逐个比较,从而判断该特征是否属于人脸,如下图所示:
在这里插入图片描述
在这里插入图片描述

//33 级联分类器
void StartOp2::ImageProcess2_33()
{
    
	String cascadeFilePath = "E:/opencv/opencv342/install/etc/haarcascades/haarcascade_frontalface_alt.xml";
	CascadeClassifier face_cascade;
	if (!face_cascade.load(cascadeFilePath)) {
    
		printf("could not load haar data...\n");
	}

	Mat src, gray_src;
	src = imread("../../Images/18.jpg");
	cvtColor(src, gray_src, COLOR_BGR2GRAY);
	equalizeHist(gray_src, gray_src);
	imshow("input image", src);

	vector<Rect> faces;
	face_cascade.detectMultiScale(gray_src, faces, 1.1, 2, 0, Size(30, 30));
	for (size_t t = 0; t < faces.size(); t++) {
    
		rectangle(src, faces[t], Scalar(0, 0, 255), 2, 8, 0);
	}
	namedWindow("output", CV_WINDOW_AUTOSIZE);
	imshow("output", src);
}

参考:

https://www.cnblogs.com/wumh7/p/9403873.html

https://www.cnblogs.com/YiXiaoZhou/p/5875492.html

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

智能推荐

IT信息化项目费用管理_XUENIAO的博客-程序员秘密

任何项目的实施都需要费用的支撑,信息化项目亦是如此.而项目的费用总是有限的,不可能是无限的,如何使信息化项目在有限的费用内得以实现,并保证项目的功能、质量、时间等目标同时实现,这是信息化项目管理中的一个重要问题。信息化项目费用管理主体主要涉及项目的需求方与项目承包方两方面项目需求方需要确定项目所需要的合理费用,筹措项目所需,并对项目费用进行监管,项目承包方则需在需求方所提供的有限费用内完成

linux查找进程_搜索进程_码农先锋A的博客-程序员秘密

进程是在 CPU 及内存中运行的程序代码,而每个进程可以创建一个或多个进程(父子进程)。查看进程方法:第一种:ps auxps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。a:显示当前终端下的所有进程信息,包括其他用户的进程。u:使用以用户为主的格式输出进程信息。.

win10桌面管理文件收纳_放心的电脑桌面收纳工具必备,电脑桌面win10应用商店_weixin_39616379的博客-程序员秘密

放心的电脑桌面收纳工具必备可以用下面的方法恢复:在windows文献夹,或是其他文献夹中新建一个文本文献,文献名为“显示桌面”,或是另存为也可以,这时候文献图标就变成显示桌面的图标了,将其放入快速启动栏就可以了,就在刚刚新客网小编的电脑上桌面图标突然不见了,小编打开任务管理器,运行了explorer.exe,但是除了弹出一个没有用的窗口外。在桌面空白处点击鼠标右键,点击查看,再点击“显示桌面图标”...

Tensorflow中API------tf.data.Dataset使用_ssmixi的博客-程序员秘密

Tensorflow API: tf.data.Dataset使用Tensorflow中之前主要用的数据读取方式主要有:建立placeholder,然后使用feed_dict将数据feed进placeholder进行使用。使用这种方法十分灵活,可以一下子将所有数据读入内存,然后分batch进行feed;也可以建立一个Python的generator,一个batch一个batch的将数据读...

Docker方式安装Consul配置中心_ProgrammingWay的博客-程序员秘密

1、安装dockeryum install docker -y# 配置镜像加速(省略,建议使用阿里云镜像加速)systemctl start dockersystemctl enable docker# 关闭防火墙2、安装consul# client 模式docker run --restart=always --name consul -p 8500:8500 -v /opt/consul/conf/:/consul/conf/ -v /opt/consul/data/:/

随便推点

Css样式 !important_c_reshape的博客-程序员秘密

覆盖antd vue 组件中的原生样式,比方说改变宽度

Flutter移动应用:按钮输入_qq_35889199的博客-程序员秘密

原文地址:https://siques.cn/p/34下面再去创建一个复选框的演示文件 …在 lib … demo 的下面,新建一个文件,名字是 checkbox_demo.dart …在文件里面,先导入 flutter 里面的 material …复选框CheckBox:复选框结构解析示例代码如下:import 'package:flutter/material.dart';...

【Android进阶】Android中的动画详解系列 Activity之间切换动画 完美方案_dodod2012的博客-程序员秘密

参考地址:http://blog.csdn.net/wei369924173/article/details/8285664                    http://www.linuxidc.com/Linux/2014-08/105023p4.htmandroid2.0以上可以用overridePendingTransition(R.anim.tran

近红外跨模态行人重识别(RGB-IR Cross-Modality Re-id)(二)_cross-modality re-id dataset_再困也得吃的博客-程序员秘密

接着第一篇文章,继续介绍后面的方法4. Visible Thermal Person Re-Identification via Dual-Constrained Top-Ranking简介:本文的作者与之前的HCML的作者为同一人,两种框架基本一致,但本文的损失函数较HCML的损失函数更直观,更易于理解。特点:三元损失函数的构建:跨模态的三元损失函数,并同时引入了难...

android调用Webservice方法_android 调用webservice_光头老农的博客-程序员秘密

 1.写作背景:  笔者想实现android调用webservice,可是网上全是不管对与错乱转载的文章,结果不但不能解决问题,只会让人心烦,所以笔者决定将自己整理好的能用的android调用webservice的实现分享给大家,供以后遇到相同需求的人能少走弯路。  源码使用android studio编写,可以在github上面下载观看:https://github.com/jhsc...