icvSplitIndicesCallback源码详细分析


下面这是我根据自己的理解来注释的,如有不对的地方请大家多多指出。本博原创,如需转载,请注明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乘积的样本序号放入右边的矩阵
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值