icvSplitIndicesCallback源码详细分析

来源:互联网 发布:单片机考试题库 编辑:程序博客网 时间:2024/09/21 06:19


下面这是我根据自己的理解来注释的,如有不对的地方请大家多多指出。本博原创,如需转载,请注明http://blog.csdn.net/ding977921830?viewmode=contents。

/* *icvSplitIndicesCallback *作用:根据阈值为样本序列分类 */staticvoid 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乘积的样本序号放入右边的矩阵            }        }    }}


1 0
原创粉丝点击