下面这是我根据自己的理解来注释的,如有不对的地方请大家多多指出。本博原创,如需转载,请注明http://blog.csdn.net/ding977921830?viewmode=contents。
/*
*icvSplitIndicesCallback
*作用:根据阈值为样本序列分类
*/
static
void icvSplitIndicesCallback( int compidx, //快速haar特征的序号
float threshold, //分裂阈值
CvMat* idx, //存放样本的序号矩阵
CvMat** left, //存放小于阈值*normfactor乘积的样本序号
CvMat** right, //存放小于阈值*normfactor乘积的样本序号
void* userdata ) //存放训练样本数据和特征数据
{
CvHaarTrainingData* data; //存放userdata的训练样本数据
CvIntHaarFeatures* haar_features; //存放userdata的特征数据
int i;
int m;
CvFastHaarFeature* fastfeature;
data = ((CvUserdata*) userdata)->trainingData;
haar_features = ((CvUserdata*) userdata)->haarFeatures;
fastfeature = &haar_features->fastfeature[compidx];
m = data->sum.rows; //根据积分图的行来确定训练样本的数量,因为在积分图中一个样本占一行
*left = cvCreateMat( 1, m, CV_32FC1 );
*right = cvCreateMat( 1, m, CV_32FC1 );
(*left)->cols = (*right)->cols = 0;
if( idx == NULL )
{
for( i = 0; i < m; i++ ) //遍历所有训练样本
{
if( cvEvalFastHaarFeature( fastfeature, //通过调用cvEvalFastHaarFeature来计算快速haar特征值,并将该值与阈值*normfactor的乘积相比较
(sum_type*) (data->sum.data.ptr + i * data->sum.step),
(sum_type*) (data->tilted.data.ptr + i * data->tilted.step) )
< threshold * data->normfactor.data.fl[i] )
{
(*left)->data.fl[(*left)->cols++] = (float) i; //当小于时,将第i个样本的序号按顺序存放入左边的矩阵
}
else
{
(*right)->data.fl[(*right)->cols++] = (float) i; //当大于时,将第i个样本的序号按顺序存放入右边的矩阵
}
}
}
else
{
uchar* idxdata;
int idxnum;
size_t idxstep;
int index;
idxdata = idx->data.ptr;
idxnum = (idx->rows == 1) ? idx->cols : idx->rows;
idxstep = (idx->rows == 1) ? CV_ELEM_SIZE( idx->type ) : idx->step;
for( i = 0; i < idxnum; i++ )
{
index = (int) *((float*) (idxdata + i * idxstep));
/*与上面不同的是这里需要求一下idx,因为在idx中的样本序列并不一定是和sum中的序列一致,为了针对某个
训练样本来使用下面的积分图,必须首先确定这个训练样本的序号*/
if( cvEvalFastHaarFeature( fastfeature,
(sum_type*) (data->sum.data.ptr + index * data->sum.step),
(sum_type*) (data->tilted.data.ptr + index * data->tilted.step) )
< threshold * data->normfactor.data.fl[index] )
{
(*left)->data.fl[(*left)->cols++] = (float) index; //将小于阈值*normfactor乘积的样本序号放入左边的矩阵
}
else
{
(*right)->data.fl[(*right)->cols++] = (float) index; //将大于阈值*normfactor乘积的样本序号放入右边的矩阵
}
}
}
}