在研究opencv源代码的过程中,CvStumpClassifier,CvCARTClassifier和CvCARTHaarClassifier这三个结构体老是搞混,索性自己整理一下,一个是方便自己复习,另一个是回馈csdn,方便大家,欢迎广大网友拍砖。
1 结构体CvStumpClassifier
typedef struct CvStumpClassifier
{
CV_CLASSIFIER_FIELDS()
int compidx; //这个弱分类器对应的特征编号。即这个弱分类器是第compidx特征产生的
float lerror; //阈值左边的不纯度,也可称为左边的错误率
float rerror; //阈值右边的不纯度 也可称为右边的错误率
float threshold; //阈值
float left; //当输入到当前弱分类器的特征值xi < threshold时,弱分类器返回left
float right; //当输入到当前弱分类器的特征值xi > threshold时,弱分类器返回right
} CvStumpClassifier;
CvStumpClassifier是最简单的树桩分类器的结构体,它没有叶子节点,只有一个node。
它的输出用浮点型变量left和right表示。
2 结构体CvCARTClassifier
typedef struct CvCARTClassifier
{
CV_CLASSIFIER_FIELDS()
int count; //弱分类器的个数
/* internal nodes (each array of <count>elements) */
int*compidx; //这个弱分类器对应的特征编号。即这个弱分类器是第compidx特征产生的
float*threshold; //阈值
int*left; // 非叶子节点的左子节点序号(叶子节点为负数,非叶子节点为正数)
int*right; // 非叶子节点的右子节点序号(叶子节点为负数,非叶子节点为正数)
/* leaves (array of<count>+1 elements) */
float*val; //输出,当特征值xi输入是在threshold[0]的左边,则输出val[0],否则输出val[1];
}CvCARTClassifier;
CvCARTClassifier
是分类回归树分类器的结构体,包含叶子节点,当然当count=1时,就相当于一个树桩分类器。如果count不等于1时,它就包含了很多子节点。指针变量left是指该分类回归树分类器的左边分支所连接的一个节点的idx,这个子节点可以是叶子节点,也可以是非叶子节点;同理,对于指针变量right也是如此。它的输出用float型指针变量val表示,val[0]表示左节点的值,val[1]表示右边节点的输出值。注意CvCARTClassifier与CvStumpClassifier的区别。3 结构体CvCARTHaarClassifier
typedef struct CvCARTHaarClassifier
{
CV_INT_HAAR_CLASSIFIER_FIELDS()
int count; //包含弱分类器的个数
int* compidx; //这个弱分类器对应的特征编号。即这个弱分类器是第compidx特征产生的
CvTHaarFeature* feature; //弱分类器对应的特征的特征坐标
CvFastHaarFeature* fastfeature;//弱分类器对应的特征的特征坐标
float* threshold; //该弱分类器的阈值
int* left; //同上
int* right;
float* val;
} CvCARTHaarClassifier;
CvTHaarFeature和CvFastHaarFeature的区别请参考我的另外一篇文章,http://blog.csdn.net/ding977921830/article/details/46125097。
CvCARTHaarClassifier是分类回归树haar分类器的结构体,它的特征肯定是haar特征,而且是分类回归树分类器。它的输出和左右子节点与CvCARTClassifier
相同。
4 CvStumpClassifier,CvCARTClassifier和CvCARTHaarClassifier的区别
从复杂程度来看:
CvStumpClassifier<CvCARTClassifier<CvCARTHaarClassifier
从能代表的范围来看:
CvStumpClassifier>CvCARTClassifier>CvCARTHaarClassifier
CvCARTClassifier由count个CvCARTNode组成,每个CvCARTNode有一个CvStumpClassifier。CvCARTNode请参考我的另一篇博文http://blog.csdn.net/ding977921830/article/details/46530343