|
|
@ -159,10 +159,10 @@ bool CvCascadeClassifier::train( const string _cascadeDirName, |
|
|
|
cascadeParams = _cascadeParams; |
|
|
|
cascadeParams = _cascadeParams; |
|
|
|
featureParams = CvFeatureParams::create(cascadeParams.featureType); |
|
|
|
featureParams = CvFeatureParams::create(cascadeParams.featureType); |
|
|
|
featureParams->init(_featureParams); |
|
|
|
featureParams->init(_featureParams); |
|
|
|
stageParams = new CvCascadeBoostParams; |
|
|
|
stageParams = makePtr<CvCascadeBoostParams>(); |
|
|
|
*stageParams = _stageParams; |
|
|
|
*stageParams = _stageParams; |
|
|
|
featureEvaluator = CvFeatureEvaluator::create(cascadeParams.featureType); |
|
|
|
featureEvaluator = CvFeatureEvaluator::create(cascadeParams.featureType); |
|
|
|
featureEvaluator->init( (CvFeatureParams*)featureParams, numPos + numNeg, cascadeParams.winSize ); |
|
|
|
featureEvaluator->init( featureParams, numPos + numNeg, cascadeParams.winSize ); |
|
|
|
stageClassifiers.reserve( numStages ); |
|
|
|
stageClassifiers.reserve( numStages ); |
|
|
|
} |
|
|
|
} |
|
|
|
cout << "PARAMETERS:" << endl; |
|
|
|
cout << "PARAMETERS:" << endl; |
|
|
@ -206,10 +206,10 @@ bool CvCascadeClassifier::train( const string _cascadeDirName, |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
CvCascadeBoost* tempStage = new CvCascadeBoost; |
|
|
|
Ptr<CvCascadeBoost> tempStage = makePtr<CvCascadeBoost>(); |
|
|
|
bool isStageTrained = tempStage->train( (CvFeatureEvaluator*)featureEvaluator, |
|
|
|
bool isStageTrained = tempStage->train( featureEvaluator, |
|
|
|
curNumSamples, _precalcValBufSize, _precalcIdxBufSize, |
|
|
|
curNumSamples, _precalcValBufSize, _precalcIdxBufSize, |
|
|
|
*((CvCascadeBoostParams*)stageParams) ); |
|
|
|
*stageParams ); |
|
|
|
cout << "END>" << endl; |
|
|
|
cout << "END>" << endl; |
|
|
|
|
|
|
|
|
|
|
|
if(!isStageTrained) |
|
|
|
if(!isStageTrained) |
|
|
@ -325,7 +325,7 @@ void CvCascadeClassifier::writeParams( FileStorage &fs ) const |
|
|
|
|
|
|
|
|
|
|
|
void CvCascadeClassifier::writeFeatures( FileStorage &fs, const Mat& featureMap ) const |
|
|
|
void CvCascadeClassifier::writeFeatures( FileStorage &fs, const Mat& featureMap ) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
((CvFeatureEvaluator*)((Ptr<CvFeatureEvaluator>)featureEvaluator))->writeFeatures( fs, featureMap ); |
|
|
|
featureEvaluator->writeFeatures( fs, featureMap ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void CvCascadeClassifier::writeStages( FileStorage &fs, const Mat& featureMap ) const |
|
|
|
void CvCascadeClassifier::writeStages( FileStorage &fs, const Mat& featureMap ) const |
|
|
@ -339,7 +339,7 @@ void CvCascadeClassifier::writeStages( FileStorage &fs, const Mat& featureMap ) |
|
|
|
sprintf( cmnt, "stage %d", i ); |
|
|
|
sprintf( cmnt, "stage %d", i ); |
|
|
|
cvWriteComment( fs.fs, cmnt, 0 ); |
|
|
|
cvWriteComment( fs.fs, cmnt, 0 ); |
|
|
|
fs << "{"; |
|
|
|
fs << "{"; |
|
|
|
((CvCascadeBoost*)((Ptr<CvCascadeBoost>)*it))->write( fs, featureMap ); |
|
|
|
(*it)->write( fs, featureMap ); |
|
|
|
fs << "}"; |
|
|
|
fs << "}"; |
|
|
|
} |
|
|
|
} |
|
|
|
fs << "]"; |
|
|
|
fs << "]"; |
|
|
@ -350,7 +350,7 @@ bool CvCascadeClassifier::readParams( const FileNode &node ) |
|
|
|
if ( !node.isMap() || !cascadeParams.read( node ) ) |
|
|
|
if ( !node.isMap() || !cascadeParams.read( node ) ) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
stageParams = new CvCascadeBoostParams; |
|
|
|
stageParams = makePtr<CvCascadeBoostParams>(); |
|
|
|
FileNode rnode = node[CC_STAGE_PARAMS]; |
|
|
|
FileNode rnode = node[CC_STAGE_PARAMS]; |
|
|
|
if ( !stageParams->read( rnode ) ) |
|
|
|
if ( !stageParams->read( rnode ) ) |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -371,12 +371,9 @@ bool CvCascadeClassifier::readStages( const FileNode &node) |
|
|
|
FileNodeIterator it = rnode.begin(); |
|
|
|
FileNodeIterator it = rnode.begin(); |
|
|
|
for( int i = 0; i < min( (int)rnode.size(), numStages ); i++, it++ ) |
|
|
|
for( int i = 0; i < min( (int)rnode.size(), numStages ); i++, it++ ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CvCascadeBoost* tempStage = new CvCascadeBoost; |
|
|
|
Ptr<CvCascadeBoost> tempStage = makePtr<CvCascadeBoost>(); |
|
|
|
if ( !tempStage->read( *it, (CvFeatureEvaluator *)featureEvaluator, *((CvCascadeBoostParams*)stageParams) ) ) |
|
|
|
if ( !tempStage->read( *it, featureEvaluator, *stageParams) ) |
|
|
|
{ |
|
|
|
|
|
|
|
delete tempStage; |
|
|
|
|
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
stageClassifiers.push_back(tempStage); |
|
|
|
stageClassifiers.push_back(tempStage); |
|
|
|
} |
|
|
|
} |
|
|
|
return true; |
|
|
|
return true; |
|
|
@ -453,7 +450,7 @@ void CvCascadeClassifier::save( const string filename, bool baseFormat ) |
|
|
|
|
|
|
|
|
|
|
|
fs << "{"; |
|
|
|
fs << "{"; |
|
|
|
fs << ICV_HAAR_FEATURE_NAME << "{"; |
|
|
|
fs << ICV_HAAR_FEATURE_NAME << "{"; |
|
|
|
((CvHaarEvaluator*)((CvFeatureEvaluator*)featureEvaluator))->writeFeature( fs, tempNode->split->var_idx ); |
|
|
|
((CvHaarEvaluator*)featureEvaluator.get())->writeFeature( fs, tempNode->split->var_idx ); |
|
|
|
fs << "}"; |
|
|
|
fs << "}"; |
|
|
|
|
|
|
|
|
|
|
|
fs << ICV_HAAR_THRESHOLD_NAME << tempNode->split->ord.c; |
|
|
|
fs << ICV_HAAR_THRESHOLD_NAME << tempNode->split->ord.c; |
|
|
@ -499,7 +496,7 @@ bool CvCascadeClassifier::load( const string cascadeDirName ) |
|
|
|
if ( !readParams( node ) ) |
|
|
|
if ( !readParams( node ) ) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
featureEvaluator = CvFeatureEvaluator::create(cascadeParams.featureType); |
|
|
|
featureEvaluator = CvFeatureEvaluator::create(cascadeParams.featureType); |
|
|
|
featureEvaluator->init( ((CvFeatureParams*)featureParams), numPos + numNeg, cascadeParams.winSize ); |
|
|
|
featureEvaluator->init( featureParams, numPos + numNeg, cascadeParams.winSize ); |
|
|
|
fs.release(); |
|
|
|
fs.release(); |
|
|
|
|
|
|
|
|
|
|
|
char buf[10]; |
|
|
|
char buf[10]; |
|
|
@ -510,11 +507,10 @@ bool CvCascadeClassifier::load( const string cascadeDirName ) |
|
|
|
node = fs.getFirstTopLevelNode(); |
|
|
|
node = fs.getFirstTopLevelNode(); |
|
|
|
if ( !fs.isOpened() ) |
|
|
|
if ( !fs.isOpened() ) |
|
|
|
break; |
|
|
|
break; |
|
|
|
CvCascadeBoost *tempStage = new CvCascadeBoost; |
|
|
|
Ptr<CvCascadeBoost> tempStage = makePtr<CvCascadeBoost>(); |
|
|
|
|
|
|
|
|
|
|
|
if ( !tempStage->read( node, (CvFeatureEvaluator*)featureEvaluator, *((CvCascadeBoostParams*)stageParams )) ) |
|
|
|
if ( !tempStage->read( node, featureEvaluator, *stageParams )) |
|
|
|
{ |
|
|
|
{ |
|
|
|
delete tempStage; |
|
|
|
|
|
|
|
fs.release(); |
|
|
|
fs.release(); |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -531,7 +527,7 @@ void CvCascadeClassifier::getUsedFeaturesIdxMap( Mat& featureMap ) |
|
|
|
|
|
|
|
|
|
|
|
for( vector< Ptr<CvCascadeBoost> >::const_iterator it = stageClassifiers.begin(); |
|
|
|
for( vector< Ptr<CvCascadeBoost> >::const_iterator it = stageClassifiers.begin(); |
|
|
|
it != stageClassifiers.end(); it++ ) |
|
|
|
it != stageClassifiers.end(); it++ ) |
|
|
|
((CvCascadeBoost*)((Ptr<CvCascadeBoost>)(*it)))->markUsedFeaturesInMap( featureMap ); |
|
|
|
(*it)->markUsedFeaturesInMap( featureMap ); |
|
|
|
|
|
|
|
|
|
|
|
for( int fi = 0, idx = 0; fi < varCount; fi++ ) |
|
|
|
for( int fi = 0, idx = 0; fi < varCount; fi++ ) |
|
|
|
if ( featureMap.at<int>(0, fi) >= 0 ) |
|
|
|
if ( featureMap.at<int>(0, fi) >= 0 ) |
|
|
|