From 0a1ff0d42de3b9b40d5c153a6795e04f9a9da469 Mon Sep 17 00:00:00 2001 From: Konstantin Matskevich Date: Mon, 2 Dec 2013 11:15:46 +0400 Subject: [PATCH] multithreading facedetector --- samples/ocl/facedetect.cpp | 242 ++++++++++++++----------------------- 1 file changed, 89 insertions(+), 153 deletions(-) diff --git a/samples/ocl/facedetect.cpp b/samples/ocl/facedetect.cpp index 7e760dacc8..0f452b945f 100644 --- a/samples/ocl/facedetect.cpp +++ b/samples/ocl/facedetect.cpp @@ -5,121 +5,15 @@ #include #include -using namespace std; -using namespace cv; -#define LOOP_NUM 10 - -///////////////////////////////////////detectfaces with multithreading//////////////////////////////////////////// -#define MAX_THREADS 8 - -#if defined _WIN32|| defined _WIN64 - #include - #include - HANDLE handleThreads[MAX_THREADS]; -#endif - -#if defined __linux__ || defined __APPLE__ - #include - #include +#if defined(_MSC_VER) && (_MSC_VER >= 1700) + # include #endif +using namespace std; using namespace cv; +#define LOOP_NUM 10 -#if defined _WIN32|| defined _WIN64 - void detectFaces(void* str) -#elif defined __linux__ || defined __APPLE__ - void* detectFaces(void* str) -#endif -{ - std::string fileName = *(std::string*)str; - ocl::OclCascadeClassifier cascade; - cascade.load("cv/cascadeandhog/cascades/haarcascade_frontalface_alt.xml" );//path to haarcascade_frontalface_alt.xml - Mat img = imread(fileName, CV_LOAD_IMAGE_COLOR); - if (img.empty()) - { - std::cout << "cann't open file " + fileName < oclfaces; - cascade.detectMultiScale(d_img, oclfaces, 1.1, 3, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30), Size(0, 0)); - - for(int i = 0; irun(); - } - int idx; - std::string fileName; -protected: - Thread():thread(NULL){} -}; - -class Thread_Win : public Thread -{ -private: - friend class Thread; - Thread_Win(){} -public: - ~Thread_Win(){}; - void run() - { -#if defined _WIN32|| defined _WIN64 - handleThreads[idx] = (HANDLE)_beginthread(detectFaces, 0, (void*)&fileName); - WaitForMultipleObjects(MAX_THREADS, handleThreads, TRUE, INFINITE); -#endif - } -}; - -class Thread_Lin : public Thread -{ - private: - friend class Thread; - Thread_Lin(){} -public: - ~Thread_Lin(){}; - void run() - { -#if defined __linux__ || defined __APPLE__ - pthread_t thread; - pthread_create(&thread, NULL, detectFaces, (void*)&fileName); - pthread_join (thread, NULL); -#endif - } -}; - -Thread::Thread(int _idx, std::string _fileName) -{ -#if defined _WIN32|| defined _WIN64 - thread = new Thread_Win(); -#endif -#if defined __linux__ || defined __APPLE__ - thread = new Thread_Lin(); -#endif - thread->idx = _idx; - thread->fileName = _fileName; -} - -///////////////////////////simple-threading faces detecting/////////////////////////////// +///////////////////////////single-threading faces detecting/////////////////////////////// const static Scalar colors[] = { CV_RGB(0,0,255), CV_RGB(0,128,255), @@ -134,7 +28,7 @@ const static Scalar colors[] = { CV_RGB(0,0,255), int64 work_begin = 0; int64 work_end = 0; -string outputName; +string inputName, outputName, cascadeName; static void workBegin() { @@ -170,35 +64,11 @@ static void Draw(Mat& img, vector& faces, double scale); // Else if will return (total diff of each cpu and gpu rects covered pixels)/(total cpu rects covered pixels) double checkRectSimilarity(Size sz, vector& cpu_rst, vector& gpu_rst); -int facedetect_one_thread(int argc, const char** argv ) +static int facedetect_one_thread(bool useCPU, double scale ) { - const char* keys = - "{ h | help | false | print help message }" - "{ i | input | | specify input image }" - "{ t | template | haarcascade_frontalface_alt.xml |" - " specify template file path }" - "{ c | scale | 1.0 | scale image }" - "{ s | use_cpu | false | use cpu or gpu to process the image }" - "{ o | output | facedetect_output.jpg |" - " specify output image save path(only works when input is images) }"; - - CommandLineParser cmd(argc, argv, keys); - if (cmd.get("help")) - { - cout << "Usage : facedetect [options]" << endl; - cout << "Available options:" << endl; - cmd.printParams(); - return EXIT_SUCCESS; - } - CvCapture* capture = 0; Mat frame, frameCopy, image; - bool useCPU = cmd.get("s"); - string inputName = cmd.get("i"); - outputName = cmd.get("o"); - string cascadeName = cmd.get("t"); - double scale = cmd.get("c"); ocl::OclCascadeClassifier cascade; CascadeClassifier cpu_cascade; @@ -288,32 +158,98 @@ int facedetect_one_thread(int argc, const char** argv ) } cvDestroyWindow("result"); - std::cout<< "simple-threading sample was finished" <= 1700) + +#define MAX_THREADS 10 + +static void detectFaces(std::string fileName) { - std::vector threads; - for(int i = 0; irun(); - } - for(int i = 0; i oclfaces; + cascade.detectMultiScale(d_img, oclfaces, 1.1, 3, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30), Size(0, 0)); + + for(unsigned int i = 0; i threads; + for(int i = 0; i= 1 }"; + + CommandLineParser cmd(argc, argv, keys); + if (cmd.get("help")) + { + cout << "Usage : facedetect [options]" << endl; + cout << "Available options:" << endl; + cmd.printParams(); + return EXIT_SUCCESS; + } + bool useCPU = cmd.get("s"); + inputName = cmd.get("i"); + outputName = cmd.get("o"); + cascadeName = cmd.get("t"); + double scale = cmd.get("c"); + int n = cmd.get("n"); + + if(n > 1) + { +#if defined(_MSC_VER) && (_MSC_VER >= 1700) + std::cout<<"multi-threaded sample is running" <& faces,