class CvCascadeImageReader { public: bool create( const String _posFilename, const String _negFilename, Size _winSize ); void restart() { posReader.restart(); } bool getNeg(Mat &_img) { return negReader.get( _img ); } bool getPos(Mat &_img) { return posReader.get( _img ); } //*** begin (prevent infinit loop) int getNegIndex() { size_t count = negReader.imgFilenames.size(); return negReader.round*count + negReader.last; } //*** end private: class PosReader { public: PosReader(); virtual ~PosReader(); bool create( const String _filename ); bool get( Mat &_img ); void restart(); short* vec; FILE* file; int count; int vecSize; int last; int base; } posReader; class NegReader { public: NegReader(); bool create( const String _filename, Size _winSize ); bool get( Mat& _img ); bool nextImg(); Mat src, img; vector imgFilenames; Point offset, point; float scale; float scaleFactor; float stepFactor; size_t last, round; Size winSize; } negReader; }; int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositive, int64& consumed ) { //*** begin (prevent infinit loop) int start_neg_index = imgReader.getNegIndex(); bool neg_updated = false; //*** end int getcount = 0; Mat img(cascadeParams.winSize, CV_8UC1); for( int i = first; i < first + count; i++ ) { // if(i%10==0) cout << i-first << "/" << count << "[" << imgReader.getNegCount() << "]" << endl; for( ; ; ) { //*** prevent infinite loop int neg_index = imgReader.getNegIndex(); if(neg_index!=start_neg_index) neg_updated = true; if(neg_updated && neg_index==start_neg_index) return getcount; //*** end bool isGetImg = isPositive ? imgReader.getPos( img ) : imgReader.getNeg( img ); if( !isGetImg ) return getcount; consumed++; featureEvaluator->setImage( img, isPositive ? 1 : 0, i ); if( predict( i ) == 1.0F ) { getcount++; break; } } } return getcount; }