icvCreateHaarTrainingData源码详细分析
2015-07-13 21:09
423 查看
对于结构体CvHaarTrainingData的内容请参考我的另一篇博文/article/9786735.html。如需转载请注明/article/9786779.html。
/* * 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; }
相关文章推荐
- [LeetCode] Factorial Trailing Zeroes
- Project Euler:Problem 60 Prime pair sets
- LightOJ 1070 Algebraic Problem (推导+矩阵快速幂)
- OC 基础之----属性
- CPaintDC 、CWindowDC、 CClientDC、 CDC的区别与联系
- Swiper使用方法(向前和向后按钮在swiper-container外面)
- SonarQube安装完后出现SonarQube is under maintenance. Please check back later.
- LOJ 1070 - Algebraic Problem(矩阵快速幂啊)
- 【转载】Foxmail 小技巧 25则 (转载)
- POJ 3691 DNA repair 基于AC自己主动机DP
- 人工智能计算器AI Calculator 3.3.0 详细破解思路&教程
- 在rails中pluck和select和collect区别
- installation error: unknown failure
- copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理
- HD 1151Air Raid
- LightOJ 1070 - Algebraic Problem 矩阵快速幂
- ubuntu 下配置发送邮件(sendmail/msmtp+mtt)
- Kafka设计解析(三):Kafka High Availability (下)
- Kafka设计解析(二):Kafka High Availability (上)
- The Material Sourcing Process Failed To Create Picking Suggestions in INVTOTRX (文档 ID 2003806.1)