From c53398a4389effafb02f84c6f7822bbdb03089f4 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Fri, 14 Mar 2014 12:59:14 +0400 Subject: [PATCH] performance tests for FAST --- modules/features2d/perf/opencl/perf_fast.cpp | 50 ++++++++++++++++++++++++++++ modules/features2d/perf/opencl/perf_orb.cpp | 4 +-- modules/ts/include/opencv2/ts/ts_perf.hpp | 32 ++++++++++-------- 3 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 modules/features2d/perf/opencl/perf_fast.cpp diff --git a/modules/features2d/perf/opencl/perf_fast.cpp b/modules/features2d/perf/opencl/perf_fast.cpp new file mode 100644 index 0000000..7816da7 --- /dev/null +++ b/modules/features2d/perf/opencl/perf_fast.cpp @@ -0,0 +1,50 @@ +#include "perf_precomp.hpp" +#include "opencv2/ts/ocl_perf.hpp" + +#ifdef HAVE_OPENCL + +namespace cvtest { +namespace ocl { + +enum { TYPE_5_8 =FastFeatureDetector::TYPE_5_8, TYPE_7_12 = FastFeatureDetector::TYPE_7_12, TYPE_9_16 = FastFeatureDetector::TYPE_9_16 }; +CV_ENUM(FastType, TYPE_5_8, TYPE_7_12) + +typedef std::tr1::tuple File_Type_t; +typedef TestBaseWithParam FASTFixture; + +#define FAST_IMAGES \ + "cv/detectors_descriptors_evaluation/images_datasets/leuven/img1.png",\ + "stitching/a3.png" + +OCL_PERF_TEST_P(FASTFixture, FastDetect, testing::Combine( + testing::Values(FAST_IMAGES), + FastType::all() + )) +{ + string filename = getDataPath(get<0>(GetParam())); + int type = get<1>(GetParam()); + Mat mframe = imread(filename, IMREAD_GRAYSCALE); + + if (mframe.empty()) + FAIL() << "Unable to load source image " << filename; + + UMat frame; + mframe.copyTo(frame); + declare.in(frame); + + Ptr fd = Algorithm::create("Feature2D.FAST"); + ASSERT_FALSE( fd.empty() ); + fd->set("threshold", 20); + fd->set("nonmaxSuppression", true); + fd->set("type", type); + vector points; + + OCL_TEST_CYCLE() fd->detect(frame, points); + + SANITY_CHECK_KEYPOINTS(points); +} + +} // ocl +} // cvtest + +#endif // HAVE_OPENCL diff --git a/modules/features2d/perf/opencl/perf_orb.cpp b/modules/features2d/perf/opencl/perf_orb.cpp index 78a82aa..f40b5f4 100644 --- a/modules/features2d/perf/opencl/perf_orb.cpp +++ b/modules/features2d/perf/opencl/perf_orb.cpp @@ -27,7 +27,7 @@ OCL_PERF_TEST_P(ORBFixture, ORB_Detect, ORB_IMAGES) OCL_TEST_CYCLE() detector(frame, mask, points); - sort(points.begin(), points.end(), comparators::KeypointGreater()); + std::sort(points.begin(), points.end(), comparators::KeypointGreater()); SANITY_CHECK_KEYPOINTS(points, 1e-5); } @@ -47,7 +47,7 @@ OCL_PERF_TEST_P(ORBFixture, ORB_Extract, ORB_IMAGES) ORB detector(1500, 1.3f, 1); vector points; detector(frame, mask, points); - sort(points.begin(), points.end(), comparators::KeypointGreater()); + std::sort(points.begin(), points.end(), comparators::KeypointGreater()); UMat descriptors; diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index e3b6481..62e9e14 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -4,6 +4,8 @@ #include "opencv2/core.hpp" #include "ts_gtest.h" +#include + #if !(defined(LOGD) || defined(LOGI) || defined(LOGW) || defined(LOGE)) # if defined(ANDROID) && defined(USE_ANDROID_LOGGING) # include @@ -555,31 +557,33 @@ namespace comparators { template -struct CV_EXPORTS RectLess_ +struct CV_EXPORTS RectLess_ : + public std::binary_function, cv::Rect_, bool> { bool operator()(const cv::Rect_& r1, const cv::Rect_& r2) const { - return r1.x < r2.x - || (r1.x == r2.x && r1.y < r2.y) - || (r1.x == r2.x && r1.y == r2.y && r1.width < r2.width) - || (r1.x == r2.x && r1.y == r2.y && r1.width == r2.width && r1.height < r2.height); + return r1.x < r2.x || + (r1.x == r2.x && r1.y < r2.y) || + (r1.x == r2.x && r1.y == r2.y && r1.width < r2.width) || + (r1.x == r2.x && r1.y == r2.y && r1.width == r2.width && r1.height < r2.height); } }; typedef RectLess_ RectLess; -struct CV_EXPORTS KeypointGreater +struct CV_EXPORTS KeypointGreater : + public std::binary_function { bool operator()(const cv::KeyPoint& kp1, const cv::KeyPoint& kp2) const { - if(kp1.response > kp2.response) return true; - if(kp1.response < kp2.response) return false; - if(kp1.size > kp2.size) return true; - if(kp1.size < kp2.size) return false; - if(kp1.octave > kp2.octave) return true; - if(kp1.octave < kp2.octave) return false; - if(kp1.pt.y < kp2.pt.y) return false; - if(kp1.pt.y > kp2.pt.y) return true; + if (kp1.response > kp2.response) return true; + if (kp1.response < kp2.response) return false; + if (kp1.size > kp2.size) return true; + if (kp1.size < kp2.size) return false; + if (kp1.octave > kp2.octave) return true; + if (kp1.octave < kp2.octave) return false; + if (kp1.pt.y < kp2.pt.y) return false; + if (kp1.pt.y > kp2.pt.y) return true; return kp1.pt.x < kp2.pt.x; } }; -- 2.7.4