From: Maria Dimashova Date: Thu, 12 Jul 2012 12:32:54 +0000 (+0000) Subject: fixed #2165 X-Git-Tag: accepted/2.0/20130307.220821~364^2~367 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=69296c33335acf8de5c7e4a50a53d383370c0f98;p=profile%2Fivi%2Fopencv.git fixed #2165 --- diff --git a/apps/traincascade/boost.cpp b/apps/traincascade/boost.cpp index 18165fd..3e17b5d 100644 --- a/apps/traincascade/boost.cpp +++ b/apps/traincascade/boost.cpp @@ -1257,6 +1257,7 @@ bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _precalcValBufSize, int _precalcIdxBufSize, const CvCascadeBoostParams& _params ) { + bool isTrained = false; CV_Assert( !data ); clear(); data = new CvCascadeBoostTrainData( _featureEvaluator, _numSamples, @@ -1291,9 +1292,16 @@ bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, } while( !isErrDesired() && (weak->total < params.weak_count) ); - data->is_classifier = true; - data->free_train_data(); - return true; + if(weak->total > 0) + { + data->is_classifier = true; + data->free_train_data(); + isTrained = true; + } + else + clear(); + + return isTrained; } float CvCascadeBoost::predict( int sampleIdx, bool returnSum ) const diff --git a/apps/traincascade/cascadeclassifier.cpp b/apps/traincascade/cascadeclassifier.cpp index ef6d181..00674ff 100644 --- a/apps/traincascade/cascadeclassifier.cpp +++ b/apps/traincascade/cascadeclassifier.cpp @@ -208,45 +208,55 @@ bool CvCascadeClassifier::train( const String _cascadeDirName, } CvCascadeBoost* tempStage = new CvCascadeBoost; - tempStage->train( (CvFeatureEvaluator*)featureEvaluator, - curNumSamples, _precalcValBufSize, _precalcIdxBufSize, - *((CvCascadeBoostParams*)stageParams) ); - stageClassifiers.push_back( tempStage ); - + bool isStageTrained = tempStage->train( (CvFeatureEvaluator*)featureEvaluator, + curNumSamples, _precalcValBufSize, _precalcIdxBufSize, + *((CvCascadeBoostParams*)stageParams) ); cout << "END>" << endl; + if(!isStageTrained) + break; + + stageClassifiers.push_back( tempStage ); + // save params - String filename; - if ( i == 0) + if( i == 0) { - filename = dirName + CC_PARAMS_FILENAME; - FileStorage fs( filename, FileStorage::WRITE); + std::string paramsFilename = dirName + CC_PARAMS_FILENAME; + FileStorage fs( paramsFilename, FileStorage::WRITE); if ( !fs.isOpened() ) { - cout << "Parameters can not be written, because file " << filename + cout << "Parameters can not be written, because file " << paramsFilename << " can not be opened." << endl; return false; } - fs << FileStorage::getDefaultObjectName(filename) << "{"; + fs << FileStorage::getDefaultObjectName(paramsFilename) << "{"; writeParams( fs ); fs << "}"; } // save current stage char buf[10]; sprintf(buf, "%s%d", "stage", i ); - filename = dirName + buf + ".xml"; - FileStorage fs( filename, FileStorage::WRITE ); + string stageFilename = dirName + buf + ".xml"; + FileStorage fs( stageFilename, FileStorage::WRITE ); if ( !fs.isOpened() ) { - cout << "Current stage can not be written, because file " << filename + cout << "Current stage can not be written, because file " << stageFilename << " can not be opened." << endl; return false; } - fs << FileStorage::getDefaultObjectName(filename) << "{"; + fs << FileStorage::getDefaultObjectName(stageFilename) << "{"; tempStage->write( fs, Mat() ); fs << "}"; } + + if(stageClassifiers.size() == 0) + { + cout << "Cascade classifier can't be trained. Check the used training parameters." << endl; + return false; + } + save( dirName + CC_CASCADE_FILENAME, baseFormatSave ); + return true; }