Commit 515bdfa7 authored by Kirill Kornyakov's avatar Kirill Kornyakov

added max window size parameter for cascade classifier

parent 8adc6201
...@@ -128,7 +128,7 @@ CVAPI(CvSeq*) cvHaarDetectObjects( const CvArr* image, ...@@ -128,7 +128,7 @@ CVAPI(CvSeq*) cvHaarDetectObjects( const CvArr* image,
CvHaarClassifierCascade* cascade, CvHaarClassifierCascade* cascade,
CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1), CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0), 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 */ /* sets images for haar classifier cascade */
CVAPI(void) cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade, CVAPI(void) cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade,
...@@ -331,7 +331,8 @@ public: ...@@ -331,7 +331,8 @@ public:
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());
bool setImage( Ptr<FeatureEvaluator>&, const Mat& ); bool setImage( Ptr<FeatureEvaluator>&, const Mat& );
int runAt( Ptr<FeatureEvaluator>&, Point ); int runAt( Ptr<FeatureEvaluator>&, Point );
......
...@@ -849,7 +849,7 @@ struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } } ...@@ -849,7 +849,7 @@ struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } }
void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects, void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& objects,
double scaleFactor, int minNeighbors, double scaleFactor, int minNeighbors,
int flags, Size minSize ) int flags, Size minSize, Size maxSize )
{ {
const double GROUP_EPS = 0.2; const double GROUP_EPS = 0.2;
...@@ -870,7 +870,10 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& object ...@@ -870,7 +870,10 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& object
std::transform(vecAvgComp.begin(), vecAvgComp.end(), objects.begin(), getRect()); std::transform(vecAvgComp.begin(), vecAvgComp.end(), objects.begin(), getRect());
return; return;
} }
if( maxSize.height == 0 || maxSize.width == 0 )
maxSize = image.size();
objects.clear(); objects.clear();
Mat img = image, imgbuf(image.rows+1, image.cols+1, CV_8U); Mat img = image, imgbuf(image.rows+1, image.cols+1, CV_8U);
...@@ -893,6 +896,8 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& object ...@@ -893,6 +896,8 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& object
if( sz1.width <= 0 || sz1.height <= 0 ) if( sz1.width <= 0 || sz1.height <= 0 )
break; break;
if( winSize.width > maxSize.width || winSize.height > maxSize.height )
break;
if( winSize.width < minSize.width || winSize.height < minSize.height ) if( winSize.width < minSize.width || winSize.height < minSize.height )
continue; continue;
......
...@@ -986,7 +986,7 @@ CV_IMPL CvSeq* ...@@ -986,7 +986,7 @@ CV_IMPL CvSeq*
cvHaarDetectObjects( const CvArr* _img, cvHaarDetectObjects( const CvArr* _img,
CvHaarClassifierCascade* cascade, CvHaarClassifierCascade* cascade,
CvMemStorage* storage, double scaleFactor, CvMemStorage* storage, double scaleFactor,
int minNeighbors, int flags, CvSize minSize ) int minNeighbors, int flags, CvSize minSize, CvSize maxSize )
{ {
const double GROUP_EPS = 0.2; const double GROUP_EPS = 0.2;
CvMat stub, *img = (CvMat*)_img; CvMat stub, *img = (CvMat*)_img;
...@@ -1003,6 +1003,12 @@ cvHaarDetectObjects( const CvArr* _img, ...@@ -1003,6 +1003,12 @@ cvHaarDetectObjects( const CvArr* _img,
bool findBiggestObject = (flags & CV_HAAR_FIND_BIGGEST_OBJECT) != 0; bool findBiggestObject = (flags & CV_HAAR_FIND_BIGGEST_OBJECT) != 0;
bool roughSearch = (flags & CV_HAAR_DO_ROUGH_SEARCH) != 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) ) if( !CV_IS_HAAR_CLASSIFIER(cascade) )
CV_Error( !cascade ? CV_StsNullPtr : CV_StsBadArg, "Invalid classifier cascade" ); CV_Error( !cascade ? CV_StsNullPtr : CV_StsBadArg, "Invalid classifier cascade" );
...@@ -1070,6 +1076,8 @@ cvHaarDetectObjects( const CvArr* _img, ...@@ -1070,6 +1076,8 @@ cvHaarDetectObjects( const CvArr* _img,
if( sz1.width <= 0 || sz1.height <= 0 ) if( sz1.width <= 0 || sz1.height <= 0 )
break; break;
if( winSize.width > maxSize.width || winSize.height > maxSize.height )
break;
if( winSize.width < minSize.width || winSize.height < minSize.height ) if( winSize.width < minSize.width || winSize.height < minSize.height )
continue; continue;
......
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