级联分类器

先把我印象笔记里的东西贴出来,后期有时间再细细整理。

分类器的工作原理:
一个分类器经过大量的正例和反例训练。训练后,可以应用到与训练过程中大小相同的感兴趣区域中使用。检测过程中,产生一个搜索框在图片移动,经过每个位置并用分类器检测。搜索框的尺寸会在每一遍检索完后改变。

级联分类器现在有两种选择:
一是使用 opencv1 的CvHaarClassifierCascade函数,二是使用新版本的CascadeClassifier类。
老版本的分类器只支持类Haar特征,而新版本的分类器既可以使用Haar,也可以使用LBP特征。

cvHaarDetectObjects:
下面来看看这个函数的介绍:
函数功能:检测图像中的目录
函数原型:
CvSeq* cvHaarDetectObjects(const CvArr* image, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor=1.1, int min_neighbors=3, int flags=0, CvSize min_size=cvSize(0,0), CvSize max_size=cvSize(0,0))

函数说明:
image:表示输入图像,尽量使用灰度图以加快检测速度。
cascade:表示Haar特征分类器,可以用cvLoad()函数来从磁盘中加载xml文件作为Haar特征分类器。
void* cvLoad(const char* filename, CvMemStorage* memstorage=NULL, const char* name=NULL, const char** real_name=NULL)
filename :文件名称
memstorage :Memory storage for dynamic structures, such as CvSeq or CvGraph . It is not used for matrices or images.
name :Optional object name. If it is NULL, the first top-level object in the storage will be loaded.
real_name :Optional output parameter that will contain the name of the loaded object (useful if name=NULL )

storage:为CvMemStorage类型,大家应该很熟悉这个CvMemStorage类型了
scale_factor:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%
min_neighbors:表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
flags:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域。
min_size、max_size:表示检测窗口的最小值和最大值,一般设置为默认即可。
函数返回值:
函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。

CascadeClassifier类:
1.级联分类器的加载
CascadeClassifier::CascadeClassifier(const String& filename)

bool CascadeClassifier::load(const String& filename)

2.判断是否为空
bool CascadeClassifier::empty() const

3.检测物体,并返回矩形数组
void CascadeClassifier::detectMultiScale(InputArray image, vector& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

void CascadeClassifier::detectMultiScale(InputArray image, vector& objects, vector& numDetections, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

void CascadeClassifier::detectMultiScale(InputArray image, std::vector& objects, std::vector& rejectLevels, std::vector& levelWeights, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size(), bool outputRejectLevels=false )

参数介绍:
image:待检测图片,一般为灰度图像加快检测速度
objects:矩形的向量,其中每个矩形包含检测到的对象,矩形可能部分地在原始图像之外。
scaleFactor:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1,即每次搜索窗口依次扩大10%;
minNeighbors:表示构成检测目标的相邻矩形的最小个数(默认为3个)。指定每个候选矩形有多少个邻居需要保留它的参数。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
flags: 兼容老版本的一个参数,在3.0版本中没用处。默认为0。
minSize和maxSize是最小检测窗口大小和最大检测窗口大小。

该函数在输入图像的不同尺度中检测物体,参数 image 为输入的灰度图像,objects为得到被检测物体的矩形框向量组,scaleFactor为每一个图像尺度中的尺度参数,默认值为1.1,minNeighbors参数为每一个级联矩形应该保留的邻近个数(没能理解这个参数,-_-|||),默认为3,flags对于新的分类器没有用(但目前的haar分类器都是旧版的,CV_HAAR_DO_CANNY_PRUNING利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域,CV_HAAR_SCALE_IMAGE就是按比例正常检测,CV_HAAR_FIND_BIGGEST_OBJECT只检测最大的物体,CV_HAAR_DO_ROUGH_SEARCH只做初略检测),默认为0.minSize和maxSize用来限制得到的目标区域的范围。
face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值