Overload detectMultiScale API for ocl::haar.
authorpeng xiao <hisenxpress@gmail.com>
Mon, 4 Nov 2013 06:59:28 +0000 (14:59 +0800)
committerpeng xiao <hisenxpress@gmail.com>
Mon, 4 Nov 2013 06:59:28 +0000 (14:59 +0800)
modules/ocl/include/opencv2/ocl/ocl.hpp
modules/ocl/src/haar.cpp

index af24f0a..40746bf 100644 (file)
@@ -898,6 +898,9 @@ namespace cv
 
             CvSeq* oclHaarDetectObjects(oclMat &gimg, CvMemStorage *storage, double scaleFactor,
                                         int minNeighbors, int flags, CvSize minSize = cvSize(0, 0), CvSize maxSize = cvSize(0, 0));
+            void detectMultiScale(oclMat &image, CV_OUT std::vector<cv::Rect>& faces,
+                double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0,
+                Size minSize = Size(), Size maxSize = Size());
         };
 
         class CV_EXPORTS OclCascadeClassifierBuf : public  cv::CascadeClassifier
index 31f6742..b79ec0f 100644 (file)
@@ -1186,6 +1186,28 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
     return result_seq;
 }
 
+
+struct getRect
+{
+    Rect operator()(const CvAvgComp &e) const
+    {
+        return e.rect;
+    }
+};
+
+void cv::ocl::OclCascadeClassifier::detectMultiScale(oclMat &gimg, CV_OUT std::vector<cv::Rect>& faces,
+                                                        double scaleFactor, int minNeighbors, int flags,
+                                                        Size minSize, Size maxSize)
+{
+    CvSeq* _objects;
+    MemStorage storage(cvCreateMemStorage(0));
+    _objects = oclHaarDetectObjects(gimg, storage, scaleFactor, minNeighbors, flags, minSize, maxSize);
+    vector<CvAvgComp> vecAvgComp;
+    Seq<CvAvgComp>(_objects).copyTo(vecAvgComp);
+    faces.resize(vecAvgComp.size());
+    std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect());
+}
+
 struct OclBuffers
 {
     cl_mem stagebuffer;
@@ -1197,13 +1219,6 @@ struct OclBuffers
     cl_mem newnodebuffer;
 };
 
-struct getRect
-{
-    Rect operator()(const CvAvgComp &e) const
-    {
-        return e.rect;
-    }
-};
 
 void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std::vector<cv::Rect>& faces,
                                                         double scaleFactor, int minNeighbors, int flags,