From 8c1eb5bf0e09b0b29e935f9b43786e2d5a830477 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Mon, 4 Nov 2013 14:59:28 +0800 Subject: [PATCH 1/3] Overload detectMultiScale API for ocl::haar. --- modules/ocl/include/opencv2/ocl/ocl.hpp | 3 +++ modules/ocl/src/haar.cpp | 29 +++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index af24f0aca2..40746bf32c 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -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& faces, + double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, + Size minSize = Size(), Size maxSize = Size()); }; class CV_EXPORTS OclCascadeClassifierBuf : public cv::CascadeClassifier diff --git a/modules/ocl/src/haar.cpp b/modules/ocl/src/haar.cpp index 31f6742811..b79ec0fdc7 100644 --- a/modules/ocl/src/haar.cpp +++ b/modules/ocl/src/haar.cpp @@ -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& 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 vecAvgComp; + Seq(_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& faces, double scaleFactor, int minNeighbors, int flags, From 2a111f7a6c5033db275d82cc1a9129b89ae19678 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 5 Nov 2013 10:40:27 +0800 Subject: [PATCH 2/3] Let perf/accuracy test of ocl haar uses detectMultiScale api. Fix image to be used by perf test. --- modules/ocl/perf/perf_haar.cpp | 42 ++--------------------------- modules/ocl/test/test_objdetect.cpp | 11 +++----- samples/ocl/facedetect.cpp | 6 ++--- 3 files changed, 8 insertions(+), 51 deletions(-) diff --git a/modules/ocl/perf/perf_haar.cpp b/modules/ocl/perf/perf_haar.cpp index 9ccaf31563..1e6ba1b646 100644 --- a/modules/ocl/perf/perf_haar.cpp +++ b/modules/ocl/perf/perf_haar.cpp @@ -48,49 +48,11 @@ using namespace perf; ///////////// Haar //////////////////////// -namespace cv -{ -namespace ocl -{ - -struct getRect -{ - Rect operator()(const CvAvgComp &e) const - { - return e.rect; - } -}; - -class CascadeClassifier_GPU : public OclCascadeClassifier -{ -public: - void detectMultiScale(oclMat &image, - CV_OUT std::vector& faces, - double scaleFactor = 1.1, - int minNeighbors = 3, int flags = 0, - Size minSize = Size(), - Size maxSize = Size()) - { - (void)maxSize; - MemStorage storage(cvCreateMemStorage(0)); - //CvMat img=image; - CvSeq *objs = oclHaarDetectObjects(image, storage, scaleFactor, minNeighbors, flags, minSize); - vector vecAvgComp; - Seq(objs).copyTo(vecAvgComp); - faces.resize(vecAvgComp.size()); - std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect()); - } - -}; - -} -} - PERF_TEST(HaarFixture, Haar) { vector faces; - Mat img = imread(getDataPath("gpu/haarcascade/basketball1.png"), CV_LOAD_IMAGE_GRAYSCALE); + Mat img = imread(getDataPath("gpu/haarcascade/group_1_640x480_VGA.pgm"), CV_LOAD_IMAGE_GRAYSCALE); ASSERT_TRUE(!img.empty()) << "can't open basketball1.png"; declare.in(img); @@ -107,7 +69,7 @@ PERF_TEST(HaarFixture, Haar) } else if (RUN_OCL_IMPL) { - ocl::CascadeClassifier_GPU faceCascade; + ocl::OclCascadeClassifier faceCascade; ocl::oclMat oclImg(img); ASSERT_TRUE(faceCascade.load(getDataPath("gpu/haarcascade/haarcascade_frontalface_alt.xml"))) diff --git a/modules/ocl/test/test_objdetect.cpp b/modules/ocl/test/test_objdetect.cpp index 6f47d7470b..89f45b07c9 100644 --- a/modules/ocl/test/test_objdetect.cpp +++ b/modules/ocl/test/test_objdetect.cpp @@ -218,14 +218,9 @@ PARAM_TEST_CASE(Haar, int, CascadeName) OCL_TEST_P(Haar, FaceDetect) { - MemStorage storage(cvCreateMemStorage(0)); - CvSeq *_objects; - _objects = cascade.oclHaarDetectObjects(d_img, storage, 1.1, 3, - flags, Size(30, 30), Size(0, 0)); - vector vecAvgComp; - Seq(_objects).copyTo(vecAvgComp); - oclfaces.resize(vecAvgComp.size()); - std::transform(vecAvgComp.begin(), vecAvgComp.end(), oclfaces.begin(), getRect()); + cascade.detectMultiScale(d_img, oclfaces, 1.1, 3, + flags, + Size(30, 30), Size(0, 0)); cpucascade.detectMultiScale(img, faces, 1.1, 3, flags, diff --git a/samples/ocl/facedetect.cpp b/samples/ocl/facedetect.cpp index d20c937852..10c6c4f4d2 100644 --- a/samples/ocl/facedetect.cpp +++ b/samples/ocl/facedetect.cpp @@ -41,7 +41,7 @@ static double getTime() static void detect( Mat& img, vector& faces, - ocl::OclCascadeClassifierBuf& cascade, + ocl::OclCascadeClassifier& cascade, double scale, bool calTime); @@ -87,7 +87,7 @@ int main( int argc, const char** argv ) outputName = cmd.get("o"); string cascadeName = cmd.get("t"); double scale = cmd.get("c"); - ocl::OclCascadeClassifierBuf cascade; + ocl::OclCascadeClassifier cascade; CascadeClassifier cpu_cascade; if( !cascade.load( cascadeName ) || !cpu_cascade.load(cascadeName) ) @@ -180,7 +180,7 @@ int main( int argc, const char** argv ) } void detect( Mat& img, vector& faces, - ocl::OclCascadeClassifierBuf& cascade, + ocl::OclCascadeClassifier& cascade, double scale, bool calTime) { ocl::oclMat image(img); From 53d1873776ad119b376b77d08bb48bfaca2d8e2c Mon Sep 17 00:00:00 2001 From: peng xiao Date: Wed, 6 Nov 2013 11:19:26 +0800 Subject: [PATCH 3/3] Revert back test image. --- modules/ocl/perf/perf_haar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ocl/perf/perf_haar.cpp b/modules/ocl/perf/perf_haar.cpp index 1e6ba1b646..b7a1dd1a43 100644 --- a/modules/ocl/perf/perf_haar.cpp +++ b/modules/ocl/perf/perf_haar.cpp @@ -52,7 +52,7 @@ PERF_TEST(HaarFixture, Haar) { vector faces; - Mat img = imread(getDataPath("gpu/haarcascade/group_1_640x480_VGA.pgm"), CV_LOAD_IMAGE_GRAYSCALE); + Mat img = imread(getDataPath("gpu/haarcascade/basketball1.png"), CV_LOAD_IMAGE_GRAYSCALE); ASSERT_TRUE(!img.empty()) << "can't open basketball1.png"; declare.in(img);