clip the found objects in HOG as well (http://code.opencv.org/issues/3825); added...
authorVadim Pisarevsky <vadim.pisarevsky@gmail.com>
Thu, 28 May 2015 18:02:27 +0000 (21:02 +0300)
committerVadim Pisarevsky <vadim.pisarevsky@gmail.com>
Thu, 28 May 2015 18:02:27 +0000 (21:02 +0300)
modules/objdetect/src/cascadedetect.cpp
modules/objdetect/src/cascadedetect.hpp
modules/objdetect/src/hog.cpp
modules/objdetect/test/test_cascadeandhog.cpp

index 86a36bf..20800ae 100644 (file)
@@ -1587,9 +1587,8 @@ bool CascadeClassifier::read(const FileNode &root)
     return ok;
 }
 
-static void clipObjects(Size sz, std::vector<Rect>& objects,
-                        std::vector<int>* a,
-                        std::vector<double>* b)
+void clipObjects(Size sz, std::vector<Rect>& objects,
+                 std::vector<int>* a, std::vector<double>* b)
 {
     size_t i, j = 0, n = objects.size();
     Rect win0 = Rect(0, 0, sz.width, sz.height);
index 4cbf3e9..696ab40 100644 (file)
@@ -5,6 +5,9 @@
 namespace cv
 {
 
+void clipObjects(Size sz, std::vector<Rect>& objects,
+                 std::vector<int>* a, std::vector<double>* b);
+
 class FeatureEvaluator
 {
 public:
index 4697a01..710c285 100644 (file)
@@ -41,6 +41,7 @@
 //M*/
 
 #include "precomp.hpp"
+#include "cascadedetect.hpp"
 #include "opencv2/core/core_c.h"
 #include "opencl_kernels_objdetect.hpp"
 
@@ -1822,7 +1823,9 @@ static bool ocl_detectMultiScale(InputArray _img, std::vector<Rect> &found_locat
             all_candidates.push_back(Rect(Point2d(locations[j]) * scale, scaled_win_size));
     }
     found_locations.assign(all_candidates.begin(), all_candidates.end());
-    cv::groupRectangles(found_locations, (int)group_threshold, 0.2);
+    groupRectangles(found_locations, (int)group_threshold, 0.2);
+    clipObjects(imgSize, found_locations, 0, 0);
+
     return true;
 }
 #endif //HAVE_OPENCL
@@ -1878,6 +1881,7 @@ void HOGDescriptor::detectMultiScale(
         groupRectangles_meanshift(foundLocations, foundWeights, foundScales, finalThreshold, winSize);
     else
         groupRectangles(foundLocations, foundWeights, (int)finalThreshold, 0.2);
+    clipObjects(imgSize, foundLocations, 0, &foundWeights);
 }
 
 void HOGDescriptor::detectMultiScale(InputArray img, std::vector<Rect>& foundLocations,
index df33ffe..31afbe6 100644 (file)
@@ -1360,4 +1360,32 @@ TEST(Objdetect_HOGDetector_Strict, accuracy)
         std::vector<float> descriptors;
         reference_hog.compute(image, descriptors);
     }
- }
+}
+
+TEST(Objdetect_CascadeDetector, small_img)
+{
+    String root = cvtest::TS::ptr()->get_data_path() + "cascadeandhog/cascades/";
+    String cascades[] =
+    {
+        root + "haarcascade_frontalface_alt.xml",
+        root + "lbpcascade_frontalface.xml",
+        String()
+    };
+
+    vector<Rect> objects;
+    RNG rng((uint64)-1);
+
+    for( int i = 0; !cascades[i].empty(); i++ )
+    {
+        printf("%d. %s\n", i, cascades[i].c_str());
+        CascadeClassifier cascade(cascades[i]);
+        for( int j = 0; j < 100; j++ )
+        {
+            int width = rng.uniform(1, 100);
+            int height = rng.uniform(1, 100);
+            Mat img(height, width, CV_8U);
+            randu(img, 0, 256);
+            cascade.detectMultiScale(img, objects);
+        }
+    }
+}