在CvCascadeClassifier::train中的如下代码完成Haar特征集的初始化工作:
// (3)创建特征评估器CvHaarEvaluator
featureEvaluator= CvFeatureEvaluator::create(cascadeParams.featureType);
//CvHaarEvaluator 初始化,开辟内存,生成特征集
featureEvaluator->init((CvFeatureParams*)featureParams, numPos + numNeg, cascadeParams.winSize );
在将原理部分我们说到过haar特征,在W*H的图像区域内,每种形状的特征可以取不同的缩放比例,放在不同的位置。在来回顾一下Haar特征的形状。
因为我们设置featureType为Haar特征,这里实际创建的是CvHaarEvaluator对象,调用它的init函数,代码如下:
void CvHaarEvaluator::init(constCvFeatureParams *_featureParams,
int_maxSampleCount, Size _winSize )
{
CV_Assert(_maxSampleCount > 0);
int cols = (_winSize.width + 1) * (_winSize.height + 1);
sum.create((int)_maxSampleCount, cols, CV_32SC1);
tilted.create((int)_maxSampleCount, cols, CV_32SC1);
normfactor.create(1, (int)_maxSampleCount, CV_32FC1);
CvFeatureEvaluator::init( _featureParams, _maxSampleCount, _winSize );
}
最后一句调用了父类的init函数,里面创建了存放记录每个样本类别的数组cls,然后调用generateFeatures函数来