2011-02-23 04:43:26 +08:00
Cascade Classification
======================
.. highlight :: cpp
.. index :: FeatureEvaluator
.. _FeatureEvaluator:
FeatureEvaluator
----------------
2011-03-01 05:26:43 +08:00
.. c:type :: FeatureEvaluator
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
Base class for computing feature values in cascade classifiers. ::
2011-02-23 04:43:26 +08:00
class CV_EXPORTS FeatureEvaluator
{
2011-02-26 19:05:10 +08:00
public:
enum { HAAR = 0, LBP = 1 }; // supported feature types
2011-02-23 04:43:26 +08:00
virtual ~FeatureEvaluator(); // destructor
virtual bool read(const FileNode& node);
virtual Ptr<FeatureEvaluator> clone() const;
virtual int getFeatureType() const;
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
virtual bool setImage(const Mat& img, Size origWinSize);
virtual bool setWindow(Point p);
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
virtual double calcOrd(int featureIdx) const;
virtual int calcCat(int featureIdx) const;
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
static Ptr<FeatureEvaluator> create(int type);
};
..
.. index :: FeatureEvaluator::read
2011-03-01 05:26:43 +08:00
FeatureEvaluator::read
2011-02-23 04:43:26 +08:00
--------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: bool FeatureEvaluator::read(const FileNode\& node)
2011-02-23 04:43:26 +08:00
Reads parameters of the features from a FileStorage node.
2011-02-26 19:05:10 +08:00
:param node: File node from which the feature parameters are read.
2011-02-23 04:43:26 +08:00
.. index :: FeatureEvaluator::clone
2011-03-01 05:26:43 +08:00
FeatureEvaluator::clone
2011-02-23 04:43:26 +08:00
---------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: Ptr<FeatureEvaluator> FeatureEvaluator::clone() const
2011-02-23 04:43:26 +08:00
Returns a full copy of the feature evaluator.
.. index :: FeatureEvaluator::getFeatureType
2011-03-01 05:26:43 +08:00
FeatureEvaluator::getFeatureType
2011-02-23 04:43:26 +08:00
------------------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: int FeatureEvaluator::getFeatureType() const
2011-02-23 04:43:26 +08:00
Returns the feature type (HAAR or LBP for now).
.. index :: FeatureEvaluator::setImage
2011-03-01 05:26:43 +08:00
FeatureEvaluator::setImage
2011-02-23 04:43:26 +08:00
------------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: bool FeatureEvaluator::setImage(const Mat\& img, Size origWinSize)
2011-02-23 04:43:26 +08:00
Sets the image in which to compute the features.
2011-02-26 19:05:10 +08:00
:param img: Matrix of type ``CV_8UC1`` containing the image in which to compute the features.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param origWinSize: Size of training images.
2011-02-23 04:43:26 +08:00
.. index :: FeatureEvaluator::setWindow
2011-03-01 05:26:43 +08:00
FeatureEvaluator::setWindow
2011-02-23 04:43:26 +08:00
-------------------------------
:func: `CascadeClassifier::runAt`
2011-03-01 05:26:43 +08:00
.. c:function :: bool FeatureEvaluator::setWindow(Point p)
2011-02-23 04:43:26 +08:00
Sets window in the current image in which the features will be computed (called by ).
2011-02-26 19:05:10 +08:00
:param p: The upper left point of window in which the features will be computed. Size of the window is equal to size of training images.
2011-02-23 04:43:26 +08:00
.. index :: FeatureEvaluator::calcOrd
2011-03-01 05:26:43 +08:00
FeatureEvaluator::calcOrd
2011-02-23 04:43:26 +08:00
-----------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: double FeatureEvaluator::calcOrd(int featureIdx) const
2011-02-23 04:43:26 +08:00
Computes value of an ordered (numerical) feature.
2011-02-26 19:05:10 +08:00
:param featureIdx: Index of feature whose value will be computed.
2011-02-23 04:43:26 +08:00
Returns computed value of ordered feature.
.. index :: FeatureEvaluator::calcCat
2011-03-01 05:26:43 +08:00
FeatureEvaluator::calcCat
2011-02-23 04:43:26 +08:00
-----------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: int FeatureEvaluator::calcCat(int featureIdx) const
2011-02-23 04:43:26 +08:00
Computes value of a categorical feature.
2011-02-26 19:05:10 +08:00
:param featureIdx: Index of feature whose value will be computed.
2011-02-23 04:43:26 +08:00
Returns computed label of categorical feature, i.e. value from [0,... (number of categories - 1)].
.. index :: FeatureEvaluator::create
2011-03-01 05:26:43 +08:00
FeatureEvaluator::create
2011-02-23 04:43:26 +08:00
----------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: static Ptr<FeatureEvaluator> FeatureEvaluator::create(int type)
2011-02-23 04:43:26 +08:00
Constructs feature evaluator.
2011-02-26 19:05:10 +08:00
:param type: Type of features evaluated by cascade (HAAR or LBP for now).
2011-02-23 04:43:26 +08:00
.. index :: CascadeClassifier
.. _CascadeClassifier:
CascadeClassifier
-----------------
2011-03-01 05:26:43 +08:00
.. c:type :: CascadeClassifier
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
The cascade classifier class for object detection. ::
2011-02-23 04:43:26 +08:00
class CascadeClassifier
{
public:
// structure for storing tree node
2011-02-26 19:05:10 +08:00
struct CV_EXPORTS DTreeNode
2011-02-23 04:43:26 +08:00
{
int featureIdx; // feature index on which is a split
float threshold; // split threshold of ordered features only
int left; // left child index in the tree nodes array
int right; // right child index in the tree nodes array
};
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
// structure for storing desision tree
2011-02-26 19:05:10 +08:00
struct CV_EXPORTS DTree
2011-02-23 04:43:26 +08:00
{
int nodeCount; // nodes count
};
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
// structure for storing cascade stage (BOOST only for now)
struct CV_EXPORTS Stage
{
int first; // first tree index in tree array
int ntrees; // number of trees
float threshold; // treshold of stage sum
};
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
enum { BOOST = 0 }; // supported stage types
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
// mode of detection (see parameter flags in function HaarDetectObjects)
enum { DO_CANNY_PRUNING = CV_HAAR_DO_CANNY_PRUNING,
SCALE_IMAGE = CV_HAAR_SCALE_IMAGE,
FIND_BIGGEST_OBJECT = CV_HAAR_FIND_BIGGEST_OBJECT,
2011-02-26 19:05:10 +08:00
DO_ROUGH_SEARCH = CV_HAAR_DO_ROUGH_SEARCH };
2011-02-23 04:43:26 +08:00
CascadeClassifier(); // default constructor
CascadeClassifier(const string& filename);
~CascadeClassifier(); // destructor
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
bool empty() const;
bool load(const string& filename);
bool read(const FileNode& node);
2011-02-26 19:05:10 +08:00
void detectMultiScale( const Mat& image, vector<Rect>& objects,
double scaleFactor=1.1, int minNeighbors=3,
2011-02-23 04:43:26 +08:00
int flags=0, Size minSize=Size());
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
bool setImage( Ptr<FeatureEvaluator>&, const Mat& );
int runAt( Ptr<FeatureEvaluator>&, Point );
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
bool is_stump_based; // true, if the trees are stumps
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
int stageType; // stage type (BOOST only for now)
int featureType; // feature type (HAAR or LBP for now)
2011-02-26 19:05:10 +08:00
int ncategories; // number of categories (for categorical features only)
2011-02-23 04:43:26 +08:00
Size origWinSize; // size of training images
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
vector<Stage> stages; // vector of stages (BOOST for now)
vector<DTree> classifiers; // vector of decision trees
vector<DTreeNode> nodes; // vector of tree nodes
vector<float> leaves; // vector of leaf values
vector<int> subsets; // subsets of split by categorical feature
2011-02-26 19:05:10 +08:00
2011-02-23 04:43:26 +08:00
Ptr<FeatureEvaluator> feval; // pointer to feature evaluator
Ptr<CvHaarClassifierCascade> oldCascade; // pointer to old cascade
};
..
.. index :: CascadeClassifier::CascadeClassifier
2011-03-01 05:26:43 +08:00
CascadeClassifier::CascadeClassifier
2011-02-23 04:43:26 +08:00
----------------------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: CascadeClassifier::CascadeClassifier(const string\& filename)
2011-02-23 04:43:26 +08:00
Loads the classifier from file.
2011-02-26 19:05:10 +08:00
:param filename: Name of file from which classifier will be load.
2011-02-23 04:43:26 +08:00
.. index :: CascadeClassifier::empty
2011-03-01 05:26:43 +08:00
CascadeClassifier::empty
2011-02-23 04:43:26 +08:00
----------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: bool CascadeClassifier::empty() const
2011-02-23 04:43:26 +08:00
Checks if the classifier has been loaded or not.
.. index :: CascadeClassifier::load
2011-03-01 05:26:43 +08:00
CascadeClassifier::load
2011-02-23 04:43:26 +08:00
---------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: bool CascadeClassifier::load(const string\& filename)
2011-02-23 04:43:26 +08:00
Loads the classifier from file. The previous content is destroyed.
2011-02-26 19:05:10 +08:00
:param filename: Name of file from which classifier will be load. File may contain as old haar classifier (trained by haartraining application) or new cascade classifier (trained traincascade application).
2011-02-23 04:43:26 +08:00
.. index :: CascadeClassifier::read
2011-03-01 05:26:43 +08:00
CascadeClassifier::read
2011-02-23 04:43:26 +08:00
---------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: bool CascadeClassifier::read(const FileNode\& node)
2011-02-23 04:43:26 +08:00
Reads the classifier from a FileStorage node. File may contain a new cascade classifier (trained traincascade application) only.
.. index :: CascadeClassifier::detectMultiScale
2011-03-01 05:26:43 +08:00
CascadeClassifier::detectMultiScale
2011-02-23 04:43:26 +08:00
---------------------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: void CascadeClassifier::detectMultiScale( const Mat\& image, vector<Rect>\& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size())
2011-02-23 04:43:26 +08:00
Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles.
2011-02-26 19:05:10 +08:00
:param image: Matrix of type ``CV_8U`` containing the image in which to detect objects.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param objects: Vector of rectangles such that each rectangle contains the detected object.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param scaleFactor: Specifies how much the image size is reduced at each image scale.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param minNeighbors: Speficifes how many neighbors should each candiate rectangle have to retain it.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param flags: This parameter is not used for new cascade and have the same meaning for old cascade as in function cvHaarDetectObjects.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param minSize: The minimum possible object size. Objects smaller than that are ignored.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
.. index :: CascadeClassifier::setImage
2011-02-23 04:43:26 +08:00
2011-03-01 05:26:43 +08:00
CascadeClassifier::setImage
2011-02-23 04:43:26 +08:00
-------------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: bool CascadeClassifier::setImage( Ptr<FeatureEvaluator>\& feval, const Mat\& image )
2011-02-23 04:43:26 +08:00
Sets the image for detection (called by detectMultiScale at each image level).
2011-02-26 19:05:10 +08:00
:param feval: Pointer to feature evaluator which is used for computing features.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param image: Matrix of type ``CV_8UC1`` containing the image in which to compute the features.
2011-02-23 04:43:26 +08:00
.. index :: CascadeClassifier::runAt
2011-03-01 05:26:43 +08:00
CascadeClassifier::runAt
2011-02-23 04:43:26 +08:00
----------------------------
2011-03-01 05:26:43 +08:00
.. c:function :: int CascadeClassifier::runAt( Ptr<FeatureEvaluator>\& feval, Point pt )
2011-02-23 04:43:26 +08:00
Runs the detector at the specified point (the image that the detector is working with should be set by setImage).
2011-02-26 19:05:10 +08:00
:param feval: Feature evaluator which is used for computing features.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param pt: The upper left point of window in which the features will be computed. Size of the window is equal to size of training images.
2011-02-23 04:43:26 +08:00
Returns:
1 - if cascade classifier detects object in the given location.
-si - otherwise. si is an index of stage which first predicted that given window is a background image.
.. index :: groupRectangles
2011-03-01 05:26:43 +08:00
groupRectangles
2011-02-23 04:43:26 +08:00
-------------------
2011-03-01 05:26:43 +08:00
.. c:function :: void groupRectangles(vector<Rect>\& rectList, int groupThreshold, double eps=0.2)
2011-02-23 04:43:26 +08:00
Groups the object candidate rectangles
2011-02-26 19:05:10 +08:00
:param rectList: The input/output vector of rectangles. On output there will be retained and grouped rectangles
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param groupThreshold: The minimum possible number of rectangles, minus 1, in a group of rectangles to retain it.
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
:param eps: The relative difference between sides of the rectangles to merge them into a group
2011-02-23 04:43:26 +08:00
2011-02-26 19:05:10 +08:00
The function is a wrapper for a generic function
:func: `partition` . It clusters all the input rectangles using the rectangle equivalence criteria, that combines rectangles that have similar sizes and similar locations (the similarity is defined by `` eps `` ). When `` eps=0 `` , no clustering is done at all. If
:math: `\texttt{eps}\rightarrow +\inf` , all the rectangles will be put in one cluster. Then, the small clusters, containing less than or equal to `` groupThreshold `` rectangles, will be rejected. In each other cluster the average rectangle will be computed and put into the output rectangle list.