• icvPrecalculate




    /*
     *icvPrecalculate
     *作用:计算特征值,并排序
     *详细来说也就是依据训练样本信息和haar特征信息,在函数内部引用icvGetTrainingDataCallback来
     *分批计算正负样本的前numprecalated个haar特征值。并把计算好的特征值进行排序,最后结果存储在data->valcache之中
     */
    static
    void icvPrecalculate( CvHaarTrainingData* data,          //训练样本信息
                          CvIntHaarFeatures* haarFeatures,   //haar特征信息
                          int numprecalculated )             //估计算特征个数
    {
        CV_FUNCNAME( "icvPrecalculate" );
    
        __BEGIN__;
    
        icvReleaseHaarTrainingDataCache( &data );
    
        numprecalculated -= numprecalculated % CV_STUMP_TRAIN_PORTION;
        numprecalculated = MIN( numprecalculated, haarFeatures->count );
    
        if( numprecalculated > 0 )
        {
            //size_t datasize;
            int m;
            CvUserdata userdata;
    
            /* private variables */
            #ifdef CV_OPENMP
            CvMat t_data;
            CvMat t_idx;
            int first;
            int t_portion;
            int portion = CV_STUMP_TRAIN_PORTION;      //每批计算特征的数量
            #endif /* CV_OPENMP */
    
            m = data->sum.rows;                        //确定样本总数量。正负样本数之和
    
    #ifdef CV_COL_ARRANGEMENT
            CV_CALL( data->valcache = cvCreateMat( numprecalculated, m, CV_32FC1 ) );       //以下这三组代码是给data->valcache和data->idxcache分配内存
    #else
            CV_CALL( data->valcache = cvCreateMat( m, numprecalculated, CV_32FC1 ) );
    #endif
            CV_CALL( data->idxcache = cvCreateMat( numprecalculated, m, CV_IDX_MAT_TYPE ) );
    
            userdata = cvUserdata( data, haarFeatures );
    
            #ifdef CV_OPENMP
            #pragma omp parallel for private(t_data, t_idx, first, t_portion)
            for( first = 0; first < numprecalculated; first += portion )
            {
                t_data = *data->valcache;
                t_idx = *data->idxcache;
                t_portion = MIN( portion, (numprecalculated - first) );
    
                /* indices */
                t_idx.rows = t_portion;             //每批计算特征的个数
                t_idx.data.ptr = data->idxcache->data.ptr + first * ((size_t)t_idx.step);
    
                /* feature values */
    #ifdef CV_COL_ARRANGEMENT
                t_data.rows = t_portion;
                t_data.data.ptr = data->valcache->data.ptr +
                    first * ((size_t) t_data.step );
    #else
                t_data.cols = t_portion;
                t_data.data.ptr = data->valcache->data.ptr +
                    first * ((size_t) CV_ELEM_SIZE( t_data.type ));
    #endif
                icvGetTrainingDataCallback( &t_data, NULL, NULL, first, t_portion,
                                            &userdata );
    #ifdef CV_COL_ARRANGEMENT
                cvGetSortedIndices( &t_data, &t_idx, 0 );
    #else
                cvGetSortedIndices( &t_data, &t_idx, 1 );
    #endif
    
    #ifdef CV_VERBOSE
                putc( '.', stderr );
                fflush( stderr );
    #endif /* CV_VERBOSE */
    
            }
    
    #ifdef CV_VERBOSE
            fprintf( stderr, "
    " );
            fflush( stderr );
    #endif /* CV_VERBOSE */
    
            #else
            icvGetTrainingDataCallback( data->valcache, NULL, NULL, 0, numprecalculated,
                                        &userdata );                   //调用icvGetTrainingDataCallback函数计算特征值,把计算好的特征值存储在data->valcache中
    #ifdef CV_COL_ARRANGEMENT
            cvGetSortedIndices( data->valcache, data->idxcache, 0 );   //对计算好的特征值data->valcache进行排序。并存储在data->idxcache中
    #else
            cvGetSortedIndices( data->valcache, data->idxcache, 1 );
    #endif
            #endif /* CV_OPENMP */
        }
    
        __END__;
    }
    


  • 相关阅读:
    关于oracle小数和整数混合排序错误问题
    oracle 格式转换 <行转列列转行>
    Postgresql 配置文件详解
    Postgresql 同步流复制
    Postgresql 安装
    mongodb 复制集 维护小结
    mongodb 角色总结
    mongodb 安全认证
    SqlServer实时数据同步到mysql
    批量修改在索引中增加字段
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7055216.html
Copyright © 2020-2023  润新知