1 训练样本的代码CvHaarTrainingData
/* Prepared for training samples */
typedef struct CvHaarTrainingData
{
CvSize winsize; /* 训练图像的大小 */
int maxnum; /* 训练样本的总数目,maxnum=正样本总数+负样本总数 */
CvMat sum; /* 垂直积分图 */
CvMat tilted; /* 旋转积分图*/
CvMat normfactor; /* 标准化因子*/
CvMat cls; /*正负样本类别标记,如果classes=1.0 则是正样本,如果是 0.0 则是负样本图像 */
CvMat weights; /* 样本权重 */
CvMat* valcache; /* 样本的特征,一共有maxnum行 ,特征总数(CvIntHaarFeatures.count)个列*/
CvMat* idxcache; /* 对样本标号按特征值升序排序,一共有特征总数(CvIntHaarFeatures.count)个行,maxnum 个列*/
} CvHaarTrainigData;
训练样本的内容,为了方便,我归了一下类,包括三部分:图像,积分图,特征
1.1 图像
图像的内容有winsize,maxnum,weight和cls这四种因素。
1.2 积分图
积分图旋转和不旋转两种因素
1.3 特征
特征包含样本的特征以及对特征的排序这两种因素
注:这三种分类是我个人的分类,仅仅是为了研究的方便。
这里我再说两个重要参数:
1.4 valcache
valCache是设置在训练前有多少特征值被提前算出存放在内存中。内存模型如下:
1.5 idxCache
idxCache是valCache中每种特征按特征值从小到大排列的样本的序号。内存模型如下:
1.6 idxCache和valCache
注意,在valCache中的数据是float型的,idxCache中的数据是short型的,利用idxCache数组我们可以方便按特征值的从小到大遍历valCache,这样就节省了内存空间。内存大小是通过运行程序的命令行参数设置的。这样,确定了内存大小,就可以计算每次预计算的特征个数了,如下所示:
<span style="font-family:SimSun;font-size:14px;">//1MB == 1048576B 计算一个样本中有多少个特征能被pre计算放在内存中
numprecalculated = (int) ( ((size_t) mem) * ((size_t) 1048576) /
( ((size_t) (npos + nneg)) * (sizeof( float ) + sizeof( short )) ) );</span>
2 负样本代码CvBackgroundData
typedef struct CvBackgroundData
{
int count; <span style="font-family:SimSun;">//</span>负样本的总个数
char** filename; <span style="font-family:SimSun;">//</span>各个负样本的<span style="font-family:SimSun;">绝对路径</span>
int last;
int round;
CvSize winsize; <span style="font-family:SimSun;">//</span>负样本图像的大小。可以与正样本的大小不一样
} CvBackgroundData;
3 二者区别
CvHaarTrainingData所包含内容比较齐全,而且是既包含正样本,也包含负样本;CvBackgroundData显然是针对负样本的。
部分参考内容:
http://www.opencvchina.com/thread-132-1-1.html