From 8adebcbc00a6b1fcfb7e772223e18744cf8f2bce Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 5 Nov 2013 14:48:29 +0800 Subject: [PATCH] Add ocl retina sample. --- samples/ocl/CMakeLists.txt | 2 +- samples/ocl/retina_ocl.cpp | 124 +++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 samples/ocl/retina_ocl.cpp diff --git a/samples/ocl/CMakeLists.txt b/samples/ocl/CMakeLists.txt index 8db77d52c..b4f7afa21 100644 --- a/samples/ocl/CMakeLists.txt +++ b/samples/ocl/CMakeLists.txt @@ -1,7 +1,7 @@ SET(OPENCV_OCL_SAMPLES_REQUIRED_DEPS opencv_core opencv_flann opencv_imgproc opencv_highgui opencv_ml opencv_video opencv_objdetect opencv_features2d opencv_calib3d opencv_legacy opencv_contrib opencv_ocl - opencv_nonfree) + opencv_nonfree opencv_bioinspired) ocv_check_dependencies(${OPENCV_OCL_SAMPLES_REQUIRED_DEPS}) diff --git a/samples/ocl/retina_ocl.cpp b/samples/ocl/retina_ocl.cpp new file mode 100644 index 000000000..bd364855e --- /dev/null +++ b/samples/ocl/retina_ocl.cpp @@ -0,0 +1,124 @@ +#include +#include + +#include "opencv2/core.hpp" +#include "opencv2/imgproc.hpp" +#include "opencv2/highgui.hpp" +#include "opencv2/ocl.hpp" +#include "opencv2/bioinspired.hpp" + +using namespace cv; +using namespace cv::ocl; +using namespace std; + +const int total_loop_count = 50; + +static void help(CommandLineParser cmd, const String& errorMessage) +{ + cout << errorMessage << endl; + cout << "Avaible options:" << endl; + cmd.printMessage(); +} + +int main(int argc, char* argv[]) +{ + //set this to save kernel compile time from second time you run + ocl::setBinaryDiskCache(); + const char* keys = + "{ h | help | false | print help message }" + "{ c | use_cpp | false | use cpp (original version) or gpu(OpenCL) to process the image }" + "{ i | image | cat.jpg | specify the input image }"; + + CommandLineParser cmd(argc, argv, keys); + + if(cmd.get("help")) + { + help(cmd, "Usage: ./retina_ocl [options]"); + return EXIT_FAILURE; + } + + String fname = cmd.get("i"); + bool useCPP = cmd.get("c"); + + cv::Mat input = imread(fname); + if(input.empty()) + { + help(cmd, fname + " not found!"); + return EXIT_FAILURE; + } + ////////////////////////////////////////////////////////////////////////////// + // Program start in a try/catch safety context (Retina may throw errors) + try + { + // create a retina instance with default parameters setup, uncomment the initialisation you wanna test + cv::Ptr oclRetina; + cv::Ptr retina; + // declare retina output buffers + cv::ocl::oclMat retina_parvo_ocl; + cv::ocl::oclMat retina_magno_ocl; + cv::Mat retina_parvo; + cv::Mat retina_magno; + + if(useCPP) + { + retina = cv::bioinspired::createRetina(input.size()); + retina->clearBuffers(); + } + else + { + oclRetina = cv::bioinspired::createRetina_OCL(input.size()); + oclRetina->clearBuffers(); + } + + int64 temp_time = 0, total_time = 0; + + int loop_counter = 0; + static bool initialized = false; + for(; loop_counter <= total_loop_count; ++loop_counter) + { + if(useCPP) + { + temp_time = cv::getTickCount(); + retina->run(input); + retina->getParvo(retina_parvo); + retina->getMagno(retina_magno); + } + else + { + cv::ocl::oclMat input_ocl(input); + temp_time = cv::getTickCount(); + oclRetina->run(input_ocl); + oclRetina->getParvo(retina_parvo_ocl); + oclRetina->getMagno(retina_magno_ocl); + } + // will not count the first loop, which is considered as warm-up period + if(initialized) + { + temp_time = (cv::getTickCount() - temp_time); + total_time += temp_time; + printf("Frame id %2d: %3.4fms\n", loop_counter, (double)temp_time / cv::getTickFrequency() * 1000.0); + } + else + { + initialized = true; + } + if(!useCPP) + { + retina_parvo = retina_parvo_ocl; + retina_magno = retina_magno_ocl; + } + cv::imshow("retina input", input); + cv::imshow("Retina Parvo", retina_parvo); + cv::imshow("Retina Magno", retina_magno); + cv::waitKey(10); + } + printf("Average: %.4fms\n", (double)total_time / total_loop_count / cv::getTickFrequency() * 1000.0); + } + catch(cv::Exception e) + { + std::cerr << "Error using Retina : " << e.what() << std::endl; + } + // Program end message + std::cout << "Retina demo end" << std::endl; + return EXIT_SUCCESS; +}