1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef __OPENCV_TS_PERF_HPP__
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define __OPENCV_TS_PERF_HPP__
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/core.hpp"
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "ts_gtest.h"
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "ts_ext.hpp"
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <functional>
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if !(defined(LOGD) || defined(LOGI) || defined(LOGW) || defined(LOGE))
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# if defined(ANDROID) && defined(USE_ANDROID_LOGGING)
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  include <android/log.h>
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define PERF_TESTS_LOG_TAG "OpenCV_perf"
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, PERF_TESTS_LOG_TAG, __VA_ARGS__))
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, PERF_TESTS_LOG_TAG, __VA_ARGS__))
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, PERF_TESTS_LOG_TAG, __VA_ARGS__))
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, PERF_TESTS_LOG_TAG, __VA_ARGS__))
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# else
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGD(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGI(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGW(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  define LOGE(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// declare major namespaces to avoid errors on unknown namespace
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace cv { namespace cuda {} namespace ocl {} }
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace perf
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass TestBase;
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                Predefined typical frame sizes and typical test parameters               *
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szQVGA = cv::Size(320, 240);
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szVGA = cv::Size(640, 480);
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szSVGA = cv::Size(800, 600);
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szXGA = cv::Size(1024, 768);
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szSXGA = cv::Size(1280, 1024);
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szWQHD = cv::Size(2560, 1440);
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sznHD = cv::Size(640, 360);
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szqHD = cv::Size(960, 540);
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz240p = szQVGA;
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz720p = cv::Size(1280, 720);
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz1080p = cv::Size(1920, 1080);
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz1440p = szWQHD;
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz2160p = cv::Size(3840, 2160);//UHDTV1 4K
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz4320p = cv::Size(7680, 4320);//UHDTV2 8K
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz3MP = cv::Size(2048, 1536);
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz5MP = cv::Size(2592, 1944);
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size sz2K = cv::Size(2048, 2048);
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szODD = cv::Size(127, 61);
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szSmall24 = cv::Size(24, 24);
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szSmall32 = cv::Size(32, 32);
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szSmall64 = cv::Size(64, 64);
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst cv::Size szSmall128 = cv::Size(128, 128);
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SZ_ALL_VGA ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA)
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SZ_ALL_GA  ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA, ::perf::szXGA, ::perf::szSXGA)
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SZ_ALL_HD  ::testing::Values(::perf::sznHD, ::perf::szqHD, ::perf::sz720p, ::perf::sz1080p)
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SZ_ALL_SMALL ::testing::Values(::perf::szSmall24, ::perf::szSmall32, ::perf::szSmall64, ::perf::szSmall128)
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SZ_ALL  ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA, ::perf::szXGA, ::perf::szSXGA, ::perf::sznHD, ::perf::szqHD, ::perf::sz720p, ::perf::sz1080p)
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SZ_TYPICAL  ::testing::Values(::perf::szVGA, ::perf::szqHD, ::perf::sz720p, ::perf::szODD)
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TYPICAL_MAT_SIZES ::perf::szVGA, ::perf::sz720p, ::perf::sz1080p, ::perf::szODD
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TYPICAL_MAT_TYPES CV_8UC1, CV_8UC4, CV_32FC1
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TYPICAL_MATS testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( TYPICAL_MAT_TYPES ) )
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TYPICAL_MATS_C1 testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( CV_8UC1, CV_32FC1 ) )
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TYPICAL_MATS_C4 testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( CV_8UC4 ) )
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                MatType - printable wrapper over integer 'type' of Mat                   *
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass MatType
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    MatType(int val=0) : _type(val) {}
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator int() const {return _type;}
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprivate:
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int _type;
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*     CV_ENUM and CV_FLAGS - macro to create printable wrappers for defines and enums     *
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_ENUM(class_name, ...)                                                        \
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    namespace {                                                                         \
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    struct class_name {                                                                 \
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        class_name(int val = 0) : val_(val) {}                                          \
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        operator int() const { return val_; }                                           \
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        void PrintTo(std::ostream* os) const {                                          \
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            using namespace cv;using namespace cv::cuda; using namespace cv::ocl;        \
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const int vals[] = { __VA_ARGS__ };                                         \
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const char* svals = #__VA_ARGS__;                                           \
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            for(int i = 0, pos = 0; i < (int)(sizeof(vals)/sizeof(int)); ++i) {         \
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                while(isspace(svals[pos]) || svals[pos] == ',') ++pos;                  \
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int start = pos;                                                        \
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                while(!(isspace(svals[pos]) || svals[pos] == ',' || svals[pos] == 0))   \
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    ++pos;                                                              \
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (val_ == vals[i]) {                                                  \
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *os << std::string(svals + start, svals + pos);                     \
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return;                                                             \
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }                                                                       \
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }                                                                           \
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *os << "UNKNOWN";                                                           \
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }                                                                               \
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        static ::testing::internal::ParamGenerator<class_name> all() {                  \
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            using namespace cv;using namespace cv::cuda; using namespace cv::ocl;        \
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            static class_name vals[] = { __VA_ARGS__ };                                 \
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return ::testing::ValuesIn(vals);                                           \
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }                                                                               \
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    private: int val_;                                                                  \
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };                                                                                  \
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } }
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_FLAGS(class_name, ...)                                                       \
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    namespace {                                                                         \
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    struct class_name {                                                                 \
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        class_name(int val = 0) : val_(val) {}                                          \
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        operator int() const { return val_; }                                           \
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        void PrintTo(std::ostream* os) const {                                          \
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            using namespace cv;using namespace cv::cuda; using namespace cv::ocl;        \
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const int vals[] = { __VA_ARGS__ };                                         \
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const char* svals = #__VA_ARGS__;                                           \
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int value = val_;                                                           \
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            bool first = true;                                                          \
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            for(int i = 0, pos = 0; i < (int)(sizeof(vals)/sizeof(int)); ++i) {         \
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                while(isspace(svals[pos]) || svals[pos] == ',') ++pos;                  \
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int start = pos;                                                        \
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                while(!(isspace(svals[pos]) || svals[pos] == ',' || svals[pos] == 0))   \
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    ++pos;                                                              \
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if ((value & vals[i]) == vals[i]) {                                     \
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    value &= ~vals[i];                                                  \
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (first) first = false; else *os << "|";                          \
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    *os << std::string(svals + start, svals + pos);                     \
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!value) return;                                                 \
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }                                                                       \
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }                                                                           \
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (first) *os << "UNKNOWN";                                                \
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }                                                                               \
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    private: int val_;                                                                  \
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };                                                                                  \
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } }
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_ENUM(MatDepth, CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F, CV_USRTYPE1)
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                 Regression control utility for performance testing                      *
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerenum ERROR_TYPE
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERROR_ABSOLUTE = 0,
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERROR_RELATIVE = 1
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS Regression
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static Regression& add(TestBase* test, const std::string& name, cv::InputArray array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static Regression& addMoments(TestBase* test, const std::string& name, const cv::Moments & array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static Regression& addKeypoints(TestBase* test, const std::string& name, const std::vector<cv::KeyPoint>& array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static Regression& addMatches(TestBase* test, const std::string& name, const std::vector<cv::DMatch>& array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static void Init(const std::string& testSuitName, const std::string& ext = ".xml");
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Regression& operator() (const std::string& name, cv::InputArray array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprivate:
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static Regression& instance();
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Regression();
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ~Regression();
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Regression(const Regression&);
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Regression& operator=(const Regression&);
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::RNG regRNG;//own random numbers generator to make collection and verification work identical
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::string storageInPath;
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::string storageOutPath;
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::FileStorage storageIn;
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::FileStorage storageOut;
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::FileNode rootIn;
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::string currentTestNodeName;
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::string suiteName;
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::FileStorage& write();
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static std::string getCurrentTestNodeName();
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static bool isVector(cv::InputArray a);
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static double getElem(cv::Mat& m, int x, int y, int cn = 0);
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void init(const std::string& testSuitName, const std::string& ext);
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void write(cv::InputArray array);
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void write(cv::Mat m);
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void verify(cv::FileNode node, cv::InputArray array, double eps, ERROR_TYPE err);
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void verify(cv::FileNode node, cv::Mat actual, double eps, std::string argname, ERROR_TYPE err);
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SANITY_CHECK(array, ...) ::perf::Regression::add(this, #array, array , ## __VA_ARGS__)
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SANITY_CHECK_MOMENTS(array, ...) ::perf::Regression::addMoments(this, #array, array , ## __VA_ARGS__)
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SANITY_CHECK_KEYPOINTS(array, ...) ::perf::Regression::addKeypoints(this, #array, array , ## __VA_ARGS__)
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SANITY_CHECK_MATCHES(array, ...) ::perf::Regression::addMatches(this, #array, array , ## __VA_ARGS__)
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define SANITY_CHECK_NOTHING() this->setVerified()
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS GpuPerf
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  static bool targetDevice();
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define PERF_RUN_CUDA()  ::perf::GpuPerf::targetDevice()
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                            Container for performance metrics                            *
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct CV_EXPORTS performance_metrics
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t bytesIn;
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t bytesOut;
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int samples;
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int outliers;
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double gmean;
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double gstddev;//stddev for log(time)
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double mean;
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double stddev;
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double median;
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double min;
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double frequency;
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int terminationReason;
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TERM_ITERATIONS = 0,
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TERM_TIME = 1,
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TERM_INTERRUPT = 2,
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TERM_EXCEPTION = 3,
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TERM_SKIP_TEST = 4, // there are some limitations and test should be skipped
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TERM_UNKNOWN = -1
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    performance_metrics();
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void clear();
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} performance_metrics;
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                           Strategy for performance measuring                            *
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerenum PERF_STRATEGY
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    PERF_STRATEGY_DEFAULT = -1,
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    PERF_STRATEGY_BASE = 0,
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    PERF_STRATEGY_SIMPLE = 1
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                           Base fixture for performance tests                            *
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef CV_COLLECT_IMPL_DATA
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Implementation collection processing class.
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Accumulates and shapes implementation data.
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct ImplData
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool ipp;
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool icv;
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool ipp_mt;
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool ocl;
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool plain;
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::vector<int> implCode;
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::vector<cv::String> funName;
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ImplData()
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        Reset();
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void Reset()
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv::setImpl(0);
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ipp = icv = ocl = ipp_mt = false;
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        implCode.clear();
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        funName.clear();
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void GetImpl()
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        flagsToVars(cv::getImpl(implCode, funName));
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::vector<cv::String> GetCallsForImpl(int impl)
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        std::vector<cv::String> out;
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for(int i = 0; i < implCode.size(); i++)
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(impl == implCode[i])
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                out.push_back(funName[i]);
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return out;
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Remove duplicate entries
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void ShapeUp()
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        std::vector<int> savedCode;
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        std::vector<cv::String> savedName;
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for(int i = 0; i < implCode.size(); i++)
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            bool match = false;
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            for(int j = 0; j < savedCode.size(); j++)
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if(implCode[i] == savedCode[j] && !funName[i].compare(savedName[j]))
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    match = true;
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(!match)
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                savedCode.push_back(implCode[i]);
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                savedName.push_back(funName[i]);
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        implCode = savedCode;
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        funName = savedName;
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // convert flags register to more handy variables
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void flagsToVars(int flags)
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(HAVE_IPP_ICV_ONLY)
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ipp    = 0;
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icv    = ((flags&CV_IMPL_IPP) > 0);
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ipp    = ((flags&CV_IMPL_IPP) > 0);
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icv    = 0;
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ipp_mt = ((flags&CV_IMPL_MT) > 0);
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ocl    = ((flags&CV_IMPL_OCL) > 0);
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        plain  = (flags == 0);
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} ImplData;
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CV_EXPORTS TestBase: public ::testing::Test
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TestBase();
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static void Init(int argc, const char* const argv[]);
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static void Init(const std::vector<std::string> & availableImpls,
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     int argc, const char* const argv[]);
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static void RecordRunParameters();
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static std::string getDataPath(const std::string& relativePath);
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static std::string getSelectedImpl();
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static enum PERF_STRATEGY getCurrentModulePerformanceStrategy();
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static enum PERF_STRATEGY setModulePerformanceStrategy(enum PERF_STRATEGY strategy);
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    class PerfSkipTestException: public cv::Exception {};
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprotected:
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void PerfTestBody() = 0;
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void SetUp();
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtual void TearDown();
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void startTimer();
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void stopTimer();
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool next();
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    PERF_STRATEGY getCurrentPerformanceStrategy() const;
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum WarmUpType
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WARMUP_READ,
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WARMUP_WRITE,
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WARMUP_RNG,
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WARMUP_NONE
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void reportMetrics(bool toJUnitXML = false);
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static void warmup(cv::InputOutputArray a, WarmUpType wtype = WARMUP_READ);
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    performance_metrics& calcMetrics();
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void RunPerfTestBody();
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef CV_COLLECT_IMPL_DATA
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ImplData implConf;
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprivate:
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    typedef std::vector<std::pair<int, cv::Size> > SizeVector;
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    typedef std::vector<int64> TimeVector;
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SizeVector inputData;
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SizeVector outputData;
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int getTotalInputSize() const;
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int getTotalOutputSize() const;
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    enum PERF_STRATEGY testStrategy;
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TimeVector times;
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int64 lastTime;
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int64 totalTime;
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int64 timeLimit;
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static int64 timeLimitDefault;
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static unsigned int iterationsLimitDefault;
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int minIters;
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int nIters;
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int currentIter;
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int runsPerIteration;
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned int perfValidationStage;
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    performance_metrics metrics;
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void validateMetrics();
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static int64 _timeadjustment;
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static int64 _calibrate();
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static void warmup_impl(cv::Mat m, WarmUpType wtype);
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static int getSizeInBytes(cv::InputArray a);
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static cv::Size getSize(cv::InputArray a);
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static void declareArray(SizeVector& sizes, cv::InputOutputArray a, WarmUpType wtype);
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    class CV_EXPORTS _declareHelper
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    public:
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& in(cv::InputOutputArray a1, WarmUpType wtype = WARMUP_READ);
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, WarmUpType wtype = WARMUP_READ);
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, WarmUpType wtype = WARMUP_READ);
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, cv::InputOutputArray a4, WarmUpType wtype = WARMUP_READ);
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& out(cv::InputOutputArray a1, WarmUpType wtype = WARMUP_WRITE);
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, WarmUpType wtype = WARMUP_WRITE);
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, WarmUpType wtype = WARMUP_WRITE);
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, cv::InputOutputArray a4, WarmUpType wtype = WARMUP_WRITE);
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& iterations(unsigned int n);
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& time(double timeLimitSecs);
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& tbb_threads(int n = -1);
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& runs(unsigned int runsNumber);
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& strategy(enum PERF_STRATEGY s);
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    private:
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TestBase* test;
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper(TestBase* t);
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper(const _declareHelper&);
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        _declareHelper& operator=(const _declareHelper&);
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        friend class TestBase;
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    friend class _declareHelper;
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool verified;
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpublic:
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    _declareHelper declare;
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void setVerified() { this->verified = true; }
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename T> class TestBaseWithParam: public TestBase, public ::testing::WithParamInterface<T> {};
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef std::tr1::tuple<cv::Size, MatType> Size_MatType_t;
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef TestBaseWithParam<Size_MatType_t> Size_MatType;
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef std::tr1::tuple<cv::Size, MatDepth> Size_MatDepth_t;
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef TestBaseWithParam<Size_MatDepth_t> Size_MatDepth;
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                              Print functions for googletest                             *
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void PrintTo(const MatType& t, std::ostream* os);
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} //namespace perf
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace cv
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void PrintTo(const String& str, ::std::ostream* os);
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_EXPORTS void PrintTo(const Size& sz, ::std::ostream* os);
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} //namespace cv
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*****************************************************************************************\
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler*                        Macro definitions for performance tests                          *
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler\*****************************************************************************************/
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name) \
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  test_case_name##_##test_name##_perf_namespace_proxy
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Defines a performance test.
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The first parameter is the name of the test case, and the second
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// parameter is the name of the test within the test case.
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The user should put his test code between braces after using this
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// macro.  Example:
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   PERF_TEST(FooTest, InitializesCorrectly) {
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     Foo foo;
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     EXPECT_TRUE(foo.StatusIsOK());
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   }
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define PERF_TEST(test_case_name, test_name)\
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    namespace PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name) {\
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     class TestBase {/*compile error for this class means that you are trying to use perf::TestBase as a fixture*/};\
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     class test_case_name : public ::perf::TestBase {\
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      public:\
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       test_case_name() {}\
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      protected:\
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       virtual void PerfTestBody();\
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     };\
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     TEST_F(test_case_name, test_name){ RunPerfTestBody(); }\
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }\
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name)::test_case_name::PerfTestBody()
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Defines a performance test that uses a test fixture.
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The first parameter is the name of the test fixture class, which
533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// also doubles as the test case name.  The second parameter is the
534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// name of the test within the test case.
535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// A test fixture class must be declared earlier.  The user should put
537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// his test code between braces after using this macro.  Example:
538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   class FooTest : public ::perf::TestBase {
540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//    protected:
541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     virtual void SetUp() { TestBase::SetUp(); b_.AddElement(3); }
542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     Foo a_;
544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     Foo b_;
545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   };
546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   PERF_TEST_F(FooTest, InitializesCorrectly) {
548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     EXPECT_TRUE(a_.StatusIsOK());
549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   }
550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   PERF_TEST_F(FooTest, ReturnsElementCountCorrectly) {
552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     EXPECT_EQ(0, a_.size());
553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     EXPECT_EQ(1, b_.size());
554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   }
555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define PERF_TEST_F(fixture, testname) \
556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    namespace PERF_PROXY_NAMESPACE_NAME_(fixture, testname) {\
557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     class TestBase {/*compile error for this class means that you are trying to use perf::TestBase as a fixture*/};\
558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     class fixture : public ::fixture {\
559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      public:\
560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       fixture() {}\
561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      protected:\
562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       virtual void PerfTestBody();\
563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     };\
564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     TEST_F(fixture, testname){ RunPerfTestBody(); }\
565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }\
566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void PERF_PROXY_NAMESPACE_NAME_(fixture, testname)::fixture::PerfTestBody()
567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Defines a parametrized performance test.
569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The first parameter is the name of the test fixture class, which
571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// also doubles as the test case name.  The second parameter is the
572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// name of the test within the test case.
573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The user should put his test code between braces after using this
575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// macro.  Example:
576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   typedef ::perf::TestBaseWithParam<cv::Size> FooTest;
578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   PERF_TEST_P(FooTest, DoTestingRight, ::testing::Values(::perf::szVGA, ::perf::sz720p) {
580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     cv::Mat b(GetParam(), CV_8U, cv::Scalar(10));
581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     cv::Mat a(GetParam(), CV_8U, cv::Scalar(20));
582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     cv::Mat c(GetParam(), CV_8U, cv::Scalar(0));
583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     declare.in(a, b).out(c).time(0.5);
585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     TEST_CYCLE() cv::add(a, b, c);
587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     SANITY_CHECK(c);
589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   }
590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define PERF_TEST_P(fixture, name, params)  \
591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    class fixture##_##name : public fixture {\
592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     public:\
593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      fixture##_##name() {}\
594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     protected:\
595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      virtual void PerfTestBody();\
596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };\
597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TEST_P(fixture##_##name, name /*perf*/){ RunPerfTestBody(); }\
598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    INSTANTIATE_TEST_CASE_P(/*none*/, fixture##_##name, params);\
599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void fixture##_##name::PerfTestBody()
600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef __CV_TEST_EXEC_ARGS
602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(_MSC_VER) && (_MSC_VER <= 1400)
603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define __CV_TEST_EXEC_ARGS(...)    \
604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (++argc >= (--argc,-1)) {__VA_ARGS__; break;} /*this ugly construction is needed for VS 2005*/
605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define __CV_TEST_EXEC_ARGS(...)    \
607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __VA_ARGS__;
608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENCL
612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace cvtest { namespace ocl {
613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid dumpOpenCLDevice();
614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}}
615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TEST_DUMP_OCL_INFO cvtest::ocl::dumpOpenCLDevice();
616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TEST_DUMP_OCL_INFO
618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, ...)	\
621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ::perf::Regression::Init(#modulename); \
622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ::perf::TestBase::Init(std::vector<std::string>(impls, impls + sizeof impls / sizeof *impls), \
623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                           argc, argv); \
624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ::testing::InitGoogleTest(&argc, argv); \
625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvtest::printVersionInfo(); \
626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ::testing::Test::RecordProperty("cv_module_name", #modulename); \
627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ::perf::TestBase::RecordRunParameters(); \
628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __CV_TEST_EXEC_ARGS(__VA_ARGS__) \
629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TEST_DUMP_OCL_INFO \
630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return RUN_ALL_TESTS();
631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// impls must be an array, not a pointer; "plain" should always be one of the implementations
633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_PERF_TEST_MAIN_WITH_IMPLS(modulename, impls, ...) \
634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint main(int argc, char **argv)\
635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{\
636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, __VA_ARGS__)\
637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_PERF_TEST_MAIN(modulename, ...) \
640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint main(int argc, char **argv)\
641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{\
642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const char * plain_only[] = { "plain" };\
643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_PERF_TEST_MAIN_INTERNALS(modulename, plain_only, __VA_ARGS__)\
644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TEST_CYCLE_N(n) for(declare.iterations(n); startTimer(), next(); stopTimer())
647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TEST_CYCLE() for(; startTimer(), next(); stopTimer())
648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TEST_CYCLE_MULTIRUN(runsNum) for(declare.runs(runsNum); startTimer(), next(); stopTimer()) for(int r = 0; r < runsNum; ++r)
649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace perf
651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace comparators
653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<typename T>
656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstruct CV_EXPORTS RectLess_ :
657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        public std::binary_function<cv::Rect_<T>, cv::Rect_<T>, bool>
658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  bool operator()(const cv::Rect_<T>& r1, const cv::Rect_<T>& r2) const
660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  {
661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return r1.x < r2.x ||
662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (r1.x == r2.x && r1.y < r2.y) ||
663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (r1.x == r2.x && r1.y == r2.y && r1.width < r2.width) ||
664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (r1.x == r2.x && r1.y == r2.y && r1.width == r2.width && r1.height < r2.height);
665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef RectLess_<int> RectLess;
669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstruct CV_EXPORTS KeypointGreater :
671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        public std::binary_function<cv::KeyPoint, cv::KeyPoint, bool>
672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool operator()(const cv::KeyPoint& kp1, const cv::KeyPoint& kp2) const
674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.response > kp2.response) return true;
676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.response < kp2.response) return false;
677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.size > kp2.size) return true;
678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.size < kp2.size) return false;
679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.octave > kp2.octave) return true;
680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.octave < kp2.octave) return false;
681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.pt.y < kp2.pt.y) return false;
682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (kp1.pt.y > kp2.pt.y) return true;
683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return kp1.pt.x < kp2.pt.x;
684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} //namespace comparators
688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid CV_EXPORTS sort(std::vector<cv::KeyPoint>& pts, cv::InputOutputArray descriptors);
690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} //namespace perf
691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif //__OPENCV_TS_PERF_HPP__
693