diff --git a/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp b/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp index f7bd24cf5..2e6e57416 100644 --- a/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp +++ b/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp @@ -123,7 +123,7 @@ OCL_PERF_TEST_P(BruteForceMatcherFixture, RadiusMatch, ::testing::Combine(OCL_PE SANITY_CHECK_MATCHES(matches1, 1e-3); } -}//ocl -}//cvtest +} // ocl +} // cvtest -#endif //HAVE_OPENCL +#endif // HAVE_OPENCL diff --git a/modules/features2d/perf/opencl/perf_fast.cpp b/modules/features2d/perf/opencl/perf_fast.cpp new file mode 100644 index 000000000..7816da7b1 --- /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 new file mode 100644 index 000000000..f40b5f4b9 --- /dev/null +++ b/modules/features2d/perf/opencl/perf_orb.cpp @@ -0,0 +1,86 @@ +#include "perf_precomp.hpp" +#include "opencv2/ts/ocl_perf.hpp" + +#ifdef HAVE_OPENCL + +namespace cvtest { +namespace ocl { + +typedef ::perf::TestBaseWithParam ORBFixture; + +#define ORB_IMAGES OCL_PERF_ENUM("cv/detectors_descriptors_evaluation/images_datasets/leuven/img1.png", "stitching/a3.png") + +OCL_PERF_TEST_P(ORBFixture, ORB_Detect, ORB_IMAGES) +{ + string filename = getDataPath(GetParam()); + Mat mframe = imread(filename, IMREAD_GRAYSCALE); + + if (mframe.empty()) + FAIL() << "Unable to load source image " << filename; + + UMat frame, mask; + mframe.copyTo(frame); + + declare.in(frame); + ORB detector(1500, 1.3f, 1); + vector points; + + OCL_TEST_CYCLE() detector(frame, mask, points); + + std::sort(points.begin(), points.end(), comparators::KeypointGreater()); + SANITY_CHECK_KEYPOINTS(points, 1e-5); +} + +OCL_PERF_TEST_P(ORBFixture, ORB_Extract, ORB_IMAGES) +{ + string filename = getDataPath(GetParam()); + Mat mframe = imread(filename, IMREAD_GRAYSCALE); + + if (mframe.empty()) + FAIL() << "Unable to load source image " << filename; + + UMat mask, frame; + mframe.copyTo(frame); + + declare.in(frame); + + ORB detector(1500, 1.3f, 1); + vector points; + detector(frame, mask, points); + std::sort(points.begin(), points.end(), comparators::KeypointGreater()); + + UMat descriptors; + + OCL_TEST_CYCLE() detector(frame, mask, points, descriptors, true); + + SANITY_CHECK(descriptors); +} + +OCL_PERF_TEST_P(ORBFixture, ORB_Full, ORB_IMAGES) +{ + string filename = getDataPath(GetParam()); + Mat mframe = imread(filename, IMREAD_GRAYSCALE); + + if (mframe.empty()) + FAIL() << "Unable to load source image " << filename; + + UMat mask, frame; + mframe.copyTo(frame); + + declare.in(frame); + ORB detector(1500, 1.3f, 1); + + vector points; + UMat descriptors; + + OCL_TEST_CYCLE() detector(frame, mask, points, descriptors, false); + + ::perf::sort(points, descriptors); + SANITY_CHECK_KEYPOINTS(points, 1e-5); + SANITY_CHECK(descriptors); +} + +} // ocl +} // cvtest + +#endif // HAVE_OPENCL diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index e3b6481d1..62e9e1471 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; } };