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