opencv5-objdetect之级联分类器
这是《opencv2.4.9tutorial.pdf》的objdetect module的唯一一个例子。
在opencv中进行人脸或者人眼 或者身体的检测 首先就是训练好级联分类器,然后就是检测就行。在opencv中,“opencv/sources/data中就有内置训练好的:基于haar特征的级联分类器、基于hog特征的级联分类器、基于lbp特征的级联分类器”三种。相比较来说 算haar文件夹中的分类器最多,其他两个比如:hog的只有一个行人检测分类器“hogcascade_pedestrians.xml”而已;
lbp的有三个分类器:“lbpcascade_frontalface.xml”、“lbpcascade_profileface.xml”、“lbpcascade_silverware.xml”。·
采用的是级联分类器类:CascadeClassifier,并通过不同的分类器类型进行初始化。
1、先设定不同的分类器:
这里使用自带的haar特征的前人脸和眼睛级联分类器:
string face_cascade_name = "haarcascade_frontalface_alt.xml";
string eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
2、然后进行分类器类的初始化:
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
这里使用load()函数进行加载,当然也可以定义类的对象的时候进行初始化。load()函数的返回值是bool类型。
当不需要该分类器可以使用cvReleasehaarClassifierCascade(&cascade);进行释放。
3、进行对象的检测
void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0,
Size minSize=Size(), Size maxSize=Size())
这是这个函数的原型,是用来在输入图像中检测不同尺寸的对象,检测的对象将会作为一个矩形列表,也就是原型中的第二个参数。
参数列表:需要检测的图像(矩阵的类型为CV_8U)、矩形vector容器用来装填所包含的检测到的对象、在每个图像尺度上需要进行缩放的因子、候选矩形框所需要包含的邻居大小、已经废弃的参数、可能的对象尺寸的最小值、可能的对象的尺寸的最大值;
最后两个参数就是用来控制范围的,使得能够忽略小于最小的和大于最大的;第一个参数的要求是灰度图像,所以不能是彩色,需要进行转换:
vector<Rect> faces;
Mat detFrame_gray; cvtColor( srcFrame, detFrame_gray, CV_BGR2GRAY );
equalizeHist( detFrame_gray, detFrame_gray );
face_cascade.detectMultiScale( detFrame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
上面就是会自动检测人脸然后将检测到的人脸的个数和每个人脸的矩形区域放在faces这个容器类中。上面最后一个最大值未指定大小,只设定了最小的对象矩形大小。
for( int i = 0; i < faces.size(); i++ )
{
Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat faceROI = frame_gray( faces[i] );
vector<Rect> eyes; //-- 在每张人脸上检测双眼
eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int j = 0; j < eyes.size(); j++ )
{
Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
int radius = cvRound( (eyes[j].width + eyes[i].height)*0.25 );
circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
}
}
上面通过对每个人脸中,先定位好每个人脸的中心位置,然后在采用画椭圆的方式来讲人脸进行框出来,并且对每个框出来的位置进行选取ROI感兴趣区域来检测眼睛。并将检测到的眼睛用圆框出来。
notes:不论是上面的人脸还是眼睛检测,其中的第一个参数都是被检测的图像,而且在后面的画椭圆和圆的过程中第一个参数仍然是原图像,最后加个imshow()的函数就可以进行显示检测到的结果。
其中的cvRound()函数的原型为 int cvRound(double value);将参数转化成与其最接近的整数。
下面这部分来自于http://blog.csdn.net/vsooda/article/details/7543789
但是也和《opencv2.4.9refman.pdf》的448页一样,相信该作者也是翻译过来的。
目前人脸检测分类器大都是基于haar特征利用Adaboost学习算法训练的。
目标检测方法最初由Paul Viola [Viola01]提出,并由Rainer Lienhart [Lienhart02]对这一方法进行了改善. 首先,利用样本(大约几百幅样本图片)的 harr 特征进行分类器训练,得到一个级联的boosted分类器。训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如人脸或汽车等),反例样本指其它任意图片,所有的样本图片都被归一化为同样的尺寸大小(例如,20x20)。
分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。检测到目标区域(汽车或人脸)分类器输出为1,否则输出为0。为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。 为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。
分类器中的“级联”是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器, 这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。 目前支持这种分类器的boosting技术有四种: Discrete Adaboost, Real Adaboost, Gentle Adaboost and Logitboost。"boosted" 即指级联分类器的每一层都可以从中选取一个boosting算法(权重投票),并利用基础分类器的自我训练得到。基础分类器是至少有两个叶结点的决策树分类器。
Haar特征是基础分类器的输入,主要描述如下。目前的算法主要利用下面的Harr特征。
个人:其实过程就是这样,如果感兴趣,更多的应该是使用自己训练的分类器,在目标检测这部分中,暂时只介绍了级联分类器类,在《opencv2.4.9refman》中还介绍了潜在SVM分类器,不过还没有对应的例子罢了。
opencv5-objdetect之级联分类器的更多相关文章
- 利用opencv中的级联分类器进行人脸检測-opencv学习(1)
OpenCV支持的目标检測的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本号的C++接口除了Haar特征以外 ...
- opencv:级联分类器训练(cascade classifier training)(两个分类器的区别)
# 介绍 级联分类器包括两个工作阶段:训练(traning),检测(detection).检测阶段在文档<objdetect module of general OpenCV documenta ...
- OpenCV 级联分类器
#include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" ...
- 【原/转】opencv的级联分类器训练与分类全程记录
众所周知,opencv下有自带的供人脸识别以及行人检测的分类器,也就是说已经有现成的xml文件供你用.如果我们不做人脸识别或者行人检测,而是想做点其他的目标检测该怎么做呢?答案自然是自己训练一个特定的 ...
- 如何利用OpenCV自带的级联分类器训练程序训练分类器
介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...
- 级联分类器训练-----OpenCV
关键词:级联分类器.opencv_traincascade 下面简述操作过程: 准备正负样本:neg.pos 正负样本路径生成:dir /a/b>path.txt //path:pos or n ...
- OpenCV——级联分类器(CascadeClassifier)
级联分类器的计算特征值的基础类FeatureEvaluator 功能:读操作read.复制clone.获得特征类型getFeatureType,分配图片分配窗口的操作setImage.setWindo ...
- 使用OpenCV训练好的级联分类器识别人脸
一.使用OpenCV训练好的级联分类器来识别图像中的人脸 当然还有很多其他的分类器,例如表情识别,鼻子等,具体可在这里下载: OpenCV分类器 import cv2 # 矩形颜色和描边 color ...
- opencv的级联分类器(mac)
级联分类器的介绍:级联分类器训练 因为要训练负样本,windows电脑有些问题,所以就只能有mac进行训练. 在windows中训练,准备了负样本之后,进行三步. 1.opencv_createsam ...
随机推荐
- 你离月薪30K还差哪些?
这类标题的文章,是不是很熟悉?你是不是冲着标题进来的? 类似这样的标题党文章,你应该看过很多,多数是泛泛而谈,没啥用- 今天老徐跟大家用几个真实案例,聊点有用的- 看完之后,你至少知道自己的差距是哪些 ...
- .NET序列化的一点技巧(附Demo)
阅读目录 介绍 详细 处理 结论 Demo下载 介绍 序列化是将对象状态转换为可保持或传输的形式的过程.序列化的补集是反序列化,后者将流转换为对象.这两个过程一起保证数据易于存储和传输. .NET F ...
- ubuntu同时安装qt4.8和qt5.7
这是ubuntu默认安装(从apt安装)的路径和相关文件,建议编译安装到/opt目录下,使用./configure --prefix=/opt/Qt4.8 /usr/share/qt4 /usr/sh ...
- linux基础-第八单元 正文处理命令及tar命令
第八单元 正文处理命令及tar命令 使用cat命令进行文件的纵向合并 两种文件的纵向合并方法 归档文件和归档技术 归档的目的 什么是归档 tar命令的功能 tar命令的常用选项 使用tar命令创建.查 ...
- SqlServer时间格式化
最近用的SqlServer比较多,时间格式化老是忘记,现整理如下:(来源于网上,具体来源地址忘记了,归根到底MSDN吧) SELECT CONVERT(varchar(50), GETDATE(), ...
- MMORPG大型游戏设计与开发(客户端架构 part5 of vegine)
客户端异常捕获,是一件必然的事情,特别是在开发的时候就更需要这些有利于找出问题原因的捷径.区别于服务器的是,客户端基本上是以界面为主,你很难在正常运行程序的情况下进行一些输出的监视,如一些日志的记录. ...
- 【温故而知新-Javascript】使用canvas元素(第一部分)
1. 开始使用 canvas 元素 canvas 元素非常简单,这是指它所有的功能都体现在一个JavaScript对象上,因此该元素本身只有两个属性:width 和 height. canvas 元素 ...
- JAVA IO 以及 NIO 理解
由于Netty,了解了一些异步IO的知识,JAVA里面NIO就是原来的IO的一个补充,本文主要记录下在JAVA中IO的底层实现原理,以及对Zerocopy技术介绍. IO,其实意味着:数据不停地搬入搬 ...
- AC小笔记
1:基本库函数的使用 Rand()函数,可以产生0~32767之间的随机数. a+rand()%(b-a) 可以得到 [a,b] 之间的随机数. 2:基本数据类型的使用 可以使用强制类型转换 例如: ...
- Maven系列二setting.xml 配置详解
文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...