adaboost训练弱分类器的原理见上一个博客::http://blog.csdn.net/lanxuecc/article/details/52681525
opencv中adaboost训练弱分类器的主体代码是函数cvCreateCARTClassifier,这个函数通过大致逻辑是:
1、通过调用训练结点函数cvCreateMTStumpClassifier来创建根结点
2、在要求弱分类器特征不只一个的情况下,通过分裂结点来增加新的特征形成CART树的弱分类器。
源码及注释如下
CV_BOOST_IMPL
CvClassifier* cvCreateCARTClassifier( CvMat* trainData, //预计算的训练样本每个特征的值矩阵
int flags, //1表示样本按行排列,0表示样本按行排列
CvMat* trainClasses, //训练样本类别向量,如果是正样本标识为1,负样本标识为-1
CvMat* typeMask, //为了便于回调函数而统一格式的变量
CvMat* missedMeasurementsMask, //同上
CvMat* compIdx, //特征序列向量
CvMat* sampleIdx, //样本序列向量
CvMat* weights, //样本权值向量
CvClassifierTrainParams* trainParams ) //传入一些弱分类器所需的参数比如需要几个特征,和一些需用的分类函数指针
{
CvCARTClassifier* cart = NULL;//CART树状弱分类器
size_t datasize = 0;
int count = 0; // CART中的节点数目
int i = 0;
int j = 0;
CvCARTNode* intnode = NULL; // CART节点
CvCARTNode* list = NULL; // 候选节点链表
int listcount = 0; // 候选节点个数
CvMat* lidx = NULL; // 左子节点样本序列
CvMat* ridx = NULL; // 右子节点样本序列
float maxerrdrop = 0.0F;
int idx = 0;
//定义节点分裂函数指针 这个函数指针指向的是函数icvSplitIndicesCallback
void (*splitIdxCallback)( int compidx, float threshold,
CvMat* idx, CvMat** left, CvMat** right,
<