人脸检测源码解析——4、Haar特征集


        在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函数来生成特征集。

void CvFeatureEvaluator::init(constCvFeatureParams *_featureParams,
int_maxSampleCount, Size _winSize )
{
CV_Assert(_maxSampleCount > 0);
featureParams = (CvFeatureParams *)_featureParams;
winSize = _winSize;
numFeatures = 0;
cls.create( (int)_maxSampleCount, 1, CV_32FC1 );
generateFeatures();
}

        从CvHaarEvaluator调用过来,实际是调用它的generateFeatures函数,用来构造全部haar特征集。代码主体中有四层循环,外面两层遍历特征的起点位置,内两层遍历haar特征的大小,最里面根据mode值将对于的不同性质的haar特征加入features数组。

 

void CvHaarEvaluator::generateFeatures()
{
int mode = ((constCvHaarFeatureParams*)((CvFeatureParams*)featureParams))->mode;
int offset = winSize.width + 1;
for( int x = 0; x < winSize.width; x++ )
{
for( int y = 0; y < winSize.height; y++ )
{
for( int dx = 1; dx <= winSize.width; dx++ )
{
for( int dy = 1; dy <=winSize.height; dy++ )
{
// haar_x2
if ( (x+dx*2 <=winSize.width) && (y+dy <= winSize.height) )
{
features.push_back(Feature( offset, false,
x, y, dx*2, dy, -1,
x+dx, y, dx , dy, +2 ) );
}
// haar_y2
if ( (x+dx <=winSize.width) && (y+dy*2 <= winSize.height) )
{
features.push_back(Feature( offset, false,
x, y, dx, dy*2, -1,
x, y+dy, dx,dy, +2 ) );
}
// haar_x3
if ( (x+dx*3 <=winSize.width) && (y+dy <= winSize.height) )
{
features.push_back( Feature(offset, false,
x, y, dx*3, dy, -1,
x+dx, y, dx , dy, +3 ) );
}
// haar_y3
if ( (x+dx <= winSize.width)&& (y+dy*3 <= winSize.height) )
{
features.push_back(Feature( offset, false,
x, y, dx, dy*3, -1,
x, y+dy, dx,dy, +3 ) );
}
if( mode !=CvHaarFeatureParams::BASIC )
{
// haar_x4
if ( (x+dx*4 <=winSize.width) && (y+dy <= winSize.height) )
{
features.push_back( Feature( offset,false,
x, y, dx*4, dy, -1,
x+dx, y, dx*2,dy, +2 ) );
}
// haar_y4
if ( (x+dx <=winSize.width ) && (y+dy*4 <= winSize.height) )
{
features.push_back(Feature( offset, false,
x, y, dx, dy*4, -1,
x, y+dy, dx, dy*2,+2 ) );
}
}
// x2_y2
if ( (x+dx*2 <=winSize.width) && (y+dy*2 <= winSize.height) )
{
features.push_back(Feature( offset, false,
x, y, dx*2, dy*2, -1,
x, y, dx, dy, +2,
x+dx, y+dy,dx, dy, +2 ) );
}
if (mode !=CvHaarFeatureParams::BASIC)
{
if ( (x+dx*3 <=winSize.width) && (y+dy*3 <= winSize.height) )
{
features.push_back(Feature( offset, false,
x , y , dx*3, dy*3, -1,
x+dx, y+dy,dx , dy , +9) );
}
}
if (mode ==CvHaarFeatureParams::ALL)
{
// tilted haar_x2
if ( (x+2*dx<= winSize.width) && (y+2*dx+dy <= winSize.height) &&(x-dy>= 0) )
{
features.push_back(Feature( offset, true,
x, y, dx*2, dy,-1,
x, y, dx, dy, +2 ) );
}
// tilted haar_y2
if ( (x+dx <=winSize.width) && (y+dx+2*dy <= winSize.height) &&(x-2*dy>= 0) )
{
features.push_back(Feature( offset, true,
x, y, dx, 2*dy,-1,
x, y, dx,dy, +2 ) );
}
// tilted haar_x3
if ( (x+3*dx <= winSize.width)&& (y+3*dx+dy <= winSize.height) && (x-dy>= 0) )
{
features.push_back(Feature( offset, true,
x, y, dx*3, dy, -1,
x+dx, y+dx,dx, dy, +3 ) );
}
// tilted haar_y3
if ( (x+dx <=winSize.width) && (y+dx+3*dy <= winSize.height) &&(x-3*dy>= 0) )
{
features.push_back(Feature( offset, true,
x, y, dx, 3*dy, -1,
x-dy, y+dy, dx,dy, +3 ) );
}
// tilted haar_x4
if ( (x+4*dx <=winSize.width) && (y+4*dx+dy <= winSize.height) &&(x-dy>= 0) )
{
features.push_back(Feature( offset, true,
x, y, dx*4, dy, -1,
x+dx, y+dx,dx*2, dy, +2 ) );
}
// tilted haar_y4
if ( (x+dx <=winSize.width) && (y+dx+4*dy <= winSize.height) &&(x-4*dy>= 0) )
{
features.push_back(Feature( offset, true,
x, y, dx, 4*dy, -1,
x-dy, y+dy, dx,2*dy, +2 ) );
}
}
}
}
}
}
numFeatures = (int)features.size();
}

 




智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



猜您在找
人脸检测特征-haar特征 【人脸检测:Haar】计算Haar特征个数(一) 关于人脸检测中的Haar特征提取 基于haar特征的Adaboost人脸检测技术 Haar特征检测 - 人脸识别
智能推荐
 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告