对OpenCV中Haar特征CvHaarClassifierCascade等结构理解

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

对OpenCV中Haar特征CvHaarClassifierCascade等结构理解

首先说一下这个级联分类器,OpenCV中级联分类器是根据VJ 04年的那篇论文(Robust Real-Time Face Detection)编写的,查看那篇论文,知道构建分类器的步骤如下:

1、根据haar-like特征训练多个弱分类器

2、使用adaboost算法将多个弱分类器组合成一个强分类器

3、最终的分类器是由多个强分类器级联而成

下面这幅图是弱分类器组合成强分类器的示意图(图片来源于网络):

下面这张是多个强分类器级联的示意图(图片来源于网络):

1 typedefstructCvHaarClassifierCascade

7 /* these two parameters are set by cvSetImagesForHaarClassifierCascade */

8 CvSizereal_window_size; /* 待检测物体的大小 */

9 double scale; /* Haar块缩放的尺寸 */

10

11 CvHaarStageClassifier* stage_classifier; /* 定义强分类器数组 */

12 CvHidHaarClassifierCascade* hid_cascade;

13 }CvHaarClassifierCascade;

第一个flags,还不是很清楚,在debug模式下,flags=1112539136(好吧,这个值很诡异),我也不是很清楚

第二个count,表示整个分级分类器中强分类器的数量,即最后参与级联的强分类器的个数

第三个orig_window_size,表示的是在训练时用的正样本的尺寸,OpenCV中的尺寸是20x20

第四个和第五个,注释中说了,这两个参数需要自己设置,具体每个参数看注释

第六个stage_classifier,是强分类器指针,指向一个强分类器数组,之前的count是多少,那么此处的强分类器就有多少

最后一个hid_cascade,还不是很清楚

下面来看上面第六个参数的强分类器结构体

1 typedefstructCvHaarStageClassifier

2 {

3 int count; /* number of classifiers in the battery 构成强分类器的弱分类器的数量*/

4 float threshold; /* threshold for the boosted classifier 叠加分类器的阈值*/

5 CvHaarClassifier* classifier; /* array of classifiers 定义分类器数组*/

6 /* these fields are used for organizing trees of stage classifiers,

7 rather than just stright cascades */

8 int next;

9 int child;

10 int parent;

11 }CvHaarStageClassifier;

第一个count,表示该强分类器中,弱分类器的数量,即该强分类器由多少个弱分类器组成

第二个threshold,叠加分类器的阈值(好吧。。这个我也不知道)

第三个classifier,是一个指针,指向的是一个弱分类器数组,之前的count是多少,此处的弱分类器就有多少

后面3个都不清楚。。。(望知道的网友给予帮助)

下面是弱分类器的结构

1 typedefstructCvHaarClassifier

2 {

3 int count; /* number of nodes in the decision tree */

4 /* these are "parallel" arrays. Every index i corresponds to a node of the decision tree (root has 0-th index).

5 left[i] - index of the left child (or negated index if the left child is a leaf)

6 right[i] - index of the right child (or negated index if the right child is a leaf)

7 threshold[i] - branch threshold. if feature responce is <= threshold, left branch is chosen, otherwise right branch is chosed.

8 alpha[i] - output value correponding to the leaf. */

9

10 CvHaarFeature* haar_feature;

11 float* threshold;

12 int* left;

13 int* right;

14 float* alpha;

15 }CvHaarClassifier;

第一个count,在opencv里,发现始终都是1,自己想了想,因为这个结构体记录的是一个弱分类器,自然弱分类器的个数就是1了。

第二个haar_feature,也是一个指针,指向一个(因为count是1)特征结构体CvHaarFeature,这个结构体中记录的内容是弱分类器的类型(包括该haar-like特征的位置,大小,以及种类,这个结构体会在下面给出,再细说)

第三个threshold,就是那个判别函数:h(x,f,p,theta) = (p*f(x) < p*theta ? 1 : 0),中的阈值theta

第四个left,第五个right不是很清楚(求知道的同学详解啊~~~~)第六个alpha,就是这个弱分类器的权重(每一个强分类器都是由多个弱分类器按照各自的权重进行表决,而得到的)

特征的结构体如下

1 #define CV_HAAR_FEATURE_MAX 3

2 // 一个Haar特征由2~3个具有相应权重的矩形组成

3 typedefstructCvHaarFeature

4 {

5 int tilted; // 0 means up-right feature, 1 means 45-rotated feature

6 struct

相关文档
最新文档