added max window size parameter for cascade classifier

This commit is contained in:
Kirill Kornyakov
2010-11-18 09:10:47 +00:00
parent 8adc62016b
commit 515bdfa71e
3 changed files with 19 additions and 5 deletions

View File

@@ -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:
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 );

View File

@@ -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;
@@ -871,6 +871,9 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector<Rect>& object
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
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;

View File

@@ -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,
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,
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;