跟进CvCascadeClassifier::train函数的代码,该函数里面包含了分类器训练的完整流程,已经在重要的位置做了注释,带有括号编号的(X)为重要步骤,后面将逐一详细解析。这里我们主要是对整体流程进行把握,不必深入细节。
bool CvCascadeClassifier::train( const string _cascadeDirName,
const string _posFilename,
const string _negFilename,
int _numPos, int _numNeg,
int _precalcValBufSize, int _precalcIdxBufSize,
int _numStages,
const CvCascadeParams& _cascadeParams,
const CvFeatureParams& _featureParams,
const CvCascadeBoostParams& _stageParams,
bool baseFormatSave )
{
// Start recording clock ticks for training time output
const clock_t begin_time = clock();
if( _cascadeDirName.empty() || _posFilename.empty() || _negFilename.empty() )
CV_Error( CV_StsBadArg, "_cascadeDirName or _bgfileName or _vecFileName is NULL" );
// 训练中间数据和最终分类器文件存放的目录
string dirName;
if (_cascadeDirName.find_last_of("/\\") == (_cascadeDirName.length() - 1) )
dirName = _cascadeDirName;
else
dirName = _cascadeDirName + '/';
// 训练弱分类器使用的正负样本的数目
numPos = _numPos;
numNeg = _numNeg;
// 训练的层级数,也就是强分类器数目
numStages = _numStages;
// (1)创建图片读取器,设置正样本vec文件路径,从中读取正样本图片;负样本图片的文件名列表&