icvCreateHaarTrainingData源码详细分析

对于结构体CvHaarTrainingData的内容请参考我的另一篇博文http://blog.csdn.net/ding977921830/article/details/46330879如需转载请注明http://blog.csdn.net/ding977921830/article/details/46799043

/*
 * icvCreateHaarTrainingData
 *功能:为训练样本分配内存,并且返回内存地址
 */
static
CvHaarTrainigData* icvCreateHaarTrainingData( CvSize winsize,      //图像大小
                                              int maxnumsamples )  //样本图像数量,包括正负样本之和
{
    CvHaarTrainigData* data;
    /* #define CV_FUNCNAME( Name )  /
    static char cvFuncName[] = Name 
	CV_FUNCNAME 定义变量 cvFuncName存放函数名,用于出错时可以报告出错的函数
	*/
    CV_FUNCNAME( "icvCreateHaarTrainingData" );
	/*
	__BEGIN__ 和__END__配套使用,当出现error时,EXIT cxerror.h 中
           #define __BEGIN__       {
           #define __END__         goto exit; exit: ; }
    对于代码中 __BEGIN__ 和__END__后面多加一个分号 的解释:
    因为 __BEGIN__;等价于{; ,其中分号(;)为一个空语句,是合理的,但不要也行.__END__也一样.
	*/
    __BEGIN__;

    data = NULL;
    uchar* ptr = NULL;
    size_t datasize = 0;
     /*size_t的全称应该是size type,就是说“一种用来记录大小的数据类型,因为size_t类型的数据其实是
       保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。*/

    datasize = sizeof( CvHaarTrainigData ) +
          /* sum and tilted */
        ( 2 * (winsize.width + 1) * (winsize.height + 1) * sizeof( sum_type ) +
          sizeof( float ) +      /* normfactor */
          sizeof( float ) +      /* cls */
          sizeof( float )        /* weight */
        ) * maxnumsamples;

    CV_CALL( data = (CvHaarTrainigData*) cvAlloc( datasize ) );
       /*
	*void *memset(void *s, int ch, size_t n);
        *函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
        *memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 
	*/
    memset( (void*)data, 0, datasize );//内存清零
    data->maxnum = maxnumsamples;      //包括下面几个都是参数传递
    data->winsize = winsize;
    ptr = (uchar*)(data + 1);
    data->sum = cvMat( maxnumsamples, (winsize.width + 1) * (winsize.height + 1),
                       CV_SUM_MAT_TYPE, (void*) ptr );//从这里可以看出对于总的积分图来说,每个训练样本图片的积分图占一行,一共是总样本数行
    ptr += sizeof( sum_type ) * maxnumsamples * (winsize.width+1) * (winsize.height+1);
    data->tilted = cvMat( maxnumsamples, (winsize.width + 1) * (winsize.height + 1),
                       CV_SUM_MAT_TYPE, (void*) ptr );
    ptr += sizeof( sum_type ) * maxnumsamples * (winsize.width+1) * (winsize.height+1);
    data->normfactor = cvMat( 1, maxnumsamples, CV_32FC1, (void*) ptr );
    ptr += sizeof( float ) * maxnumsamples;
    data->cls = cvMat( 1, maxnumsamples, CV_32FC1, (void*) ptr );
    ptr += sizeof( float ) * maxnumsamples;
    data->weights = cvMat( 1, maxnumsamples, CV_32FC1, (void*) ptr );

    data->valcache = NULL;
    data->idxcache = NULL;

    __END__;

    return data;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值