Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles.
.. ocv:function:: void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
+.. ocv:function:: void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects, vector<int>& weights, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
.. ocv:pyfunction:: cv2.CascadeClassifier.detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]]) -> objects
.. ocv:pyfunction:: cv2.CascadeClassifier.detectMultiScale(image, rejectLevels, levelWeights[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize[, outputRejectLevels]]]]]]) -> objects
:param objects: Vector of rectangles where each rectangle contains the detected object.
+ :param weights: Vector of weights of the corresponding objects. Weight is the number of neighboring positively classified rectangles that were joined into one object.
+
:param scaleFactor: Parameter specifying how much the image size is reduced at each image scale.
:param minNeighbors: Parameter specifying how many neighbors each candidate rectangle should have to retain it.
CV_WRAP virtual void detectMultiScale( const Mat& image,
CV_OUT vector<Rect>& objects,
+ vector<int>& weights,
+ double scaleFactor=1.1,
+ int minNeighbors=3, int flags=0,
+ Size minSize=Size(),
+ Size maxSize=Size() );
+
+ CV_WRAP virtual void detectMultiScale( const Mat& image,
+ CV_OUT vector<Rect>& objects,
vector<int>& rejectLevels,
vector<double>& levelWeights,
double scaleFactor=1.1,
int minNeighbors=3, int flags=0,
Size minSize=Size(),
Size maxSize=Size(),
- bool outputRejectLevels=false );
+ bool outputRejectLevels=false,
+ bool outputWeights=false );
bool isOldFormatCascade() const;
};
struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } };
+struct getNeighbors { int operator ()(const CvAvgComp& e) const { return e.neighbors; } };
bool CascadeClassifier::detectSingleScale( const Mat& image, int stripCount, Size processingRectSize,
vector<double>& levelWeights,
double scaleFactor, int minNeighbors,
int flags, Size minObjectSize, Size maxObjectSize,
- bool outputRejectLevels )
+ bool outputRejectLevels, bool outputWeights )
{
const double GROUP_EPS = 0.2;
CV_Assert( scaleFactor > 1 && image.depth() == CV_8U );
+ CV_Assert( !( outputRejectLevels && outputWeights ) );
if( empty() )
return;
Seq<CvAvgComp>(_objects).copyTo(vecAvgComp);
objects.resize(vecAvgComp.size());
std::transform(vecAvgComp.begin(), vecAvgComp.end(), objects.begin(), getRect());
+ if( outputWeights )
+ {
+ rejectLevels.resize(vecAvgComp.size());
+ std::transform(vecAvgComp.begin(), vecAvgComp.end(), rejectLevels.begin(),
+ getNeighbors());
+ }
return;
}
{
groupRectangles( objects, rejectLevels, levelWeights, minNeighbors, GROUP_EPS );
}
+ else if( outputWeights )
+ {
+ groupRectangles( objects, rejectLevels, minNeighbors, GROUP_EPS );
+ }
else
{
groupRectangles( objects, minNeighbors, GROUP_EPS );
minNeighbors, flags, minObjectSize, maxObjectSize, false );
}
+void CascadeClassifier::detectMultiScale( const Mat& image, CV_OUT vector<Rect>& objects,
+ vector<int>& weights, double scaleFactor,
+ int minNeighbors, int flags, Size minObjectSize,
+ Size maxObjectSize )
+{
+ vector<double> fakeLevelWeights;
+ detectMultiScale( image, objects, weights, fakeLevelWeights, scaleFactor,
+ minNeighbors, flags, minObjectSize, maxObjectSize, false, true );
+}
+
bool CascadeClassifier::Data::read(const FileNode &root)
{
static const float THRESHOLD_EPS = 1e-5f;