diff --git a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp index 43190fc776..156fa87b6e 100644 --- a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp +++ b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp @@ -128,7 +128,7 @@ CVAPI(CvSeq*) cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1), int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0), - CvSize min_size CV_DEFAULT(cvSize(0,0))); + CvSize min_size CV_DEFAULT(cvSize(0,0)), CvSize max_size CV_DEFAULT(cvSize(0,0))); /* sets images for haar classifier cascade */ CVAPI(void) cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade, @@ -331,7 +331,8 @@ public: CV_OUT vector& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, - Size minSize=Size()); + Size minSize=Size(), + Size maxSize=Size()); bool setImage( Ptr&, const Mat& ); int runAt( Ptr&, Point ); diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp index 56ab3568f8..2510408c6d 100644 --- a/modules/objdetect/src/cascadedetect.cpp +++ b/modules/objdetect/src/cascadedetect.cpp @@ -849,7 +849,7 @@ struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } } void CascadeClassifier::detectMultiScale( const Mat& image, vector& objects, double scaleFactor, int minNeighbors, - int flags, Size minSize ) + int flags, Size minSize, Size maxSize ) { const double GROUP_EPS = 0.2; @@ -870,7 +870,10 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector& object std::transform(vecAvgComp.begin(), vecAvgComp.end(), objects.begin(), getRect()); return; } - + + if( maxSize.height == 0 || maxSize.width == 0 ) + maxSize = image.size(); + objects.clear(); Mat img = image, imgbuf(image.rows+1, image.cols+1, CV_8U); @@ -893,6 +896,8 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector& object if( sz1.width <= 0 || sz1.height <= 0 ) break; + if( winSize.width > maxSize.width || winSize.height > maxSize.height ) + break; if( winSize.width < minSize.width || winSize.height < minSize.height ) continue; diff --git a/modules/objdetect/src/haar.cpp b/modules/objdetect/src/haar.cpp index e6563ba26b..def50a8ce1 100644 --- a/modules/objdetect/src/haar.cpp +++ b/modules/objdetect/src/haar.cpp @@ -986,7 +986,7 @@ CV_IMPL CvSeq* cvHaarDetectObjects( const CvArr* _img, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scaleFactor, - int minNeighbors, int flags, CvSize minSize ) + int minNeighbors, int flags, CvSize minSize, CvSize maxSize ) { const double GROUP_EPS = 0.2; CvMat stub, *img = (CvMat*)_img; @@ -1003,6 +1003,12 @@ cvHaarDetectObjects( const CvArr* _img, bool findBiggestObject = (flags & CV_HAAR_FIND_BIGGEST_OBJECT) != 0; bool roughSearch = (flags & CV_HAAR_DO_ROUGH_SEARCH) != 0; + if( maxSize.height == 0 || maxSize.width == 0 ) + { + maxSize.height = img->rows; + maxSize.width = img->cols; + } + if( !CV_IS_HAAR_CLASSIFIER(cascade) ) CV_Error( !cascade ? CV_StsNullPtr : CV_StsBadArg, "Invalid classifier cascade" ); @@ -1070,6 +1076,8 @@ cvHaarDetectObjects( const CvArr* _img, if( sz1.width <= 0 || sz1.height <= 0 ) break; + if( winSize.width > maxSize.width || winSize.height > maxSize.height ) + break; if( winSize.width < minSize.width || winSize.height < minSize.height ) continue;