对OpenCV中Haar特征CvHaarClassifierCascade等结构理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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