summaryrefslogtreecommitdiff
path: root/2.3-1/thirdparty/includes/OpenCV/opencv2/ts/ts_perf.hpp
diff options
context:
space:
mode:
Diffstat (limited to '2.3-1/thirdparty/includes/OpenCV/opencv2/ts/ts_perf.hpp')
-rw-r--r--2.3-1/thirdparty/includes/OpenCV/opencv2/ts/ts_perf.hpp618
1 files changed, 618 insertions, 0 deletions
diff --git a/2.3-1/thirdparty/includes/OpenCV/opencv2/ts/ts_perf.hpp b/2.3-1/thirdparty/includes/OpenCV/opencv2/ts/ts_perf.hpp
new file mode 100644
index 00000000..18309061
--- /dev/null
+++ b/2.3-1/thirdparty/includes/OpenCV/opencv2/ts/ts_perf.hpp
@@ -0,0 +1,618 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+// By downloading, copying, installing or using the software you agree to this license.
+// If you do not agree to this license, do not download, install,
+// copy or use the software.
+//
+//
+// License Agreement
+// For Open Source Computer Vision Library
+//
+// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
+// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistribution's of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// * Redistribution's in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// * The name of the copyright holders may not be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+//M*/
+
+#ifndef __OPENCV_TS_PERF_HPP__
+#define __OPENCV_TS_PERF_HPP__
+
+#include "opencv2/core/core.hpp"
+#include "opencv2/imgproc/imgproc.hpp"
+#include "opencv2/features2d/features2d.hpp"
+#include "ts_gtest.h"
+
+#ifdef HAVE_TBB
+#include "tbb/task_scheduler_init.h"
+#endif
+
+#if !(defined(LOGD) || defined(LOGI) || defined(LOGW) || defined(LOGE))
+# if defined(ANDROID) && defined(USE_ANDROID_LOGGING)
+# include <android/log.h>
+
+# define PERF_TESTS_LOG_TAG "OpenCV_perf"
+# define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, PERF_TESTS_LOG_TAG, __VA_ARGS__))
+# define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, PERF_TESTS_LOG_TAG, __VA_ARGS__))
+# define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, PERF_TESTS_LOG_TAG, __VA_ARGS__))
+# define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, PERF_TESTS_LOG_TAG, __VA_ARGS__))
+# else
+# define LOGD(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
+# define LOGI(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
+# define LOGW(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
+# define LOGE(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
+# endif
+#endif
+
+// declare major namespaces to avoid errors on unknown namespace
+namespace cv { namespace gpu {} namespace ocl {} }
+
+namespace perf
+{
+class TestBase;
+
+/*****************************************************************************************\
+* Predefined typical frame sizes and typical test parameters *
+\*****************************************************************************************/
+const cv::Size szQVGA = cv::Size(320, 240);
+const cv::Size szVGA = cv::Size(640, 480);
+const cv::Size szSVGA = cv::Size(800, 600);
+const cv::Size szXGA = cv::Size(1024, 768);
+const cv::Size szSXGA = cv::Size(1280, 1024);
+const cv::Size szWQHD = cv::Size(2560, 1440);
+
+const cv::Size sznHD = cv::Size(640, 360);
+const cv::Size szqHD = cv::Size(960, 540);
+const cv::Size sz240p = szQVGA;
+const cv::Size sz720p = cv::Size(1280, 720);
+const cv::Size sz1080p = cv::Size(1920, 1080);
+const cv::Size sz1440p = szWQHD;
+const cv::Size sz2160p = cv::Size(3840, 2160);//UHDTV1 4K
+const cv::Size sz4320p = cv::Size(7680, 4320);//UHDTV2 8K
+
+const cv::Size sz3MP = cv::Size(2048, 1536);
+const cv::Size sz5MP = cv::Size(2592, 1944);
+const cv::Size sz2K = cv::Size(2048, 2048);
+
+const cv::Size szODD = cv::Size(127, 61);
+
+const cv::Size szSmall24 = cv::Size(24, 24);
+const cv::Size szSmall32 = cv::Size(32, 32);
+const cv::Size szSmall64 = cv::Size(64, 64);
+const cv::Size szSmall128 = cv::Size(128, 128);
+
+#define SZ_ALL_VGA ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA)
+#define SZ_ALL_GA ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA, ::perf::szXGA, ::perf::szSXGA)
+#define SZ_ALL_HD ::testing::Values(::perf::sznHD, ::perf::szqHD, ::perf::sz720p, ::perf::sz1080p)
+#define SZ_ALL_SMALL ::testing::Values(::perf::szSmall24, ::perf::szSmall32, ::perf::szSmall64, ::perf::szSmall128)
+#define SZ_ALL ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA, ::perf::szXGA, ::perf::szSXGA, ::perf::sznHD, ::perf::szqHD, ::perf::sz720p, ::perf::sz1080p)
+#define SZ_TYPICAL ::testing::Values(::perf::szVGA, ::perf::szqHD, ::perf::sz720p, ::perf::szODD)
+
+
+#define TYPICAL_MAT_SIZES ::perf::szVGA, ::perf::sz720p, ::perf::sz1080p, ::perf::szODD
+#define TYPICAL_MAT_TYPES CV_8UC1, CV_8UC4, CV_32FC1
+#define TYPICAL_MATS testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( TYPICAL_MAT_TYPES ) )
+#define TYPICAL_MATS_C1 testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( CV_8UC1, CV_32FC1 ) )
+#define TYPICAL_MATS_C4 testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( CV_8UC4 ) )
+
+
+/*****************************************************************************************\
+* MatType - printable wrapper over integer 'type' of Mat *
+\*****************************************************************************************/
+class MatType
+{
+public:
+ MatType(int val=0) : _type(val) {}
+ operator int() const {return _type;}
+
+private:
+ int _type;
+};
+
+/*****************************************************************************************\
+* CV_ENUM and CV_FLAGS - macro to create printable wrappers for defines and enums *
+\*****************************************************************************************/
+
+#define CV_ENUM(class_name, ...) \
+ namespace { \
+ struct class_name { \
+ class_name(int val = 0) : val_(val) {} \
+ operator int() const { return val_; } \
+ void PrintTo(std::ostream* os) const { \
+ using namespace cv;using namespace cv::gpu; using namespace cv::ocl; \
+ const int vals[] = { __VA_ARGS__ }; \
+ const char* svals = #__VA_ARGS__; \
+ for(int i = 0, pos = 0; i < (int)(sizeof(vals)/sizeof(int)); ++i) { \
+ while(isspace(svals[pos]) || svals[pos] == ',') ++pos; \
+ int start = pos; \
+ while(!(isspace(svals[pos]) || svals[pos] == ',' || svals[pos] == 0)) \
+ ++pos; \
+ if (val_ == vals[i]) { \
+ *os << std::string(svals + start, svals + pos); \
+ return; \
+ } \
+ } \
+ *os << "UNKNOWN"; \
+ } \
+ static ::testing::internal::ParamGenerator<class_name> all() { \
+ using namespace cv;using namespace cv::gpu; using namespace cv::ocl; \
+ static class_name vals[] = { __VA_ARGS__ }; \
+ return ::testing::ValuesIn(vals); \
+ } \
+ private: int val_; \
+ }; \
+ inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } }
+
+#define CV_FLAGS(class_name, ...) \
+ namespace { \
+ struct class_name { \
+ class_name(int val = 0) : val_(val) {} \
+ operator int() const { return val_; } \
+ void PrintTo(std::ostream* os) const { \
+ using namespace cv;using namespace cv::gpu; using namespace cv::ocl; \
+ const int vals[] = { __VA_ARGS__ }; \
+ const char* svals = #__VA_ARGS__; \
+ int value = val_; \
+ bool first = true; \
+ for(int i = 0, pos = 0; i < (int)(sizeof(vals)/sizeof(int)); ++i) { \
+ while(isspace(svals[pos]) || svals[pos] == ',') ++pos; \
+ int start = pos; \
+ while(!(isspace(svals[pos]) || svals[pos] == ',' || svals[pos] == 0)) \
+ ++pos; \
+ if ((value & vals[i]) == vals[i]) { \
+ value &= ~vals[i]; \
+ if (first) first = false; else *os << "|"; \
+ *os << std::string(svals + start, svals + pos); \
+ if (!value) return; \
+ } \
+ } \
+ if (first) *os << "UNKNOWN"; \
+ } \
+ private: int val_; \
+ }; \
+ inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } }
+
+CV_ENUM(MatDepth, CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F, CV_USRTYPE1)
+
+/*****************************************************************************************\
+* Regression control utility for performance testing *
+\*****************************************************************************************/
+enum ERROR_TYPE
+{
+ ERROR_ABSOLUTE = 0,
+ ERROR_RELATIVE = 1
+};
+
+class CV_EXPORTS Regression
+{
+public:
+ static Regression& add(TestBase* test, const std::string& name, cv::InputArray array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
+ static Regression& addKeypoints(TestBase* test, const std::string& name, const std::vector<cv::KeyPoint>& array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
+ static Regression& addMatches(TestBase* test, const std::string& name, const std::vector<cv::DMatch>& array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
+ static void Init(const std::string& testSuitName, const std::string& ext = ".xml");
+
+ Regression& operator() (const std::string& name, cv::InputArray array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
+
+private:
+ static Regression& instance();
+ Regression();
+ ~Regression();
+
+ Regression(const Regression&);
+ Regression& operator=(const Regression&);
+
+ cv::RNG regRNG;//own random numbers generator to make collection and verification work identical
+ std::string storageInPath;
+ std::string storageOutPath;
+ cv::FileStorage storageIn;
+ cv::FileStorage storageOut;
+ cv::FileNode rootIn;
+ std::string currentTestNodeName;
+ std::string suiteName;
+
+ cv::FileStorage& write();
+
+ static std::string getCurrentTestNodeName();
+ static bool isVector(cv::InputArray a);
+ static double getElem(cv::Mat& m, int x, int y, int cn = 0);
+
+ void init(const std::string& testSuitName, const std::string& ext);
+ void write(cv::InputArray array);
+ void write(cv::Mat m);
+ void verify(cv::FileNode node, cv::InputArray array, double eps, ERROR_TYPE err);
+ void verify(cv::FileNode node, cv::Mat actual, double eps, std::string argname, ERROR_TYPE err);
+};
+
+#define SANITY_CHECK(array, ...) ::perf::Regression::add(this, #array, array , ## __VA_ARGS__)
+#define SANITY_CHECK_KEYPOINTS(array, ...) ::perf::Regression::addKeypoints(this, #array, array , ## __VA_ARGS__)
+#define SANITY_CHECK_MATCHES(array, ...) ::perf::Regression::addMatches(this, #array, array , ## __VA_ARGS__)
+#define SANITY_CHECK_NOTHING() this->setVerified()
+
+class CV_EXPORTS GpuPerf
+{
+public:
+ static bool targetDevice();
+};
+
+#define PERF_RUN_GPU() ::perf::GpuPerf::targetDevice()
+
+/*****************************************************************************************\
+* Container for performance metrics *
+\*****************************************************************************************/
+typedef struct CV_EXPORTS performance_metrics
+{
+ size_t bytesIn;
+ size_t bytesOut;
+ unsigned int samples;
+ unsigned int outliers;
+ double gmean;
+ double gstddev;//stddev for log(time)
+ double mean;
+ double stddev;
+ double median;
+ double min;
+ double frequency;
+ int terminationReason;
+
+ enum
+ {
+ TERM_ITERATIONS = 0,
+ TERM_TIME = 1,
+ TERM_INTERRUPT = 2,
+ TERM_EXCEPTION = 3,
+ TERM_SKIP_TEST = 4, // there are some limitations and test should be skipped
+ TERM_UNKNOWN = -1
+ };
+
+ performance_metrics();
+ void clear();
+} performance_metrics;
+
+
+/*****************************************************************************************\
+* Strategy for performance measuring *
+\*****************************************************************************************/
+enum PERF_STRATEGY
+{
+ PERF_STRATEGY_BASE = 0,
+ PERF_STRATEGY_SIMPLE = 1
+};
+
+
+/*****************************************************************************************\
+* Base fixture for performance tests *
+\*****************************************************************************************/
+class CV_EXPORTS TestBase: public ::testing::Test
+{
+public:
+ TestBase();
+
+ static void Init(int argc, const char* const argv[]);
+ static void Init(const std::vector<std::string> & availableImpls,
+ int argc, const char* const argv[]);
+ static void RecordRunParameters();
+ static std::string getDataPath(const std::string& relativePath);
+ static std::string getSelectedImpl();
+
+ static enum PERF_STRATEGY getPerformanceStrategy();
+ static enum PERF_STRATEGY setPerformanceStrategy(enum PERF_STRATEGY strategy);
+
+ class PerfSkipTestException: public cv::Exception {};
+
+protected:
+ virtual void PerfTestBody() = 0;
+
+ virtual void SetUp();
+ virtual void TearDown();
+
+ void startTimer();
+ void stopTimer();
+ bool next();
+
+ //_declareHelper declare;
+
+ enum
+ {
+ WARMUP_READ,
+ WARMUP_WRITE,
+ WARMUP_RNG,
+ WARMUP_NONE
+ };
+
+ void reportMetrics(bool toJUnitXML = false);
+ static void warmup(cv::InputOutputArray a, int wtype = WARMUP_READ);
+
+ performance_metrics& calcMetrics();
+ void RunPerfTestBody();
+private:
+ typedef std::vector<std::pair<int, cv::Size> > SizeVector;
+ typedef std::vector<int64> TimeVector;
+
+ SizeVector inputData;
+ SizeVector outputData;
+ unsigned int getTotalInputSize() const;
+ unsigned int getTotalOutputSize() const;
+
+ TimeVector times;
+ int64 lastTime;
+ int64 totalTime;
+ int64 timeLimit;
+ static int64 timeLimitDefault;
+ static unsigned int iterationsLimitDefault;
+
+ unsigned int nIters;
+ unsigned int currentIter;
+ unsigned int runsPerIteration;
+
+ performance_metrics metrics;
+ void validateMetrics();
+
+ static int64 _timeadjustment;
+ static int64 _calibrate();
+
+ static void warmup_impl(cv::Mat m, int wtype);
+ static int getSizeInBytes(cv::InputArray a);
+ static cv::Size getSize(cv::InputArray a);
+ static void declareArray(SizeVector& sizes, cv::InputOutputArray a, int wtype = 0);
+
+ class CV_EXPORTS _declareHelper
+ {
+ public:
+ _declareHelper& in(cv::InputOutputArray a1, int wtype = WARMUP_READ);
+ _declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, int wtype = WARMUP_READ);
+ _declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, int wtype = WARMUP_READ);
+ _declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, cv::InputOutputArray a4, int wtype = WARMUP_READ);
+
+ _declareHelper& out(cv::InputOutputArray a1, int wtype = WARMUP_WRITE);
+ _declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, int wtype = WARMUP_WRITE);
+ _declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, int wtype = WARMUP_WRITE);
+ _declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, cv::InputOutputArray a4, int wtype = WARMUP_WRITE);
+
+ _declareHelper& iterations(unsigned int n);
+ _declareHelper& time(double timeLimitSecs);
+ _declareHelper& tbb_threads(int n = -1);
+ _declareHelper& runs(unsigned int runsNumber);
+ private:
+ TestBase* test;
+ _declareHelper(TestBase* t);
+ _declareHelper(const _declareHelper&);
+ _declareHelper& operator=(const _declareHelper&);
+ friend class TestBase;
+ };
+ friend class _declareHelper;
+
+ bool verified;
+
+public:
+ _declareHelper declare;
+
+ void setVerified() { this->verified = true; }
+};
+
+template<typename T> class TestBaseWithParam: public TestBase, public ::testing::WithParamInterface<T> {};
+
+typedef std::tr1::tuple<cv::Size, MatType> Size_MatType_t;
+typedef TestBaseWithParam<Size_MatType_t> Size_MatType;
+
+/*****************************************************************************************\
+* Print functions for googletest *
+\*****************************************************************************************/
+CV_EXPORTS void PrintTo(const MatType& t, std::ostream* os);
+
+} //namespace perf
+
+namespace cv
+{
+
+CV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os);
+
+} //namespace cv
+
+
+/*****************************************************************************************\
+* Macro definitions for performance tests *
+\*****************************************************************************************/
+#define PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name) \
+ test_case_name##_##test_name##_perf_namespace_proxy
+
+// Defines a performance test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The user should put his test code between braces after using this
+// macro. Example:
+//
+// PERF_TEST(FooTest, InitializesCorrectly) {
+// Foo foo;
+// EXPECT_TRUE(foo.StatusIsOK());
+// }
+#define PERF_TEST(test_case_name, test_name)\
+ namespace PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name) {\
+ class TestBase {/*compile error for this class means that you are trying to use perf::TestBase as a fixture*/};\
+ class test_case_name : public ::perf::TestBase {\
+ public:\
+ test_case_name() {}\
+ protected:\
+ virtual void PerfTestBody();\
+ };\
+ TEST_F(test_case_name, test_name){ RunPerfTestBody(); }\
+ }\
+ void PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name)::test_case_name::PerfTestBody()
+
+// Defines a performance test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name. The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier. The user should put
+// his test code between braces after using this macro. Example:
+//
+// class FooTest : public ::perf::TestBase {
+// protected:
+// virtual void SetUp() { TestBase::SetUp(); b_.AddElement(3); }
+//
+// Foo a_;
+// Foo b_;
+// };
+//
+// PERF_TEST_F(FooTest, InitializesCorrectly) {
+// EXPECT_TRUE(a_.StatusIsOK());
+// }
+//
+// PERF_TEST_F(FooTest, ReturnsElementCountCorrectly) {
+// EXPECT_EQ(0, a_.size());
+// EXPECT_EQ(1, b_.size());
+// }
+#define PERF_TEST_F(fixture, testname) \
+ namespace PERF_PROXY_NAMESPACE_NAME_(fixture, testname) {\
+ class TestBase {/*compile error for this class means that you are trying to use perf::TestBase as a fixture*/};\
+ class fixture : public ::fixture {\
+ public:\
+ fixture() {}\
+ protected:\
+ virtual void PerfTestBody();\
+ };\
+ TEST_F(fixture, testname){ RunPerfTestBody(); }\
+ }\
+ void PERF_PROXY_NAMESPACE_NAME_(fixture, testname)::fixture::PerfTestBody()
+
+// Defines a parametrized performance test.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name. The second parameter is the
+// name of the test within the test case.
+//
+// The user should put his test code between braces after using this
+// macro. Example:
+//
+// typedef ::perf::TestBaseWithParam<cv::Size> FooTest;
+//
+// PERF_TEST_P(FooTest, DoTestingRight, ::testing::Values(::perf::szVGA, ::perf::sz720p) {
+// cv::Mat b(GetParam(), CV_8U, cv::Scalar(10));
+// cv::Mat a(GetParam(), CV_8U, cv::Scalar(20));
+// cv::Mat c(GetParam(), CV_8U, cv::Scalar(0));
+//
+// declare.in(a, b).out(c).time(0.5);
+//
+// TEST_CYCLE() cv::add(a, b, c);
+//
+// SANITY_CHECK(c);
+// }
+#define PERF_TEST_P(fixture, name, params) \
+ class fixture##_##name : public fixture {\
+ public:\
+ fixture##_##name() {}\
+ protected:\
+ virtual void PerfTestBody();\
+ };\
+ TEST_P(fixture##_##name, name /*perf*/){ RunPerfTestBody(); }\
+ INSTANTIATE_TEST_CASE_P(/*none*/, fixture##_##name, params);\
+ void fixture##_##name::PerfTestBody()
+
+#ifndef __CV_TEST_EXEC_ARGS
+#if defined(_MSC_VER) && (_MSC_VER <= 1400)
+#define __CV_TEST_EXEC_ARGS(...) \
+ while (++argc >= (--argc,-1)) {__VA_ARGS__; break;} /*this ugly construction is needed for VS 2005*/
+#else
+#define __CV_TEST_EXEC_ARGS(...) \
+ __VA_ARGS__;
+#endif
+#endif
+
+#define CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, ...) \
+ ::perf::Regression::Init(#modulename); \
+ ::perf::TestBase::Init(std::vector<std::string>(impls, impls + sizeof impls / sizeof *impls), \
+ argc, argv); \
+ ::testing::InitGoogleTest(&argc, argv); \
+ cvtest::printVersionInfo(); \
+ ::testing::Test::RecordProperty("cv_module_name", #modulename); \
+ ::perf::TestBase::RecordRunParameters(); \
+ __CV_TEST_EXEC_ARGS(__VA_ARGS__) \
+ return RUN_ALL_TESTS();
+
+// impls must be an array, not a pointer; "plain" should always be one of the implementations
+#define CV_PERF_TEST_MAIN_WITH_IMPLS(modulename, impls, ...) \
+int main(int argc, char **argv)\
+{\
+ CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, __VA_ARGS__)\
+}
+
+#define CV_PERF_TEST_MAIN(modulename, ...) \
+int main(int argc, char **argv)\
+{\
+ const char * plain_only[] = { "plain" };\
+ CV_PERF_TEST_MAIN_INTERNALS(modulename, plain_only, __VA_ARGS__)\
+}
+
+#define TEST_CYCLE_N(n) for(declare.iterations(n); startTimer(), next(); stopTimer())
+#define TEST_CYCLE() for(; startTimer(), next(); stopTimer())
+#define TEST_CYCLE_MULTIRUN(runsNum) for(declare.runs(runsNum); startTimer(), next(); stopTimer()) for(int r = 0; r < runsNum; ++r)
+
+namespace perf
+{
+namespace comparators
+{
+
+template<typename T>
+struct CV_EXPORTS RectLess_
+{
+ bool operator()(const cv::Rect_<T>& r1, const cv::Rect_<T>& 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);
+ }
+};
+
+typedef RectLess_<int> RectLess;
+
+struct CV_EXPORTS KeypointGreater
+{
+ 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;
+ return kp1.pt.x < kp2.pt.x;
+ }
+};
+
+} //namespace comparators
+
+void CV_EXPORTS sort(std::vector<cv::KeyPoint>& pts, cv::InputOutputArray descriptors);
+} //namespace perf
+
+#endif //__OPENCV_TS_PERF_HPP__