diff --git a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp index a2b6cd0ed..7e7eae993 100644 --- a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp +++ b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp @@ -347,9 +347,16 @@ public: 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& objects, + vector& rejectLevels, + double scaleFactor=1.1, + int minNeighbors=3, int flags=0, + Size minSize=Size(), Size maxSize=Size(), - bool outputRejectLevels = false, - vector& rejectLevels = vector(0)); + bool outputRejectLevels = false ); bool isOldFormatCascade() const; @@ -358,9 +365,12 @@ public: bool setImage( const Mat& ); protected: + //virtual bool detectSingleScale( const Mat& image, int stripCount, Size processingRectSize, + // int stripSize, int yStep, double factor, vector& candidates ); + virtual bool detectSingleScale( const Mat& image, int stripCount, Size processingRectSize, int stripSize, int yStep, double factor, vector& candidates, - bool outputRejectLevels = false, vector& rejectLevels = vector(0) ); + vector& rejectLevels, bool outputRejectLevels = false); protected: enum { BOOST = 0 }; diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp index 04fed1acc..59060dde1 100644 --- a/modules/objdetect/src/cascadedetect.cpp +++ b/modules/objdetect/src/cascadedetect.cpp @@ -926,7 +926,7 @@ struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } } bool CascadeClassifier::detectSingleScale( const Mat& image, int stripCount, Size processingRectSize, int stripSize, int yStep, double factor, vector& candidates, - bool outputRejectLevels, vector& levels ) + vector& levels, bool outputRejectLevels ) { if( !featureEvaluator->setImage( image, data.origWinSize ) ) return false; @@ -949,6 +949,14 @@ bool CascadeClassifier::detectSingleScale( const Mat& image, int stripCount, Siz return true; } +//bool CascadeClassifier::detectSingleScale( const Mat& image, int stripCount, Size processingRectSize, +// int stripSize, int yStep, double factor, vector& candidates ) +//{ +// vector fakeLevels; +// return detectSingleScale( image, stripCount, processingRectSize, +// stripSize, yStep, factor, candidates, fakeLevels, false ); +//} + bool CascadeClassifier::isOldFormatCascade() const { return !oldCascade.empty(); @@ -969,10 +977,11 @@ bool CascadeClassifier::setImage(const Mat& image) return featureEvaluator->setImage(image, data.origWinSize); } -void CascadeClassifier::detectMultiScale( const Mat& image, vector& objects, +void CascadeClassifier::detectMultiScale( const Mat& image, vector& objects, + vector& rejectLevels, double scaleFactor, int minNeighbors, int flags, Size minObjectSize, Size maxObjectSize, - bool outputRejectLevels, vector& rejectLevels ) + bool outputRejectLevels ) { const double GROUP_EPS = 0.2; @@ -1042,7 +1051,7 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector& object #endif if( !detectSingleScale( scaledImage, stripCount, processingRectSize, stripSize, yStep, factor, candidates, - outputRejectLevels, rejectLevels ) ) + rejectLevels, outputRejectLevels ) ) break; } @@ -1051,6 +1060,15 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector& object groupRectangles( objects, rejectLevels, minNeighbors, GROUP_EPS ); +} + +void CascadeClassifier::detectMultiScale( const Mat& image, vector& objects, + double scaleFactor, int minNeighbors, + int flags, Size minObjectSize, Size maxObjectSize) +{ + vector fakeLevels; + detectMultiScale( image, objects, fakeLevels, scaleFactor, + minNeighbors, flags, minObjectSize, maxObjectSize, false ); } bool CascadeClassifier::Data::read(const FileNode &root)