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,65 +297,96 @@ template<> CV_EXPORTS void Ptr<CvHaarClassifierCascade>::delete_obj(); ...@@ -296,65 +297,96 @@ template<> CV_EXPORTS void Ptr<CvHaarClassifierCascade>::delete_obj();
class CV_EXPORTS_W CascadeClassifier class CV_EXPORTS_W CascadeClassifier
{ {
public: public:
struct CV_EXPORTS DTreeNode
{
int featureIdx;
float threshold; // for ordered features only
int left;
int right;
};
struct CV_EXPORTS DTree
{
int nodeCount;
};
struct CV_EXPORTS Stage
{
int first;
int ntrees;
float threshold;
};
enum { BOOST = 0 };
enum { DO_CANNY_PRUNING = 1, SCALE_IMAGE = 2,
FIND_BIGGEST_OBJECT = 4, DO_ROUGH_SEARCH = 8 };
CV_WRAP CascadeClassifier(); CV_WRAP CascadeClassifier();
CV_WRAP CascadeClassifier(const string& filename); CV_WRAP CascadeClassifier( const string& filename );
~CascadeClassifier(); virtual ~CascadeClassifier();
CV_WRAP bool empty() const; CV_WRAP virtual bool empty() const;
CV_WRAP bool load(const string& filename); CV_WRAP bool load( const string& filename );
bool read(const FileNode& node); bool read( const FileNode& node );
CV_WRAP void detectMultiScale( const Mat& image, CV_WRAP void detectMultiScale( const Mat& image,
CV_OUT vector<Rect>& objects, CV_OUT vector<Rect>& objects,
double scaleFactor=1.1, double scaleFactor=1.1,
int minNeighbors=3, int flags=0, int minNeighbors=3, int flags=0,
Size minSize=Size(), Size minSize=Size(),
Size maxSize=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& ); bool setImage( Ptr<FeatureEvaluator>&, const Mat& );
int runAt( Ptr<FeatureEvaluator>&, Point ); int runAt( Ptr<FeatureEvaluator>&, Point );
bool isStumpBased; class Data
{
int stageType; public:
int featureType; struct CV_EXPORTS DTreeNode
int ncategories; {
Size origWinSize; int featureIdx;
float threshold; // for ordered features only
vector<Stage> stages; int left;
vector<DTree> classifiers; int right;
vector<DTreeNode> nodes; };
vector<float> leaves;
vector<int> subsets; struct CV_EXPORTS DTree
{
int nodeCount;
};
struct CV_EXPORTS Stage
{
int first;
int ntrees;
float threshold;
};
bool read(const FileNode &node);
bool isStumpBased;
int stageType;
int featureType;
int ncategories;
Size origWinSize;
vector<Stage> stages;
vector<DTree> classifiers;
vector<DTreeNode> nodes;
vector<float> leaves;
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