From: Vadim Pisarevsky Date: Thu, 28 May 2015 17:15:22 +0000 (+0300) Subject: make sure the returned rectangles are inside the image (http://code.opencv.org/issues... X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~2440^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8c3c6b31fc9eece0ddb62477b3809c03c07326cb;p=platform%2Fupstream%2Fopencv.git make sure the returned rectangles are inside the image (code.opencv.org/issues/3136) --- diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp index 056abec..86a36bf 100644 --- a/modules/objdetect/src/cascadedetect.cpp +++ b/modules/objdetect/src/cascadedetect.cpp @@ -1587,6 +1587,44 @@ bool CascadeClassifier::read(const FileNode &root) return ok; } +static void clipObjects(Size sz, std::vector& objects, + std::vector* a, + std::vector* b) +{ + size_t i, j = 0, n = objects.size(); + Rect win0 = Rect(0, 0, sz.width, sz.height); + if(a) + { + CV_Assert(a->size() == n); + } + if(b) + { + CV_Assert(b->size() == n); + } + + for( i = 0; i < n; i++ ) + { + Rect r = win0 & objects[i]; + if( r.area() > 0 ) + { + objects[j] = r; + if( i > j ) + { + if(a) a->at(j) = a->at(i); + if(b) b->at(j) = b->at(i); + } + j++; + } + } + + if( j < n ) + { + objects.resize(j); + if(a) a->resize(j); + if(b) b->resize(j); + } +} + void CascadeClassifier::detectMultiScale( InputArray image, CV_OUT std::vector& objects, double scaleFactor, @@ -1596,6 +1634,7 @@ void CascadeClassifier::detectMultiScale( InputArray image, { CV_Assert(!empty()); cc->detectMultiScale(image, objects, scaleFactor, minNeighbors, flags, minSize, maxSize); + clipObjects(image.size(), objects, 0, 0); } void CascadeClassifier::detectMultiScale( InputArray image, @@ -1608,6 +1647,7 @@ void CascadeClassifier::detectMultiScale( InputArray image, CV_Assert(!empty()); cc->detectMultiScale(image, objects, numDetections, scaleFactor, minNeighbors, flags, minSize, maxSize); + clipObjects(image.size(), objects, &numDetections, 0); } void CascadeClassifier::detectMultiScale( InputArray image, @@ -1623,6 +1663,7 @@ void CascadeClassifier::detectMultiScale( InputArray image, cc->detectMultiScale(image, objects, rejectLevels, levelWeights, scaleFactor, minNeighbors, flags, minSize, maxSize, outputRejectLevels); + clipObjects(image.size(), objects, &rejectLevels, &levelWeights); } bool CascadeClassifier::isOldFormatCascade() const