Commit e7f491ae authored by Kirill Kornyakov's avatar Kirill Kornyakov

CascadeClassifier refactored. Most of the members and methods are private now.

parent e7cf541f
...@@ -278,6 +278,7 @@ class CV_EXPORTS FeatureEvaluator ...@@ -278,6 +278,7 @@ class CV_EXPORTS FeatureEvaluator
public: public:
enum { HAAR = 0, LBP = 1 }; enum { HAAR = 0, LBP = 1 };
virtual ~FeatureEvaluator(); virtual ~FeatureEvaluator();
virtual bool read(const FileNode& node); virtual bool read(const FileNode& node);
virtual Ptr<FeatureEvaluator> clone() const; virtual Ptr<FeatureEvaluator> clone() const;
virtual int getFeatureType() const; virtual int getFeatureType() const;
...@@ -296,6 +297,55 @@ template<> CV_EXPORTS void Ptr<CvHaarClassifierCascade>::delete_obj(); ...@@ -296,6 +297,55 @@ template<> CV_EXPORTS void Ptr<CvHaarClassifierCascade>::delete_obj();
class CV_EXPORTS_W CascadeClassifier class CV_EXPORTS_W CascadeClassifier
{ {
public: public:
CV_WRAP CascadeClassifier();
CV_WRAP CascadeClassifier( const string& filename );
virtual ~CascadeClassifier();
CV_WRAP virtual bool empty() const;
CV_WRAP bool load( const string& filename );
bool read( const FileNode& node );
CV_WRAP void detectMultiScale( const Mat& image,
CV_OUT vector<Rect>& objects,
double scaleFactor=1.1,
int minNeighbors=3, int flags=0,
Size minSize=Size(),
Size maxSize=Size() );
bool isOldFormatCascade() const;
virtual Size getOriginalWindowSize() const;
int getFeatureType() const;
bool setImage(const Mat&);
protected:
virtual bool detectSingleScale( const Mat& image, int stripCount, Size processingRectSize,
int stripSize, int yStep, double factor, vector<Rect>& candidates );
private:
enum { BOOST = 0 };
enum { DO_CANNY_PRUNING = 1, SCALE_IMAGE = 2,
FIND_BIGGEST_OBJECT = 4, DO_ROUGH_SEARCH = 8 };
friend class CascadeClassifierInvoker;
template<class FEval>
friend int predictOrdered( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator);
template<class FEval>
friend int predictCategorical( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator);
template<class FEval>
friend int predictOrderedStump( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator);
template<class FEval>
friend int predictCategoricalStump( CascadeClassifier& cascade, Ptr<FeatureEvaluator> &featureEvaluator);
bool setImage( Ptr<FeatureEvaluator>&, const Mat& );
int runAt( Ptr<FeatureEvaluator>&, Point );
class Data
{
public:
struct CV_EXPORTS DTreeNode struct CV_EXPORTS DTreeNode
{ {
int featureIdx; int featureIdx;
...@@ -316,26 +366,7 @@ public: ...@@ -316,26 +366,7 @@ public:
float threshold; float threshold;
}; };
enum { BOOST = 0 }; bool read(const FileNode &node);
enum { DO_CANNY_PRUNING = 1, SCALE_IMAGE = 2,
FIND_BIGGEST_OBJECT = 4, DO_ROUGH_SEARCH = 8 };
CV_WRAP CascadeClassifier();
CV_WRAP CascadeClassifier(const string& filename);
~CascadeClassifier();
CV_WRAP bool empty() const;
CV_WRAP bool load(const string& filename);
bool read(const FileNode& node);
CV_WRAP void detectMultiScale( const Mat& image,
CV_OUT vector<Rect>& objects,
double scaleFactor=1.1,
int minNeighbors=3, int flags=0,
Size minSize=Size(),
Size maxSize=Size());
bool setImage( Ptr<FeatureEvaluator>&, const Mat& );
int runAt( Ptr<FeatureEvaluator>&, Point );
bool isStumpBased; bool isStumpBased;
...@@ -349,12 +380,13 @@ public: ...@@ -349,12 +380,13 @@ public:
vector<DTreeNode> nodes; vector<DTreeNode> nodes;
vector<float> leaves; vector<float> leaves;
vector<int> subsets; vector<int> subsets;
};
Ptr<FeatureEvaluator> feval; Data data;
Ptr<FeatureEvaluator> featureEvaluator;
Ptr<CvHaarClassifierCascade> oldCascade; Ptr<CvHaarClassifierCascade> oldCascade;
}; };
//////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector ////////////// //////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector //////////////
struct CV_EXPORTS_W HOGDescriptor struct CV_EXPORTS_W HOGDescriptor
......
This diff is collapsed.
...@@ -474,9 +474,9 @@ float CvCascadeBoostTrainData::getVarValue( int vi, int si ) ...@@ -474,9 +474,9 @@ float CvCascadeBoostTrainData::getVarValue( int vi, int si )
struct FeatureIdxOnlyPrecalc struct FeatureIdxOnlyPrecalc
{ {
FeatureIdxOnlyPrecalc( const CvFeatureEvaluator* _feval, CvMat* _buf, int _sample_count, bool _is_buf_16u ) FeatureIdxOnlyPrecalc( const CvFeatureEvaluator* _featureEvaluator, CvMat* _buf, int _sample_count, bool _is_buf_16u )
{ {
feval = _feval; featureEvaluator = _featureEvaluator;
sample_count = _sample_count; sample_count = _sample_count;
udst = (unsigned short*)_buf->data.s; udst = (unsigned short*)_buf->data.s;
idst = _buf->data.i; idst = _buf->data.i;
...@@ -490,7 +490,7 @@ struct FeatureIdxOnlyPrecalc ...@@ -490,7 +490,7 @@ struct FeatureIdxOnlyPrecalc
{ {
for( int si = 0; si < sample_count; si++ ) for( int si = 0; si < sample_count; si++ )
{ {
valCachePtr[si] = (*feval)( fi, si ); valCachePtr[si] = (*featureEvaluator)( fi, si );
if ( is_buf_16u ) if ( is_buf_16u )
*(udst + fi*sample_count + si) = (unsigned short)si; *(udst + fi*sample_count + si) = (unsigned short)si;
else else
...@@ -502,7 +502,7 @@ struct FeatureIdxOnlyPrecalc ...@@ -502,7 +502,7 @@ struct FeatureIdxOnlyPrecalc
icvSortIntAux( idst + fi*sample_count, sample_count, valCachePtr ); icvSortIntAux( idst + fi*sample_count, sample_count, valCachePtr );
} }
} }
const CvFeatureEvaluator* feval; const CvFeatureEvaluator* featureEvaluator;
int sample_count; int sample_count;
int* idst; int* idst;
unsigned short* udst; unsigned short* udst;
...@@ -511,9 +511,9 @@ struct FeatureIdxOnlyPrecalc ...@@ -511,9 +511,9 @@ struct FeatureIdxOnlyPrecalc
struct FeatureValAndIdxPrecalc struct FeatureValAndIdxPrecalc
{ {
FeatureValAndIdxPrecalc( const CvFeatureEvaluator* _feval, CvMat* _buf, Mat* _valCache, int _sample_count, bool _is_buf_16u ) FeatureValAndIdxPrecalc( const CvFeatureEvaluator* _featureEvaluator, CvMat* _buf, Mat* _valCache, int _sample_count, bool _is_buf_16u )
{ {
feval = _feval; featureEvaluator = _featureEvaluator;
valCache = _valCache; valCache = _valCache;
sample_count = _sample_count; sample_count = _sample_count;
udst = (unsigned short*)_buf->data.s; udst = (unsigned short*)_buf->data.s;
...@@ -526,7 +526,7 @@ struct FeatureValAndIdxPrecalc ...@@ -526,7 +526,7 @@ struct FeatureValAndIdxPrecalc
{ {
for( int si = 0; si < sample_count; si++ ) for( int si = 0; si < sample_count; si++ )
{ {
valCache->at<float>(fi,si) = (*feval)( fi, si ); valCache->at<float>(fi,si) = (*featureEvaluator)( fi, si );
if ( is_buf_16u ) if ( is_buf_16u )
*(udst + fi*sample_count + si) = (unsigned short)si; *(udst + fi*sample_count + si) = (unsigned short)si;
else else
...@@ -538,7 +538,7 @@ struct FeatureValAndIdxPrecalc ...@@ -538,7 +538,7 @@ struct FeatureValAndIdxPrecalc
icvSortIntAux( idst + fi*sample_count, sample_count, valCache->ptr<float>(fi) ); icvSortIntAux( idst + fi*sample_count, sample_count, valCache->ptr<float>(fi) );
} }
} }
const CvFeatureEvaluator* feval; const CvFeatureEvaluator* featureEvaluator;
Mat* valCache; Mat* valCache;
int sample_count; int sample_count;
int* idst; int* idst;
...@@ -548,9 +548,9 @@ struct FeatureValAndIdxPrecalc ...@@ -548,9 +548,9 @@ struct FeatureValAndIdxPrecalc
struct FeatureValOnlyPrecalc struct FeatureValOnlyPrecalc
{ {
FeatureValOnlyPrecalc( const CvFeatureEvaluator* _feval, Mat* _valCache, int _sample_count ) FeatureValOnlyPrecalc( const CvFeatureEvaluator* _featureEvaluator, Mat* _valCache, int _sample_count )
{ {
feval = _feval; featureEvaluator = _featureEvaluator;
valCache = _valCache; valCache = _valCache;
sample_count = _sample_count; sample_count = _sample_count;
} }
...@@ -558,9 +558,9 @@ struct FeatureValOnlyPrecalc ...@@ -558,9 +558,9 @@ struct FeatureValOnlyPrecalc
{ {
for ( int fi = range.begin(); fi < range.end(); fi++) for ( int fi = range.begin(); fi < range.end(); fi++)
for( int si = 0; si < sample_count; si++ ) for( int si = 0; si < sample_count; si++ )
valCache->at<float>(fi,si) = (*feval)( fi, si ); valCache->at<float>(fi,si) = (*featureEvaluator)( fi, si );
} }
const CvFeatureEvaluator* feval; const CvFeatureEvaluator* featureEvaluator;
Mat* valCache; Mat* valCache;
int sample_count; int sample_count;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment