icvGetUsedValues的详细解析


本内容的源码在opencv开源源码的........\opencv\sources\apps\haartraining\cvhaartraining.cpp文件中,具体内容如下:

/*
 *icvGetUsedValues
 *作用:根据级分类器来计算训练样本的特征值
 */
static CvMat* icvGetUsedValues( CvHaarTrainingData* training_data,//全部训练数据,包含积分图,旋转积分图等信息
                                int start, int num,               //需要计算从第start开始的共num个训练样本的特征值               
                                CvIntHaarFeatures* haar_features, //所有的内部haar特征
                                CvStageHaarClassifier* stage )    //级分类器
{
    CvMat* ptr = NULL;
    CvMat* feature_idx = NULL;

    CV_FUNCNAME( "icvGetUsedValues" );

    __BEGIN__;

    int num_splits;
    int i, j;
    int r;
    int total, last;

    num_splits = icvNumSplits( stage );    //得到级分类器中分类回归树分类器的数量

    CV_CALL( feature_idx = cvCreateMat( 1, num_splits, CV_32SC1 ) );

    total = 0;
    for( i = 0; i < stage->count; i++ )   //遍历级分类器中的分类回归树分类器
    {
        CvCARTHaarClassifier* cart;

        cart = (CvCARTHaarClassifier*) stage->classifier[i];
        for( j = 0; j < cart->count; j++ )//遍历每个分类回归树中的节点
        {
            feature_idx->data.i[total++] = cart->compidx[j];//把强分类器中每个分类回归树分类器中的所有节点的特征的序号存储到features_idx中
        }
    }
    icvSort_32s( feature_idx->data.i, total, 0 );//把所有特征的序号进行排序

    last = 0;
    for( i = 1; i < total; i++ )
    {
        if( feature_idx->data.i[i] != feature_idx->data.i[last] )
        {
            feature_idx->data.i[++last] = feature_idx->data.i[i];   //把有重复的特征剔除掉
        }
    }
    total = last + 1;       //剔除掉重复特征后特征的总数量
    CV_CALL( ptr = cvCreateMat( num, total, CV_32FC1 ) );


    #ifdef CV_OPENMP
    #pragma omp parallel for
    #endif
    for( r = start; r < start + num; r++ )
    {
        int c;

        for( c = 0; c < total; c++ )
        {
            float val, normfactor;
            int fnum;

            fnum = feature_idx->data.i[c];    //取特征的序号

            val = cvEvalFastHaarFeature( haar_features->fastfeature + fnum,
                (sum_type*) (training_data->sum.data.ptr
                        + r * training_data->sum.step),
                (sum_type*) (training_data->tilted.data.ptr
                        + r * training_data->tilted.step) ); //根据haar特征的序号,积分图和旋转积分图来计算快速haar特征值
            normfactor = training_data->normfactor.data.fl[r];
            val = ( normfactor == 0.0F ) ? 0.0F : (val / normfactor);//特征值的归一化
            CV_MAT_ELEM( *ptr, float, r - start, c ) = val;  //将归一化的特征值存储在ptr中
        }
    }

    __END__;

    cvReleaseMat( &feature_idx );

    return ptr;        //返回最后结果
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值