在介绍icvInitCARTHaarClassifier以前有必要先介绍一下它括号里面的三个参数,CvCARTHaarClassifier,CvCARTClassifier和CvIntHaarFeatures。详情请参考我的另外两篇博文。CvIntHaarFeatures和CvCARTClassifier和CvCARTHaarClassifier。
1 CvCARTHaarClassifier,CvCARTClassifier和CvIntHaarFeatures
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;
<pre name="code" class="cpp"> 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;
<pre name="code" class="cpp"> typedef struct CvIntHaarFeatures
{
CvSize winsize; //采特征的窗口的大小,即样本图像的大小。
int count; //总特征的个数。
CvTHaarFeature* feature; //指向所有的Haar特征。
CvFastHaarFeature* fastfeature;
} CvIntHaarFeatures;
2 icvInitCARTHaarClassifier
有了上面对三个结构体的介绍,就容易看懂icvInitCARTHaarClassifier参数传递的含义了。
/*
*icvInitCARTHaarClassifier
*初始化分类回归树haar分类器函数
*作用:把括号里的参数进行传递,也就是把后两个参数都传递给第一个参数
*具体来说就是,首先把intHaarFeatures 的特征按照cart中compidx[i]的顺序传递给carthaar(包括haar特征和快速haar特征);
*然后,再把cart中的参数传递给carthaar。
*/
void icvInitCARTHaarClassifier( CvCARTHaarClassifier* carthaar,
CvCARTClassifier* cart,
CvIntHaarFeatures* intHaarFeatures )
{
int i;
for( i = 0; i < cart->count; i++ ) //对于一棵树(carthaar)的cart->count个节点进行初始化
{
carthaar->feature[i] = intHaarFeatures->feature[cart->compidx[i]]; //初始化carthaar的feature,即把intHaarFeatures的特征传递给carthaar
carthaar->fastfeature[i] = intHaarFeatures->fastfeature[cart->compidx[i]]; //初始化carthaar的fastfeature,即把intHaarFeatures的快速特征传递给carthaar
carthaar->threshold[i] = cart->threshold[i]; //初始化阈值,即把cart的阈值传递给carthaar
carthaar->left[i] = cart->left[i]; //初始化carthaar的左分支节点
carthaar->right[i] = cart->right[i]; //初始化carthaar的右分支节点
carthaar->val[i] = cart->val[i]; //初始化carthaar的输出值
carthaar->compidx[i] = cart->compidx[i];
}
carthaar->count = cart->count;
carthaar->val[cart->count] = cart->val[cart->count];
}