vendor: OpenCV 5.0.0 snapshot at 40738fb16ceddb5fb3fea747585f7ce6abb0605b
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,125 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef OPENCV_CUDA_PERF_UTILITY_HPP
|
||||
#define OPENCV_CUDA_PERF_UTILITY_HPP
|
||||
|
||||
#include "opencv2/ts.hpp"
|
||||
|
||||
#include "opencv2/ts/ts_perf.hpp"
|
||||
|
||||
namespace perf
|
||||
{
|
||||
#define ALL_BORDER_MODES BorderMode::all()
|
||||
#define ALL_INTERPOLATIONS Interpolation::all()
|
||||
|
||||
CV_ENUM(BorderMode, BORDER_REFLECT101, BORDER_REPLICATE, BORDER_CONSTANT, BORDER_REFLECT, BORDER_WRAP)
|
||||
CV_ENUM(Interpolation, INTER_NEAREST, INTER_LINEAR, INTER_CUBIC, INTER_AREA)
|
||||
CV_ENUM(NormType, NORM_INF, NORM_L1, NORM_L2, NORM_HAMMING, NORM_MINMAX)
|
||||
|
||||
enum { Gray = 1, TwoChannel = 2, BGR = 3, BGRA = 4 };
|
||||
CV_ENUM(MatCn, Gray, TwoChannel, BGR, BGRA)
|
||||
|
||||
#define CUDA_CHANNELS_1_3_4 testing::Values(MatCn(Gray), MatCn(BGR), MatCn(BGRA))
|
||||
#define CUDA_CHANNELS_1_3 testing::Values(MatCn(Gray), MatCn(BGR))
|
||||
|
||||
#define GET_PARAM(k) testing::get< k >(GetParam())
|
||||
|
||||
#define DEF_PARAM_TEST(name, ...) typedef ::perf::TestBaseWithParam< testing::tuple< __VA_ARGS__ > > name
|
||||
#define DEF_PARAM_TEST_1(name, param_type) typedef ::perf::TestBaseWithParam< param_type > name
|
||||
|
||||
DEF_PARAM_TEST_1(Sz, cv::Size);
|
||||
typedef perf::Size_MatType Sz_Type;
|
||||
DEF_PARAM_TEST(Sz_Depth, cv::Size, perf::MatDepth);
|
||||
DEF_PARAM_TEST(Sz_Depth_Cn, cv::Size, perf::MatDepth, MatCn);
|
||||
|
||||
#define CUDA_TYPICAL_MAT_SIZES testing::Values(perf::sz720p, perf::szSXGA, perf::sz1080p)
|
||||
|
||||
#define FAIL_NO_CPU() FAIL() << "No such CPU implementation analogy"
|
||||
|
||||
#define CUDA_SANITY_CHECK(mat, ...) \
|
||||
do{ \
|
||||
cv::Mat gpu_##mat(mat); \
|
||||
SANITY_CHECK(gpu_##mat, ## __VA_ARGS__); \
|
||||
} while(0)
|
||||
|
||||
#define CPU_SANITY_CHECK(mat, ...) \
|
||||
do{ \
|
||||
cv::Mat cpu_##mat(mat); \
|
||||
SANITY_CHECK(cpu_##mat, ## __VA_ARGS__); \
|
||||
} while(0)
|
||||
|
||||
cv::Mat readImage(const std::string& fileName, int flags = cv::IMREAD_COLOR);
|
||||
|
||||
struct CvtColorInfo
|
||||
{
|
||||
int scn;
|
||||
int dcn;
|
||||
int code;
|
||||
|
||||
CvtColorInfo() {}
|
||||
explicit CvtColorInfo(int scn_, int dcn_, int code_) : scn(scn_), dcn(dcn_), code(code_) {}
|
||||
};
|
||||
void PrintTo(const CvtColorInfo& info, std::ostream* os);
|
||||
|
||||
void printCudaInfo();
|
||||
|
||||
void sortKeyPoints(std::vector<cv::KeyPoint>& keypoints, cv::InputOutputArray _descriptors = cv::noArray());
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
#define CV_PERF_TEST_CUDA_MAIN(modulename) \
|
||||
int main(int argc, char **argv)\
|
||||
{\
|
||||
const char * impls[] = { "cuda", "plain" };\
|
||||
CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, perf::printCudaInfo())\
|
||||
}
|
||||
#else
|
||||
#define CV_PERF_TEST_CUDA_MAIN(modulename) \
|
||||
int main(int argc, char **argv)\
|
||||
{\
|
||||
const char * plain_only[] = { "plain" };\
|
||||
CV_PERF_TEST_MAIN_INTERNALS(modulename, plain_only)\
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // OPENCV_CUDA_PERF_UTILITY_HPP
|
||||
@@ -0,0 +1,377 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef OPENCV_CUDA_TEST_UTILITY_HPP
|
||||
#define OPENCV_CUDA_TEST_UTILITY_HPP
|
||||
|
||||
#include "opencv2/ts.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
#include "opencv2/core/cuda.hpp"
|
||||
|
||||
namespace cvtest
|
||||
{
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// random generators
|
||||
|
||||
int randomInt(int minVal, int maxVal);
|
||||
double randomDouble(double minVal, double maxVal);
|
||||
cv::Size randomSize(int minVal, int maxVal);
|
||||
cv::Scalar randomScalar(double minVal, double maxVal);
|
||||
cv::Mat randomMat(cv::Size size, int type, double minVal = 0.0, double maxVal = 255.0);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// GpuMat create
|
||||
|
||||
cv::cuda::GpuMat createMat(cv::Size size, int type, bool useRoi = false);
|
||||
cv::cuda::GpuMat createMat(cv::Size size, int type, cv::Size& size0, cv::Point& ofs, bool useRoi = false);
|
||||
cv::cuda::GpuMat loadMat(const cv::Mat& m, bool useRoi = false);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image load
|
||||
|
||||
//! read image from testdata folder
|
||||
cv::Mat readImage(const std::string& fileName, int flags = cv::IMREAD_COLOR);
|
||||
|
||||
//! read image from testdata folder and convert it to specified type
|
||||
cv::Mat readImageType(const std::string& fname, int type);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Gpu devices
|
||||
|
||||
//! return true if device supports specified feature and gpu module was built with support the feature.
|
||||
bool supportFeature(const cv::cuda::DeviceInfo& info, cv::cuda::FeatureSet feature);
|
||||
|
||||
class DeviceManager
|
||||
{
|
||||
public:
|
||||
static DeviceManager& instance();
|
||||
|
||||
void load(int i);
|
||||
void loadAll();
|
||||
|
||||
const std::vector<cv::cuda::DeviceInfo>& values() const { return devices_; }
|
||||
|
||||
private:
|
||||
std::vector<cv::cuda::DeviceInfo> devices_;
|
||||
};
|
||||
|
||||
#define ALL_DEVICES testing::ValuesIn(cvtest::DeviceManager::instance().values())
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Additional assertion
|
||||
|
||||
void minMaxLocGold(const cv::Mat& src, double* minVal_, double* maxVal_ = 0, cv::Point* minLoc_ = 0, cv::Point* maxLoc_ = 0, const cv::Mat& mask = cv::Mat());
|
||||
|
||||
cv::Mat getMat(cv::InputArray arr);
|
||||
|
||||
testing::AssertionResult assertMatNear(const char* expr1, const char* expr2, const char* eps_expr, cv::InputArray m1, cv::InputArray m2, double eps);
|
||||
|
||||
#undef EXPECT_MAT_NEAR
|
||||
#define EXPECT_MAT_NEAR(m1, m2, eps) EXPECT_PRED_FORMAT3(cvtest::assertMatNear, m1, m2, eps)
|
||||
#define ASSERT_MAT_NEAR(m1, m2, eps) ASSERT_PRED_FORMAT3(cvtest::assertMatNear, m1, m2, eps)
|
||||
|
||||
#define EXPECT_SCALAR_NEAR(s1, s2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(s1[0], s2[0], eps); \
|
||||
EXPECT_NEAR(s1[1], s2[1], eps); \
|
||||
EXPECT_NEAR(s1[2], s2[2], eps); \
|
||||
EXPECT_NEAR(s1[3], s2[3], eps); \
|
||||
}
|
||||
#define ASSERT_SCALAR_NEAR(s1, s2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(s1[0], s2[0], eps); \
|
||||
ASSERT_NEAR(s1[1], s2[1], eps); \
|
||||
ASSERT_NEAR(s1[2], s2[2], eps); \
|
||||
ASSERT_NEAR(s1[3], s2[3], eps); \
|
||||
}
|
||||
|
||||
#define EXPECT_POINT2_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(p1.x, p2.x, eps); \
|
||||
EXPECT_NEAR(p1.y, p2.y, eps); \
|
||||
}
|
||||
#define ASSERT_POINT2_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(p1.x, p2.x, eps); \
|
||||
ASSERT_NEAR(p1.y, p2.y, eps); \
|
||||
}
|
||||
|
||||
#define EXPECT_POINT3_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(p1.x, p2.x, eps); \
|
||||
EXPECT_NEAR(p1.y, p2.y, eps); \
|
||||
EXPECT_NEAR(p1.z, p2.z, eps); \
|
||||
}
|
||||
#define ASSERT_POINT3_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(p1.x, p2.x, eps); \
|
||||
ASSERT_NEAR(p1.y, p2.y, eps); \
|
||||
ASSERT_NEAR(p1.z, p2.z, eps); \
|
||||
}
|
||||
|
||||
double checkSimilarity(cv::InputArray m1, cv::InputArray m2);
|
||||
|
||||
#undef EXPECT_MAT_SIMILAR
|
||||
#define EXPECT_MAT_SIMILAR(mat1, mat2, eps) \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
EXPECT_LE(checkSimilarity(mat1, mat2), eps); \
|
||||
}
|
||||
#define ASSERT_MAT_SIMILAR(mat1, mat2, eps) \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
ASSERT_LE(checkSimilarity(mat1, mat2), eps); \
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Helper structs for value-parameterized tests
|
||||
|
||||
#define CUDA_TEST_P(test_case_name, test_name) \
|
||||
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
|
||||
: public test_case_name { \
|
||||
public: \
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
|
||||
virtual void TestBody(); \
|
||||
private: \
|
||||
void UnsafeTestBody(); \
|
||||
static int AddToRegistry() { \
|
||||
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
|
||||
GetTestCasePatternHolder<test_case_name>(\
|
||||
#test_case_name, \
|
||||
::testing::internal::CodeLocation(\
|
||||
__FILE__, __LINE__))->AddTestPattern(\
|
||||
#test_case_name, \
|
||||
#test_name, \
|
||||
new ::testing::internal::TestMetaFactory< \
|
||||
GTEST_TEST_CLASS_NAME_(\
|
||||
test_case_name, test_name)>()); \
|
||||
return 0; \
|
||||
} \
|
||||
static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
|
||||
}; \
|
||||
int GTEST_TEST_CLASS_NAME_(test_case_name, \
|
||||
test_name)::gtest_registering_dummy_ = \
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() \
|
||||
{ \
|
||||
try \
|
||||
{ \
|
||||
UnsafeTestBody(); \
|
||||
} \
|
||||
catch (const cvtest::details::SkipTestExceptionBase& e) \
|
||||
{ \
|
||||
printf("[ SKIP ] %s\n", e.what()); \
|
||||
cv::cuda::resetDevice(); \
|
||||
} \
|
||||
catch (...) \
|
||||
{ \
|
||||
cv::cuda::resetDevice(); \
|
||||
throw; \
|
||||
} \
|
||||
} \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::UnsafeTestBody()
|
||||
|
||||
#define DIFFERENT_SIZES testing::Values(cv::Size(128, 128), cv::Size(113, 113))
|
||||
|
||||
#define DIFFERENT_SIZES_EXTRA testing::Values(cv::Size(13, 1), cv::Size(1, 13), cv::Size(128, 128), cv::Size(113, 113))
|
||||
|
||||
// Depth
|
||||
|
||||
using perf::MatDepth;
|
||||
|
||||
#define ALL_DEPTH testing::Values(MatDepth(CV_8U), MatDepth(CV_8S), MatDepth(CV_16U), MatDepth(CV_16S), MatDepth(CV_32S), MatDepth(CV_32F), MatDepth(CV_64F))
|
||||
|
||||
#define DEPTH_PAIRS testing::Values(std::make_pair(MatDepth(CV_8U), MatDepth(CV_8U)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_16U)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_16S)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_16U)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_16S)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_32F), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_32F), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_64F), MatDepth(CV_64F)))
|
||||
|
||||
// Type
|
||||
|
||||
using perf::MatType;
|
||||
|
||||
//! return vector with types from specified range.
|
||||
std::vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end);
|
||||
|
||||
//! return vector with all types (depth: CV_8U-CV_64F, channels: 1-4).
|
||||
const std::vector<MatType>& all_types();
|
||||
|
||||
#define ALL_TYPES testing::ValuesIn(all_types())
|
||||
#define TYPES(depth_start, depth_end, cn_start, cn_end) testing::ValuesIn(types(depth_start, depth_end, cn_start, cn_end))
|
||||
|
||||
// ROI
|
||||
|
||||
class UseRoi
|
||||
{
|
||||
public:
|
||||
inline UseRoi(bool val = false) : val_(val) {}
|
||||
|
||||
inline operator bool() const { return val_; }
|
||||
|
||||
private:
|
||||
bool val_;
|
||||
};
|
||||
|
||||
void PrintTo(const UseRoi& useRoi, std::ostream* os);
|
||||
|
||||
#define WHOLE_SUBMAT testing::Values(UseRoi(false), UseRoi(true))
|
||||
|
||||
// Direct/Inverse
|
||||
|
||||
class Inverse
|
||||
{
|
||||
public:
|
||||
inline Inverse(bool val = false) : val_(val) {}
|
||||
|
||||
inline operator bool() const { return val_; }
|
||||
|
||||
private:
|
||||
bool val_;
|
||||
};
|
||||
|
||||
void PrintTo(const Inverse& useRoi, std::ostream* os);
|
||||
|
||||
#define DIRECT_INVERSE testing::Values(Inverse(false), Inverse(true))
|
||||
|
||||
// Param class
|
||||
|
||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
||||
class name \
|
||||
{ \
|
||||
public: \
|
||||
name ( type arg = type ()) : val_(arg) {} \
|
||||
operator type () const {return val_;} \
|
||||
private: \
|
||||
type val_; \
|
||||
}; \
|
||||
inline void PrintTo( name param, std::ostream* os) \
|
||||
{ \
|
||||
*os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \
|
||||
}
|
||||
|
||||
IMPLEMENT_PARAM_CLASS(Channels, int)
|
||||
|
||||
#define ALL_CHANNELS testing::Values(Channels(1), Channels(2), Channels(3), Channels(4))
|
||||
#define IMAGE_CHANNELS testing::Values(Channels(1), Channels(3), Channels(4))
|
||||
|
||||
// Flags and enums
|
||||
|
||||
CV_ENUM(NormCode, NORM_INF, NORM_L1, NORM_L2, NORM_TYPE_MASK, NORM_RELATIVE, NORM_MINMAX)
|
||||
|
||||
CV_ENUM(Interpolation, INTER_NEAREST, INTER_LINEAR, INTER_CUBIC, INTER_AREA)
|
||||
|
||||
CV_ENUM(BorderType, BORDER_REFLECT101, BORDER_REPLICATE, BORDER_CONSTANT, BORDER_REFLECT, BORDER_WRAP)
|
||||
#define ALL_BORDER_TYPES testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP))
|
||||
|
||||
CV_FLAGS(WarpFlags, INTER_NEAREST, INTER_LINEAR, INTER_CUBIC, WARP_INVERSE_MAP)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Features
|
||||
|
||||
testing::AssertionResult assertKeyPointsEquals(const char* gold_expr, const char* actual_expr, std::vector<cv::KeyPoint>& gold, std::vector<cv::KeyPoint>& actual);
|
||||
|
||||
#define ASSERT_KEYPOINTS_EQ(gold, actual) EXPECT_PRED_FORMAT2(assertKeyPointsEquals, gold, actual)
|
||||
|
||||
int getMatchedPointsCount(std::vector<cv::KeyPoint>& gold, std::vector<cv::KeyPoint>& actual);
|
||||
int getMatchedPointsCount(const std::vector<cv::KeyPoint>& keypoints1, const std::vector<cv::KeyPoint>& keypoints2, const std::vector<cv::DMatch>& matches);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Other
|
||||
|
||||
void dumpImage(const std::string& fileName, const cv::Mat& image);
|
||||
void showDiff(cv::InputArray gold, cv::InputArray actual, double eps);
|
||||
|
||||
void parseCudaDeviceOptions(int argc, char **argv);
|
||||
void printCudaInfo();
|
||||
}
|
||||
|
||||
namespace cv { namespace cuda
|
||||
{
|
||||
void PrintTo(const DeviceInfo& info, std::ostream* os);
|
||||
}}
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
#define CV_TEST_INIT0_CUDA cvtest::parseCudaDeviceOptions(argc, argv), cvtest::printCudaInfo(), cv::setUseOptimized(false)
|
||||
|
||||
#define CV_CUDA_TEST_MAIN(resourcesubdir, ...) \
|
||||
CV_TEST_MAIN_EX(resourcesubdir, CUDA, __VA_ARGS__)
|
||||
|
||||
#else // HAVE_CUDA
|
||||
|
||||
#define CV_CUDA_TEST_MAIN(resourcesubdir) \
|
||||
int main() \
|
||||
{ \
|
||||
printf("OpenCV was built without CUDA support\n"); \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
|
||||
#endif // OPENCV_CUDA_TEST_UTILITY_HPP
|
||||
@@ -0,0 +1,140 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the OpenCV Foundation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef OPENCV_TS_OCL_PERF_HPP
|
||||
#define OPENCV_TS_OCL_PERF_HPP
|
||||
|
||||
#include "opencv2/ts.hpp"
|
||||
|
||||
#include "ocl_test.hpp"
|
||||
#include "ts_perf.hpp"
|
||||
|
||||
namespace cvtest {
|
||||
namespace ocl {
|
||||
|
||||
using namespace perf;
|
||||
|
||||
#define OCL_PERF_STRATEGY PERF_STRATEGY_SIMPLE
|
||||
|
||||
#define OCL_PERF_TEST(fixture, name) SIMPLE_PERF_TEST(fixture, name)
|
||||
#define OCL_PERF_TEST_P(fixture, name, params) SIMPLE_PERF_TEST_P(fixture, name, params)
|
||||
|
||||
#define SIMPLE_PERF_TEST(fixture, name) \
|
||||
class OCL##_##fixture##_##name : \
|
||||
public ::perf::TestBase \
|
||||
{ \
|
||||
public: \
|
||||
OCL##_##fixture##_##name() { } \
|
||||
protected: \
|
||||
virtual void PerfTestBody() CV_OVERRIDE; \
|
||||
}; \
|
||||
TEST_F(OCL##_##fixture##_##name, name) { CV_TRACE_REGION("PERF_TEST: " #fixture "_" #name); declare.strategy(OCL_PERF_STRATEGY); RunPerfTestBody(); } \
|
||||
void OCL##_##fixture##_##name::PerfTestBody()
|
||||
|
||||
#define SIMPLE_PERF_TEST_P(fixture, name, params) \
|
||||
class OCL##_##fixture##_##name : \
|
||||
public fixture \
|
||||
{ \
|
||||
public: \
|
||||
OCL##_##fixture##_##name() { } \
|
||||
protected: \
|
||||
virtual void PerfTestBody() CV_OVERRIDE; \
|
||||
}; \
|
||||
TEST_P(OCL##_##fixture##_##name, name) { CV_TRACE_REGION("PERF_TEST_P: " #fixture "_" #name); declare.strategy(OCL_PERF_STRATEGY); RunPerfTestBody(); } \
|
||||
INSTANTIATE_TEST_CASE_P(/*none*/, OCL##_##fixture##_##name, params); \
|
||||
void OCL##_##fixture##_##name::PerfTestBody()
|
||||
|
||||
#define OCL_SIZE_1 szVGA
|
||||
#define OCL_SIZE_2 sz720p
|
||||
#define OCL_SIZE_3 sz1080p
|
||||
#define OCL_SIZE_4 sz2160p
|
||||
|
||||
#define OCL_TEST_SIZES ::testing::Values(OCL_SIZE_1, OCL_SIZE_2, OCL_SIZE_3, OCL_SIZE_4)
|
||||
#define OCL_TEST_TYPES ::testing::Values(CV_8UC1, CV_32FC1, CV_8UC4, CV_32FC4)
|
||||
#define OCL_TEST_TYPES_14 OCL_TEST_TYPES
|
||||
#define OCL_TEST_TYPES_134 ::testing::Values(CV_8UC1, CV_32FC1, CV_8UC3, CV_32FC3, CV_8UC4, CV_32FC4)
|
||||
|
||||
#define OCL_PERF_ENUM ::testing::Values
|
||||
|
||||
//! deprecated
|
||||
#define OCL_TEST_CYCLE() \
|
||||
for (cvtest::ocl::perf::safeFinish(); next() && startTimer(); cvtest::ocl::perf::safeFinish(), stopTimer())
|
||||
//! deprecated
|
||||
#define OCL_TEST_CYCLE_N(n) \
|
||||
for (declare.iterations(n), cvtest::ocl::perf::safeFinish(); next() && startTimer(); cvtest::ocl::perf::safeFinish(), stopTimer())
|
||||
//! deprecated
|
||||
#define OCL_TEST_CYCLE_MULTIRUN(runsNum) \
|
||||
for (declare.runs(runsNum), cvtest::ocl::perf::safeFinish(); next() && startTimer(); cvtest::ocl::perf::safeFinish(), stopTimer()) \
|
||||
for (int r = 0; r < runsNum; cvtest::ocl::perf::safeFinish(), ++r)
|
||||
|
||||
#undef PERF_SAMPLE_BEGIN
|
||||
#undef PERF_SAMPLE_END
|
||||
#define PERF_SAMPLE_BEGIN() \
|
||||
cvtest::ocl::perf::safeFinish(); \
|
||||
for(; next() && startTimer(); cvtest::ocl::perf::safeFinish(), stopTimer()) \
|
||||
{ \
|
||||
CV_TRACE_REGION("iteration");
|
||||
#define PERF_SAMPLE_END() \
|
||||
}
|
||||
|
||||
|
||||
namespace perf {
|
||||
|
||||
// Check for current device limitation
|
||||
void checkDeviceMaxMemoryAllocSize(const Size& size, int type, int factor = 1);
|
||||
|
||||
// Initialize Mat with random numbers. Range is depends on the data type.
|
||||
// TODO Parameter type is actually OutputArray
|
||||
void randu(InputOutputArray dst);
|
||||
|
||||
inline void safeFinish()
|
||||
{
|
||||
if (cv::ocl::useOpenCL())
|
||||
cv::ocl::finish();
|
||||
}
|
||||
|
||||
} // namespace perf
|
||||
using namespace perf;
|
||||
|
||||
} // namespace cvtest::ocl
|
||||
} // namespace cvtest
|
||||
|
||||
#endif // OPENCV_TS_OCL_PERF_HPP
|
||||
@@ -0,0 +1,405 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the OpenCV Foundation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef OPENCV_TS_OCL_TEST_HPP
|
||||
#define OPENCV_TS_OCL_TEST_HPP
|
||||
|
||||
#include "opencv2/ts.hpp"
|
||||
|
||||
#include "opencv2/imgcodecs.hpp"
|
||||
#include "opencv2/videoio.hpp"
|
||||
#include "opencv2/highgui.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
#include "opencv2/core/ocl.hpp"
|
||||
|
||||
namespace cvtest {
|
||||
namespace ocl {
|
||||
|
||||
using namespace cv;
|
||||
using namespace testing;
|
||||
|
||||
inline std::vector<UMat> ToUMat(const std::vector<Mat>& src)
|
||||
{
|
||||
std::vector<UMat> dst;
|
||||
dst.resize(src.size());
|
||||
for (size_t i = 0; i < src.size(); ++i)
|
||||
{
|
||||
src[i].copyTo(dst[i]);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
inline UMat ToUMat(const Mat& src)
|
||||
{
|
||||
UMat dst;
|
||||
src.copyTo(dst);
|
||||
return dst;
|
||||
}
|
||||
|
||||
inline UMat ToUMat(InputArray src)
|
||||
{
|
||||
UMat dst;
|
||||
src.getMat().copyTo(dst);
|
||||
return dst;
|
||||
}
|
||||
|
||||
extern int test_loop_times;
|
||||
|
||||
#define MAX_VALUE 357
|
||||
|
||||
#define EXPECT_MAT_NORM(mat, eps) \
|
||||
do \
|
||||
{ \
|
||||
EXPECT_LE(cvtest::ocl::TestUtils::checkNorm1(mat), eps) \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#undef EXPECT_MAT_NEAR
|
||||
#define EXPECT_MAT_NEAR(mat1, mat2, eps) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
EXPECT_LE(cvtest::ocl::TestUtils::checkNorm2(mat1, mat2), eps) \
|
||||
<< "Size: " << mat1.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#define EXPECT_MAT_NEAR_RELATIVE(mat1, mat2, eps) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ((mat1).type(), (mat2).type()); \
|
||||
ASSERT_EQ((mat1).size(), (mat2).size()); \
|
||||
EXPECT_LE(cvtest::ocl::TestUtils::checkNormRelative((mat1), (mat2)), eps) \
|
||||
<< "Size: " << (mat1).size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#define EXPECT_MAT_N_DIFF_EPS(mat1, mat2, eps, num) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
Mat diff, mask; \
|
||||
absdiff(mat1, mat2, diff); \
|
||||
cv::compare(diff.reshape(1), Scalar::all(eps), mask, CMP_GT); \
|
||||
EXPECT_LE(countNonZero(mask), num) \
|
||||
<< "Size: " << mat1.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#define EXPECT_MAT_N_DIFF(mat1, mat2, num) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
Mat diff; \
|
||||
absdiff(mat1, mat2, diff); \
|
||||
EXPECT_LE(countNonZero(diff.reshape(1)), num) \
|
||||
<< "Size: " << mat1.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#define OCL_EXPECT_MAT_N_DIFF(name, eps) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(name ## _roi.type(), u ## name ## _roi.type()); \
|
||||
ASSERT_EQ(name ## _roi.size(), u ## name ## _roi.size()); \
|
||||
Mat diff, binary, binary_8; \
|
||||
absdiff(name ## _roi, u ## name ## _roi, diff); \
|
||||
Mat mask(diff.size(), CV_8UC(dst.channels()), cv::Scalar::all(255)); \
|
||||
if (mask.cols > 2 && mask.rows > 2) \
|
||||
mask(cv::Rect(1, 1, mask.cols - 2, mask.rows - 2)).setTo(0); \
|
||||
cv::threshold(diff, binary, (double)eps, 255, cv::THRESH_BINARY); \
|
||||
EXPECT_LE(countNonZero(binary.reshape(1)), (int)(binary.cols*binary.rows*5/1000)) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
binary.convertTo(binary_8, mask.type()); \
|
||||
binary_8 = binary_8 & mask; \
|
||||
EXPECT_LE(countNonZero(binary_8.reshape(1)), (int)((binary_8.cols+binary_8.rows)/100)) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#define OCL_EXPECT_MATS_NEAR(name, eps) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(name ## _roi.type(), u ## name ## _roi.type()); \
|
||||
ASSERT_EQ(name ## _roi.size(), u ## name ## _roi.size()); \
|
||||
EXPECT_LE(cvtest::ocl::TestUtils::checkNorm2(name ## _roi, u ## name ## _roi), eps) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
Point _offset; \
|
||||
Size _wholeSize; \
|
||||
u ## name ## _roi.locateROI(_wholeSize, _offset); \
|
||||
Mat _mask(name.size(), CV_8UC1, Scalar::all(255)); \
|
||||
_mask(Rect(_offset, name ## _roi.size())).setTo(Scalar::all(0)); \
|
||||
ASSERT_EQ(name.type(), u ## name.type()); \
|
||||
ASSERT_EQ(name.size(), u ## name.size()); \
|
||||
EXPECT_LE(cvtest::ocl::TestUtils::checkNorm2(name, u ## name, _mask), eps) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#define OCL_EXPECT_MATS_NEAR_RELATIVE(name, eps) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(name ## _roi.type(), u ## name ## _roi.type()); \
|
||||
ASSERT_EQ(name ## _roi.size(), u ## name ## _roi.size()); \
|
||||
EXPECT_LE(TestUtils::checkNormRelative(name ## _roi, u ## name ## _roi), eps) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
Point _offset; \
|
||||
Size _wholeSize; \
|
||||
name ## _roi.locateROI(_wholeSize, _offset); \
|
||||
Mat _mask(name.size(), CV_8UC1, Scalar::all(255)); \
|
||||
_mask(Rect(_offset, name ## _roi.size())).setTo(Scalar::all(0)); \
|
||||
ASSERT_EQ(name.type(), u ## name.type()); \
|
||||
ASSERT_EQ(name.size(), u ## name.size()); \
|
||||
EXPECT_LE(TestUtils::checkNormRelative(name, u ## name, _mask), eps) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
//for sparse matrix
|
||||
#define OCL_EXPECT_MATS_NEAR_RELATIVE_SPARSE(name, eps) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(name ## _roi.type(), u ## name ## _roi.type()); \
|
||||
ASSERT_EQ(name ## _roi.size(), u ## name ## _roi.size()); \
|
||||
EXPECT_LE(cvtest::ocl::TestUtils::checkNormRelativeSparse(name ## _roi, u ## name ## _roi), eps) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
Point _offset; \
|
||||
Size _wholeSize; \
|
||||
name ## _roi.locateROI(_wholeSize, _offset); \
|
||||
Mat _mask(name.size(), CV_8UC1, Scalar::all(255)); \
|
||||
_mask(Rect(_offset, name ## _roi.size())).setTo(Scalar::all(0)); \
|
||||
ASSERT_EQ(name.type(), u ## name.type()); \
|
||||
ASSERT_EQ(name.size(), u ## name.size()); \
|
||||
EXPECT_LE(cvtest::ocl::TestUtils::checkNormRelativeSparse(name, u ## name, _mask), eps) \
|
||||
<< "Size: " << name ## _roi.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#undef EXPECT_MAT_SIMILAR
|
||||
#define EXPECT_MAT_SIMILAR(mat1, mat2, eps) \
|
||||
do \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
EXPECT_LE(checkSimilarity(mat1, mat2), eps) \
|
||||
<< "Size: " << mat1.size() << std::endl; \
|
||||
} while ((void)0, 0)
|
||||
|
||||
using perf::MatDepth;
|
||||
using perf::MatType;
|
||||
|
||||
#define OCL_RNG_SEED 123456
|
||||
|
||||
struct TestUtils
|
||||
{
|
||||
cv::RNG rng;
|
||||
|
||||
TestUtils()
|
||||
{
|
||||
rng = cv::RNG(OCL_RNG_SEED);
|
||||
}
|
||||
|
||||
int randomInt(int minVal, int maxVal)
|
||||
{
|
||||
return rng.uniform(minVal, maxVal);
|
||||
}
|
||||
|
||||
double randomDouble(double minVal, double maxVal)
|
||||
{
|
||||
return rng.uniform(minVal, maxVal);
|
||||
}
|
||||
|
||||
double randomDoubleLog(double minVal, double maxVal)
|
||||
{
|
||||
double logMin = log((double)minVal + 1);
|
||||
double logMax = log((double)maxVal + 1);
|
||||
double pow = rng.uniform(logMin, logMax);
|
||||
double v = exp(pow) - 1;
|
||||
CV_Assert(v >= minVal && (v < maxVal || (v == minVal && v == maxVal)));
|
||||
return v;
|
||||
}
|
||||
|
||||
Size randomSize(int minVal, int maxVal)
|
||||
{
|
||||
#if 1
|
||||
return cv::Size((int)randomDoubleLog(minVal, maxVal), (int)randomDoubleLog(minVal, maxVal));
|
||||
#else
|
||||
return cv::Size(randomInt(minVal, maxVal), randomInt(minVal, maxVal));
|
||||
#endif
|
||||
}
|
||||
|
||||
Size randomSize(int minValX, int maxValX, int minValY, int maxValY)
|
||||
{
|
||||
#if 1
|
||||
return cv::Size((int)randomDoubleLog(minValX, maxValX), (int)randomDoubleLog(minValY, maxValY));
|
||||
#else
|
||||
return cv::Size(randomInt(minVal, maxVal), randomInt(minVal, maxVal));
|
||||
#endif
|
||||
}
|
||||
|
||||
Scalar randomScalar(double minVal, double maxVal)
|
||||
{
|
||||
return Scalar(randomDouble(minVal, maxVal), randomDouble(minVal, maxVal), randomDouble(minVal, maxVal), randomDouble(minVal, maxVal));
|
||||
}
|
||||
|
||||
Mat randomMat(Size size, int type, double minVal, double maxVal, bool useRoi = false)
|
||||
{
|
||||
RNG dataRng(rng.next());
|
||||
return cvtest::randomMat(dataRng, size, type, minVal, maxVal, useRoi);
|
||||
}
|
||||
|
||||
struct Border
|
||||
{
|
||||
int top, bot, lef, rig;
|
||||
};
|
||||
|
||||
Border randomBorder(int minValue = 0, int maxValue = MAX_VALUE)
|
||||
{
|
||||
Border border = {
|
||||
(int)randomDoubleLog(minValue, maxValue),
|
||||
(int)randomDoubleLog(minValue, maxValue),
|
||||
(int)randomDoubleLog(minValue, maxValue),
|
||||
(int)randomDoubleLog(minValue, maxValue)
|
||||
};
|
||||
return border;
|
||||
}
|
||||
|
||||
void randomSubMat(Mat& whole, Mat& subMat, const Size& roiSize, const Border& border, int type, double minVal, double maxVal)
|
||||
{
|
||||
Size wholeSize = Size(roiSize.width + border.lef + border.rig, roiSize.height + border.top + border.bot);
|
||||
whole = randomMat(wholeSize, type, minVal, maxVal, false);
|
||||
subMat = whole(Rect(border.lef, border.top, roiSize.width, roiSize.height));
|
||||
}
|
||||
|
||||
// If the two vectors are not equal, it will return the difference in vector size
|
||||
// Else it will return (total diff of each 1 and 2 rects covered pixels)/(total 1 rects covered pixels)
|
||||
// The smaller, the better matched
|
||||
static double checkRectSimilarity(const cv::Size & sz, std::vector<cv::Rect>& ob1, std::vector<cv::Rect>& ob2);
|
||||
|
||||
//! read image from testdata folder.
|
||||
static cv::Mat readImage(const String &fileName, int flags = cv::IMREAD_COLOR);
|
||||
static cv::Mat readImageType(const String &fname, int type);
|
||||
|
||||
static double checkNorm1(InputArray m, InputArray mask = noArray());
|
||||
static double checkNorm2(InputArray m1, InputArray m2, InputArray mask = noArray());
|
||||
static double checkSimilarity(InputArray m1, InputArray m2);
|
||||
static void showDiff(InputArray _src, InputArray _gold, InputArray _actual, double eps, bool alwaysShow);
|
||||
|
||||
static inline double checkNormRelative(InputArray m1, InputArray m2, InputArray mask = noArray())
|
||||
{
|
||||
return cvtest::norm(m1.getMat(), m2.getMat(), cv::NORM_INF, mask) /
|
||||
std::max((double)std::numeric_limits<float>::epsilon(),
|
||||
(double)std::max(cvtest::norm(m1.getMat(), cv::NORM_INF), cvtest::norm(m2.getMat(), cv::NORM_INF)));
|
||||
}
|
||||
|
||||
static inline double checkNormRelativeSparse(InputArray m1, InputArray m2, InputArray mask = noArray())
|
||||
{
|
||||
double norm_inf = cvtest::norm(m1.getMat(), m2.getMat(), cv::NORM_INF, mask);
|
||||
double norm_rel = norm_inf /
|
||||
std::max((double)std::numeric_limits<float>::epsilon(),
|
||||
(double)std::max(cvtest::norm(m1.getMat(), cv::NORM_INF), cvtest::norm(m2.getMat(), cv::NORM_INF)));
|
||||
return std::min(norm_inf, norm_rel);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#define TEST_DECLARE_INPUT_PARAMETER(name) Mat name, name ## _roi; UMat u ## name, u ## name ## _roi
|
||||
#define TEST_DECLARE_OUTPUT_PARAMETER(name) TEST_DECLARE_INPUT_PARAMETER(name)
|
||||
|
||||
#define UMAT_UPLOAD_INPUT_PARAMETER(name) \
|
||||
do \
|
||||
{ \
|
||||
name.copyTo(u ## name); \
|
||||
Size _wholeSize; Point ofs; name ## _roi.locateROI(_wholeSize, ofs); \
|
||||
u ## name ## _roi = u ## name(Rect(ofs.x, ofs.y, name ## _roi.size().width, name ## _roi.size().height)); \
|
||||
} while ((void)0, 0)
|
||||
|
||||
#define UMAT_UPLOAD_OUTPUT_PARAMETER(name) UMAT_UPLOAD_INPUT_PARAMETER(name)
|
||||
|
||||
template <typename T>
|
||||
struct TSTestWithParam : public TestUtils, public ::testing::TestWithParam<T>
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
#undef PARAM_TEST_CASE
|
||||
#define PARAM_TEST_CASE(name, ...) struct name : public ::cvtest::ocl::TSTestWithParam< testing::tuple< __VA_ARGS__ > >
|
||||
|
||||
#ifndef IMPLEMENT_PARAM_CLASS
|
||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
||||
class name \
|
||||
{ \
|
||||
public: \
|
||||
name ( type arg = type ()) : val_(arg) {} \
|
||||
operator type () const {return val_;} \
|
||||
private: \
|
||||
type val_; \
|
||||
}; \
|
||||
inline void PrintTo( name param, std::ostream* os) \
|
||||
{ \
|
||||
*os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \
|
||||
}
|
||||
|
||||
IMPLEMENT_PARAM_CLASS(Channels, int)
|
||||
#endif // IMPLEMENT_PARAM_CLASS
|
||||
|
||||
#define OCL_TEST_P TEST_P
|
||||
#define OCL_TEST_F(name, ...) typedef name OCL_##name; TEST_F(OCL_##name, __VA_ARGS__)
|
||||
#define OCL_TEST(name, ...) TEST(OCL_##name, __VA_ARGS__)
|
||||
|
||||
#define OCL_OFF(...) cv::ocl::setUseOpenCL(false); __VA_ARGS__ ;
|
||||
#define OCL_ON(...) cv::ocl::setUseOpenCL(true); __VA_ARGS__ ;
|
||||
|
||||
#define OCL_ALL_DEPTHS Values(CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F)
|
||||
#define OCL_ABSOLUTELY_ALL_DEPTHS Values(CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32U, CV_64S, CV_64U, CV_16F, CV_16BF, CV_32F, CV_64F, CV_Bool)
|
||||
//, CV_16F, CV_16BF, CV_64U, CV_64S, CV_32U)
|
||||
#define OCL_ALL_DEPTHS_16F Values(CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F, CV_16F)
|
||||
#define OCL_ALL_CHANNELS Values(1, 2, 3, 4)
|
||||
|
||||
CV_ENUM(Interpolation, INTER_NEAREST, INTER_LINEAR, INTER_CUBIC, INTER_AREA, INTER_LINEAR_EXACT)
|
||||
CV_ENUM(ThreshOp, THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO, THRESH_TOZERO_INV)
|
||||
CV_ENUM(BorderType, BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_REFLECT_101)
|
||||
|
||||
#define OCL_INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
|
||||
INSTANTIATE_TEST_CASE_P(OCL_ ## prefix, test_case_name, generator)
|
||||
|
||||
} } // namespace cvtest::ocl
|
||||
|
||||
namespace opencv_test {
|
||||
namespace ocl {
|
||||
using namespace cvtest::ocl;
|
||||
}} // namespace
|
||||
|
||||
#endif // OPENCV_TS_OCL_TEST_HPP
|
||||
@@ -0,0 +1,244 @@
|
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
|
||||
// Copyright (C) 2014, Intel, Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
|
||||
#ifndef OPENCV_TS_EXT_HPP
|
||||
#define OPENCV_TS_EXT_HPP
|
||||
|
||||
namespace cvtest {
|
||||
void checkIppStatus();
|
||||
extern bool skipUnstableTests;
|
||||
extern bool runBigDataTests;
|
||||
extern int testThreads;
|
||||
extern int debugLevel; ///< 0 - no debug, 1 - basic test debug information, >1 - extra debug information
|
||||
|
||||
void testSetUp();
|
||||
void testTearDown();
|
||||
|
||||
bool checkBigDataTests();
|
||||
|
||||
}
|
||||
|
||||
// check for required "opencv_test" namespace
|
||||
#if !defined(CV_TEST_SKIP_NAMESPACE_CHECK) && defined(__OPENCV_BUILD)
|
||||
#define CV__TEST_NAMESPACE_CHECK required_opencv_test_namespace = true;
|
||||
#else
|
||||
#define CV__TEST_NAMESPACE_CHECK // nothing
|
||||
#endif
|
||||
|
||||
#define CV__TEST_INIT \
|
||||
CV__TEST_NAMESPACE_CHECK \
|
||||
if (setUpSkipped) \
|
||||
return; \
|
||||
::cvtest::testSetUp();
|
||||
#define CV__TEST_CLEANUP ::cvtest::testTearDown();
|
||||
#define CV__TEST_BODY_IMPL(name) \
|
||||
{ \
|
||||
CV__TRACE_APP_FUNCTION_NAME(name); \
|
||||
try { \
|
||||
CV__TEST_INIT \
|
||||
Body(); \
|
||||
CV__TEST_CLEANUP \
|
||||
} \
|
||||
catch (const cvtest::details::SkipTestExceptionBase& e) \
|
||||
{ \
|
||||
printf("[ SKIP ] %s\n", e.what()); \
|
||||
} \
|
||||
} \
|
||||
|
||||
#define CV__TEST_SETUP_IMPL(parent_class) { \
|
||||
setUpSkipped = false; \
|
||||
try { \
|
||||
parent_class::SetUp(); \
|
||||
} catch (const cvtest::details::SkipTestExceptionBase& e) { \
|
||||
setUpSkipped = true; \
|
||||
printf("[ SKIP ] %s\n", e.what()); \
|
||||
} \
|
||||
} \
|
||||
|
||||
struct SkipThisTest : public ::testing::Test {
|
||||
SkipThisTest(const std::string& msg_) : msg(msg_) {}
|
||||
|
||||
virtual void TestBody() CV_OVERRIDE {
|
||||
printf("[ SKIP ] %s\n", msg.c_str());
|
||||
}
|
||||
|
||||
std::string msg;
|
||||
};
|
||||
|
||||
#undef TEST
|
||||
#define TEST_(test_case_name, test_name, parent_class, bodyMethodName, BODY_ATTR, BODY_IMPL) \
|
||||
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
|
||||
public:\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
|
||||
private:\
|
||||
bool setUpSkipped = false; \
|
||||
virtual void TestBody() CV_OVERRIDE;\
|
||||
virtual void bodyMethodName() BODY_ATTR;\
|
||||
virtual void SetUp() CV_OVERRIDE; \
|
||||
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
|
||||
};\
|
||||
class test_case_name##test_name##_factory : public ::testing::internal::TestFactoryBase { \
|
||||
public:\
|
||||
virtual ::testing::Test* CreateTest() CV_OVERRIDE { \
|
||||
try { \
|
||||
return new GTEST_TEST_CLASS_NAME_(test_case_name, test_name); \
|
||||
} catch (const cvtest::details::SkipTestExceptionBase& e) { \
|
||||
return new SkipThisTest(e.what()); \
|
||||
} \
|
||||
} \
|
||||
};\
|
||||
\
|
||||
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
|
||||
::test_info_ =\
|
||||
::testing::internal::MakeAndRegisterTestInfo(\
|
||||
#test_case_name, #test_name, NULL, NULL, \
|
||||
::testing::internal::CodeLocation(__FILE__, __LINE__), \
|
||||
(::testing::internal::GetTestTypeId()), \
|
||||
parent_class::SetUpTestCase, \
|
||||
parent_class::TearDownTestCase, \
|
||||
new test_case_name##test_name##_factory);\
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() BODY_IMPL( #test_case_name "_" #test_name ) \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::SetUp() CV__TEST_SETUP_IMPL(parent_class) \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::bodyMethodName()
|
||||
|
||||
#define TEST(test_case_name, test_name) TEST_(test_case_name, test_name, ::testing::Test, Body,, CV__TEST_BODY_IMPL)
|
||||
|
||||
#define CV__TEST_BIGDATA_BODY_IMPL(name) \
|
||||
{ \
|
||||
if (!cvtest::checkBigDataTests()) \
|
||||
{ \
|
||||
return; \
|
||||
} \
|
||||
CV__TRACE_APP_FUNCTION_NAME(name); \
|
||||
try { \
|
||||
CV__TEST_INIT \
|
||||
Body(); \
|
||||
CV__TEST_CLEANUP \
|
||||
} \
|
||||
catch (const cvtest::details::SkipTestExceptionBase& e) \
|
||||
{ \
|
||||
printf("[ SKIP ] %s\n", e.what()); \
|
||||
} \
|
||||
} \
|
||||
|
||||
// Special type of tests which require / use or validate processing of huge amount of data (>= 2Gb)
|
||||
#if defined(_M_X64) || defined(_M_ARM64) || defined(_M_ARM64EC) || defined(__x86_64__) || defined(__aarch64__)
|
||||
#define BIGDATA_TEST(test_case_name, test_name) TEST_(BigData_ ## test_case_name, test_name, ::testing::Test, Body,, CV__TEST_BIGDATA_BODY_IMPL)
|
||||
#else
|
||||
#define BIGDATA_TEST(test_case_name, test_name) TEST_(BigData_ ## test_case_name, DISABLED_ ## test_name, ::testing::Test, Body,, CV__TEST_BIGDATA_BODY_IMPL)
|
||||
#endif
|
||||
|
||||
#undef TEST_F
|
||||
#define TEST_F(test_fixture, test_name)\
|
||||
class GTEST_TEST_CLASS_NAME_(test_fixture, test_name) : public test_fixture {\
|
||||
public:\
|
||||
GTEST_TEST_CLASS_NAME_(test_fixture, test_name)() {}\
|
||||
private:\
|
||||
bool setUpSkipped = false; \
|
||||
virtual void TestBody() CV_OVERRIDE;\
|
||||
virtual void Body(); \
|
||||
virtual void SetUp() CV_OVERRIDE; \
|
||||
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
|
||||
GTEST_TEST_CLASS_NAME_(test_fixture, test_name));\
|
||||
};\
|
||||
class test_fixture##test_name##_factory : public ::testing::internal::TestFactoryBase { \
|
||||
public:\
|
||||
virtual ::testing::Test* CreateTest() CV_OVERRIDE { \
|
||||
try { \
|
||||
return new GTEST_TEST_CLASS_NAME_(test_fixture, test_name); \
|
||||
} catch (const cvtest::details::SkipTestExceptionBase& e) { \
|
||||
return new SkipThisTest(e.what()); \
|
||||
} \
|
||||
} \
|
||||
};\
|
||||
\
|
||||
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_fixture, test_name)\
|
||||
::test_info_ =\
|
||||
::testing::internal::MakeAndRegisterTestInfo(\
|
||||
#test_fixture, #test_name, NULL, NULL, \
|
||||
::testing::internal::CodeLocation(__FILE__, __LINE__), \
|
||||
(::testing::internal::GetTypeId<test_fixture>()), \
|
||||
test_fixture::SetUpTestCase, \
|
||||
test_fixture::TearDownTestCase, \
|
||||
new test_fixture##test_name##_factory);\
|
||||
void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::TestBody() CV__TEST_BODY_IMPL( #test_fixture "_" #test_name ) \
|
||||
void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::SetUp() CV__TEST_SETUP_IMPL(test_fixture) \
|
||||
void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::Body()
|
||||
|
||||
// Don't use directly
|
||||
#define CV__TEST_P(test_case_name, test_name, bodyMethodName, BODY_ATTR, BODY_IMPL/*(name_str)*/) \
|
||||
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
|
||||
: public test_case_name { \
|
||||
public: \
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
|
||||
private: \
|
||||
bool setUpSkipped = false; \
|
||||
virtual void bodyMethodName() BODY_ATTR; \
|
||||
virtual void TestBody() CV_OVERRIDE; \
|
||||
virtual void SetUp() CV_OVERRIDE; \
|
||||
static int AddToRegistry() { \
|
||||
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
|
||||
GetTestCasePatternHolder<test_case_name>(\
|
||||
#test_case_name, \
|
||||
::testing::internal::CodeLocation(\
|
||||
__FILE__, __LINE__))->AddTestPattern(\
|
||||
#test_case_name, \
|
||||
#test_name, \
|
||||
new ::testing::internal::TestMetaFactory< \
|
||||
GTEST_TEST_CLASS_NAME_(\
|
||||
test_case_name, test_name)>()); \
|
||||
return 0; \
|
||||
} \
|
||||
static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
|
||||
}; \
|
||||
int GTEST_TEST_CLASS_NAME_(test_case_name, \
|
||||
test_name)::gtest_registering_dummy_ = \
|
||||
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() BODY_IMPL( #test_case_name "_" #test_name ) \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::SetUp() CV__TEST_SETUP_IMPL(test_case_name) \
|
||||
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::bodyMethodName()
|
||||
|
||||
#undef TEST_P
|
||||
#define TEST_P(test_case_name, test_name) CV__TEST_P(test_case_name, test_name, Body,, CV__TEST_BODY_IMPL)
|
||||
|
||||
|
||||
#define CV_TEST_EXPECT_EXCEPTION_MESSAGE(statement, msg) \
|
||||
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
|
||||
if (::testing::internal::AlwaysTrue()) { \
|
||||
const char* msg_ = msg; \
|
||||
bool hasException = false; \
|
||||
try { \
|
||||
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
|
||||
} \
|
||||
catch (const cv::Exception& e) { \
|
||||
if (NULL == strstr(e.what(), msg_)) \
|
||||
ADD_FAILURE() << "Unexpected cv::Exception is raised: " << #statement << "\n Expected message substring: '" << msg_ << "'. Actual message:\n" << e.what(); \
|
||||
hasException = true; \
|
||||
} \
|
||||
catch (const std::exception& e) { \
|
||||
ADD_FAILURE() << "Unexpected std::exception is raised: " << #statement << "\n" << e.what(); \
|
||||
hasException = true; \
|
||||
} \
|
||||
catch (...) { \
|
||||
ADD_FAILURE() << "Unexpected C++ exception is raised: " << #statement; \
|
||||
hasException = true; \
|
||||
} \
|
||||
if (!hasException) { \
|
||||
goto GTEST_CONCAT_TOKEN_(gtest_label_test_, __LINE__); \
|
||||
} \
|
||||
} else \
|
||||
GTEST_CONCAT_TOKEN_(gtest_label_test_, __LINE__): \
|
||||
ADD_FAILURE() << "Failed: Expected: " #statement " throws an '" << msg << "' exception.\n" \
|
||||
" Actual: it doesn't."
|
||||
|
||||
|
||||
#endif // OPENCV_TS_EXT_HPP
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,729 @@
|
||||
#ifndef OPENCV_TS_PERF_HPP
|
||||
#define OPENCV_TS_PERF_HPP
|
||||
|
||||
#include "opencv2/ts.hpp"
|
||||
|
||||
#include "ts_ext.hpp"
|
||||
|
||||
#include <functional>
|
||||
|
||||
#if !(defined(LOGD) || defined(LOGI) || defined(LOGW) || defined(LOGE))
|
||||
# if defined(__ANDROID__) && defined(USE_ANDROID_LOGGING)
|
||||
# include <android/log.h>
|
||||
|
||||
# define PERF_TESTS_LOG_TAG "OpenCV_perf"
|
||||
# define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, PERF_TESTS_LOG_TAG, __VA_ARGS__))
|
||||
# define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, PERF_TESTS_LOG_TAG, __VA_ARGS__))
|
||||
# define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, PERF_TESTS_LOG_TAG, __VA_ARGS__))
|
||||
# define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, PERF_TESTS_LOG_TAG, __VA_ARGS__))
|
||||
# else
|
||||
# define LOGD(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
|
||||
# define LOGI(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
|
||||
# define LOGW(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
|
||||
# define LOGE(_str, ...) do{printf(_str , ## __VA_ARGS__); printf("\n");fflush(stdout);} while(0)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
// declare major namespaces to avoid errors on unknown namespace
|
||||
namespace cv { namespace cuda {} namespace ocl {} }
|
||||
namespace cvtest { }
|
||||
|
||||
namespace perf
|
||||
{
|
||||
|
||||
// Tuple stuff from Google Tests
|
||||
using testing::get;
|
||||
using testing::make_tuple;
|
||||
using testing::tuple;
|
||||
using testing::tuple_size;
|
||||
using testing::tuple_element;
|
||||
|
||||
class TestBase;
|
||||
|
||||
/*****************************************************************************************\
|
||||
* Predefined typical frame sizes and typical test parameters *
|
||||
\*****************************************************************************************/
|
||||
const static cv::Size szQVGA = cv::Size(320, 240);
|
||||
const static cv::Size szVGA = cv::Size(640, 480);
|
||||
const static cv::Size szSVGA = cv::Size(800, 600);
|
||||
const static cv::Size szXGA = cv::Size(1024, 768);
|
||||
const static cv::Size szSXGA = cv::Size(1280, 1024);
|
||||
const static cv::Size szWQHD = cv::Size(2560, 1440);
|
||||
|
||||
const static cv::Size sznHD = cv::Size(640, 360);
|
||||
const static cv::Size szqHD = cv::Size(960, 540);
|
||||
const static cv::Size sz240p = szQVGA;
|
||||
const static cv::Size sz720p = cv::Size(1280, 720);
|
||||
const static cv::Size sz1080p = cv::Size(1920, 1080);
|
||||
const static cv::Size sz1440p = szWQHD;
|
||||
const static cv::Size sz2160p = cv::Size(3840, 2160);//UHDTV1 4K
|
||||
const static cv::Size sz4320p = cv::Size(7680, 4320);//UHDTV2 8K
|
||||
|
||||
const static cv::Size sz3MP = cv::Size(2048, 1536);
|
||||
const static cv::Size sz5MP = cv::Size(2592, 1944);
|
||||
const static cv::Size sz2K = cv::Size(2048, 2048);
|
||||
|
||||
const static cv::Size szODD = cv::Size(127, 61);
|
||||
|
||||
const static cv::Size szSmall24 = cv::Size(24, 24);
|
||||
const static cv::Size szSmall32 = cv::Size(32, 32);
|
||||
const static cv::Size szSmall64 = cv::Size(64, 64);
|
||||
const static cv::Size szSmall128 = cv::Size(128, 128);
|
||||
|
||||
#define SZ_ALL_VGA ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA)
|
||||
#define SZ_ALL_GA ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA, ::perf::szXGA, ::perf::szSXGA)
|
||||
#define SZ_ALL_HD ::testing::Values(::perf::sznHD, ::perf::szqHD, ::perf::sz720p, ::perf::sz1080p)
|
||||
#define SZ_ALL_SMALL ::testing::Values(::perf::szSmall24, ::perf::szSmall32, ::perf::szSmall64, ::perf::szSmall128)
|
||||
#define SZ_ALL ::testing::Values(::perf::szQVGA, ::perf::szVGA, ::perf::szSVGA, ::perf::szXGA, ::perf::szSXGA, ::perf::sznHD, ::perf::szqHD, ::perf::sz720p, ::perf::sz1080p)
|
||||
#define SZ_TYPICAL ::testing::Values(::perf::szVGA, ::perf::szqHD, ::perf::sz720p, ::perf::szODD)
|
||||
|
||||
|
||||
#define TYPICAL_MAT_SIZES ::perf::szVGA, ::perf::sz720p, ::perf::sz1080p, ::perf::szODD
|
||||
#define TYPICAL_MAT_TYPES CV_8UC1, CV_8UC4, CV_32FC1
|
||||
#define TYPICAL_MATS testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( TYPICAL_MAT_TYPES ) )
|
||||
#define TYPICAL_MATS_C1 testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( CV_8UC1, CV_32FC1 ) )
|
||||
#define TYPICAL_MATS_C4 testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( CV_8UC4 ) )
|
||||
|
||||
|
||||
/*****************************************************************************************\
|
||||
* MatType - printable wrapper over integer 'type' of Mat *
|
||||
\*****************************************************************************************/
|
||||
class MatType
|
||||
{
|
||||
public:
|
||||
MatType(int val=0) : _type(val) {}
|
||||
operator int() const {return _type;}
|
||||
|
||||
private:
|
||||
int _type;
|
||||
};
|
||||
|
||||
/*****************************************************************************************\
|
||||
* CV_ENUM and CV_FLAGS - macro to create printable wrappers for defines and enums *
|
||||
\*****************************************************************************************/
|
||||
|
||||
#define CV_ENUM(class_name, ...) \
|
||||
namespace { \
|
||||
using namespace cv;using namespace cv::cuda; using namespace cv::ocl; \
|
||||
struct class_name { \
|
||||
class_name(int val = 0) : val_(val) {} \
|
||||
operator int() const { return val_; } \
|
||||
void PrintTo(std::ostream* os) const { \
|
||||
const int vals[] = { __VA_ARGS__ }; \
|
||||
const char* svals = #__VA_ARGS__; \
|
||||
for(int i = 0, pos = 0; i < (int)(sizeof(vals)/sizeof(int)); ++i) { \
|
||||
while(isspace(svals[pos]) || svals[pos] == ',') ++pos; \
|
||||
int start = pos; \
|
||||
while(!(isspace(svals[pos]) || svals[pos] == ',' || svals[pos] == 0)) \
|
||||
++pos; \
|
||||
if (val_ == vals[i]) { \
|
||||
*os << std::string(svals + start, svals + pos); \
|
||||
return; \
|
||||
} \
|
||||
} \
|
||||
*os << "UNKNOWN"; \
|
||||
} \
|
||||
static ::testing::internal::ParamGenerator<class_name> all() { \
|
||||
const class_name vals[] = { __VA_ARGS__ }; \
|
||||
return ::testing::ValuesIn(vals); \
|
||||
} \
|
||||
private: int val_; \
|
||||
}; \
|
||||
static inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } }
|
||||
|
||||
#define CV_FLAGS(class_name, ...) \
|
||||
namespace { \
|
||||
struct class_name { \
|
||||
class_name(int val = 0) : val_(val) {} \
|
||||
operator int() const { return val_; } \
|
||||
void PrintTo(std::ostream* os) const { \
|
||||
using namespace cv;using namespace cv::cuda; using namespace cv::ocl; \
|
||||
const int vals[] = { __VA_ARGS__ }; \
|
||||
const char* svals = #__VA_ARGS__; \
|
||||
int value = val_; \
|
||||
bool first = true; \
|
||||
for(int i = 0, pos = 0; i < (int)(sizeof(vals)/sizeof(int)); ++i) { \
|
||||
while(isspace(svals[pos]) || svals[pos] == ',') ++pos; \
|
||||
int start = pos; \
|
||||
while(!(isspace(svals[pos]) || svals[pos] == ',' || svals[pos] == 0)) \
|
||||
++pos; \
|
||||
if ((value & vals[i]) == vals[i]) { \
|
||||
value &= ~vals[i]; \
|
||||
if (first) first = false; else *os << "|"; \
|
||||
*os << std::string(svals + start, svals + pos); \
|
||||
if (!value) return; \
|
||||
} \
|
||||
} \
|
||||
if (first) *os << "UNKNOWN"; \
|
||||
} \
|
||||
private: int val_; \
|
||||
}; \
|
||||
static inline void PrintTo(const class_name& t, std::ostream* os) { t.PrintTo(os); } }
|
||||
|
||||
CV_ENUM(MatDepth, CV_8U, CV_8S, CV_16U, CV_16S, CV_32S, CV_32F, CV_64F, CV_16F, \
|
||||
CV_16BF, CV_Bool, CV_64U, CV_64S, CV_32U)
|
||||
|
||||
/*****************************************************************************************\
|
||||
* Regression control utility for performance testing *
|
||||
\*****************************************************************************************/
|
||||
enum ERROR_TYPE
|
||||
{
|
||||
ERROR_ABSOLUTE = 0,
|
||||
ERROR_RELATIVE = 1
|
||||
};
|
||||
|
||||
class Regression
|
||||
{
|
||||
public:
|
||||
static Regression& add(TestBase* test, const std::string& name, cv::InputArray array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
|
||||
static Regression& addMoments(TestBase* test, const std::string& name, const cv::Moments & array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
|
||||
static Regression& addKeypoints(TestBase* test, const std::string& name, const std::vector<cv::KeyPoint>& array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
|
||||
static Regression& addMatches(TestBase* test, const std::string& name, const std::vector<cv::DMatch>& array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
|
||||
static void Init(const std::string& testSuitName, const std::string& ext = ".xml");
|
||||
|
||||
Regression& operator() (const std::string& name, cv::InputArray array, double eps = DBL_EPSILON, ERROR_TYPE err = ERROR_ABSOLUTE);
|
||||
|
||||
private:
|
||||
static Regression& instance();
|
||||
Regression();
|
||||
~Regression();
|
||||
|
||||
Regression(const Regression&);
|
||||
Regression& operator=(const Regression&);
|
||||
|
||||
cv::RNG regRNG;//own random numbers generator to make collection and verification work identical
|
||||
std::string storageInPath;
|
||||
std::string storageOutPath;
|
||||
cv::FileStorage storageIn;
|
||||
cv::FileStorage storageOut;
|
||||
cv::FileNode rootIn;
|
||||
std::string currentTestNodeName;
|
||||
std::string suiteName;
|
||||
|
||||
cv::FileStorage& write();
|
||||
|
||||
static std::string getCurrentTestNodeName();
|
||||
static bool isVector(cv::InputArray a);
|
||||
static double getElem(cv::Mat& m, int x, int y, int cn = 0);
|
||||
|
||||
void init(const std::string& testSuitName, const std::string& ext);
|
||||
void write(cv::InputArray array);
|
||||
void write(cv::Mat m);
|
||||
void verify(cv::FileNode node, cv::InputArray array, double eps, ERROR_TYPE err);
|
||||
void verify(cv::FileNode node, cv::Mat actual, double eps, std::string argname, ERROR_TYPE err);
|
||||
};
|
||||
|
||||
#define SANITY_CHECK(array, ...) ::perf::Regression::add(this, #array, array , ## __VA_ARGS__)
|
||||
#define SANITY_CHECK_MOMENTS(array, ...) ::perf::Regression::addMoments(this, #array, array , ## __VA_ARGS__)
|
||||
#define SANITY_CHECK_KEYPOINTS(array, ...) ::perf::Regression::addKeypoints(this, #array, array , ## __VA_ARGS__)
|
||||
#define SANITY_CHECK_MATCHES(array, ...) ::perf::Regression::addMatches(this, #array, array , ## __VA_ARGS__)
|
||||
#define SANITY_CHECK_NOTHING() this->setVerified()
|
||||
|
||||
class GpuPerf
|
||||
{
|
||||
public:
|
||||
static bool targetDevice();
|
||||
};
|
||||
|
||||
#define PERF_RUN_CUDA() ::perf::GpuPerf::targetDevice()
|
||||
|
||||
/*****************************************************************************************\
|
||||
* Container for performance metrics *
|
||||
\*****************************************************************************************/
|
||||
typedef struct performance_metrics
|
||||
{
|
||||
size_t bytesIn;
|
||||
size_t bytesOut;
|
||||
unsigned int samples;
|
||||
unsigned int outliers;
|
||||
double gmean;
|
||||
double gstddev;//stddev for log(time)
|
||||
double mean;
|
||||
double stddev;
|
||||
double median;
|
||||
double min;
|
||||
double frequency;
|
||||
int terminationReason;
|
||||
|
||||
enum
|
||||
{
|
||||
TERM_ITERATIONS = 0,
|
||||
TERM_TIME = 1,
|
||||
TERM_INTERRUPT = 2,
|
||||
TERM_EXCEPTION = 3,
|
||||
TERM_SKIP_TEST = 4, // there are some limitations and test should be skipped
|
||||
TERM_UNKNOWN = -1
|
||||
};
|
||||
|
||||
performance_metrics();
|
||||
void clear();
|
||||
} performance_metrics;
|
||||
|
||||
|
||||
/*****************************************************************************************\
|
||||
* Strategy for performance measuring *
|
||||
\*****************************************************************************************/
|
||||
enum PERF_STRATEGY
|
||||
{
|
||||
PERF_STRATEGY_DEFAULT = -1,
|
||||
PERF_STRATEGY_BASE = 0,
|
||||
PERF_STRATEGY_SIMPLE = 1
|
||||
};
|
||||
|
||||
|
||||
/*****************************************************************************************\
|
||||
* Base fixture for performance tests *
|
||||
\*****************************************************************************************/
|
||||
#ifdef CV_COLLECT_IMPL_DATA
|
||||
// Implementation collection processing class.
|
||||
// Accumulates and shapes implementation data.
|
||||
typedef struct ImplData
|
||||
{
|
||||
bool ipp;
|
||||
bool icv;
|
||||
bool ipp_mt;
|
||||
bool ocl;
|
||||
bool plain;
|
||||
std::vector<int> implCode;
|
||||
std::vector<cv::String> funName;
|
||||
|
||||
ImplData()
|
||||
{
|
||||
Reset();
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
cv::setImpl(0);
|
||||
ipp = icv = ocl = ipp_mt = false;
|
||||
implCode.clear();
|
||||
funName.clear();
|
||||
}
|
||||
|
||||
void GetImpl()
|
||||
{
|
||||
flagsToVars(cv::getImpl(implCode, funName));
|
||||
}
|
||||
|
||||
std::vector<cv::String> GetCallsForImpl(int impl)
|
||||
{
|
||||
std::vector<cv::String> out;
|
||||
|
||||
for(int i = 0; i < (int)implCode.size(); i++)
|
||||
{
|
||||
if(impl == implCode[i])
|
||||
out.push_back(funName[i]);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
// Remove duplicate entries
|
||||
void ShapeUp()
|
||||
{
|
||||
std::vector<int> savedCode;
|
||||
std::vector<cv::String> savedName;
|
||||
|
||||
for(int i = 0; i < (int)implCode.size(); i++)
|
||||
{
|
||||
bool match = false;
|
||||
for(int j = 0; j < (int)savedCode.size(); j++)
|
||||
{
|
||||
if(implCode[i] == savedCode[j] && !funName[i].compare(savedName[j]))
|
||||
{
|
||||
match = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!match)
|
||||
{
|
||||
savedCode.push_back(implCode[i]);
|
||||
savedName.push_back(funName[i]);
|
||||
}
|
||||
}
|
||||
|
||||
implCode = savedCode;
|
||||
funName = savedName;
|
||||
}
|
||||
|
||||
// convert flags register to more handy variables
|
||||
void flagsToVars(int flags)
|
||||
{
|
||||
#if defined(HAVE_IPP_ICV)
|
||||
ipp = 0;
|
||||
icv = ((flags&CV_IMPL_IPP) > 0);
|
||||
#else
|
||||
ipp = ((flags&CV_IMPL_IPP) > 0);
|
||||
icv = 0;
|
||||
#endif
|
||||
ipp_mt = ((flags&CV_IMPL_MT) > 0);
|
||||
ocl = ((flags&CV_IMPL_OCL) > 0);
|
||||
plain = (flags == 0);
|
||||
}
|
||||
|
||||
} ImplData;
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_INSTRUMENTATION
|
||||
class InstumentData
|
||||
{
|
||||
public:
|
||||
static ::cv::String treeToString();
|
||||
static void printTree();
|
||||
};
|
||||
#endif
|
||||
|
||||
class TestBase: public ::testing::Test
|
||||
{
|
||||
public:
|
||||
TestBase();
|
||||
|
||||
static void Init(int argc, const char* const argv[]);
|
||||
static void Init(const std::vector<std::string> & availableImpls,
|
||||
int argc, const char* const argv[]);
|
||||
static void RecordRunParameters();
|
||||
static std::string getDataPath(const std::string& relativePath);
|
||||
static std::string getSelectedImpl();
|
||||
|
||||
static enum PERF_STRATEGY getCurrentModulePerformanceStrategy();
|
||||
static enum PERF_STRATEGY setModulePerformanceStrategy(enum PERF_STRATEGY strategy);
|
||||
|
||||
class PerfSkipTestException: public cvtest::SkipTestException
|
||||
{
|
||||
public:
|
||||
int dummy; // workaround for MacOSX Xcode 7.3 bug (don't make class "empty")
|
||||
PerfSkipTestException() : dummy(0) {}
|
||||
};
|
||||
|
||||
protected:
|
||||
virtual void PerfTestBody() = 0;
|
||||
|
||||
virtual void SetUp() CV_OVERRIDE;
|
||||
virtual void TearDown() CV_OVERRIDE;
|
||||
|
||||
bool startTimer(); // bool is dummy for conditional loop
|
||||
void stopTimer();
|
||||
bool next();
|
||||
|
||||
PERF_STRATEGY getCurrentPerformanceStrategy() const;
|
||||
|
||||
enum WarmUpType
|
||||
{
|
||||
WARMUP_READ,
|
||||
WARMUP_WRITE,
|
||||
WARMUP_RNG,
|
||||
WARMUP_NONE
|
||||
};
|
||||
|
||||
void reportMetrics(bool toJUnitXML = false);
|
||||
static void warmup(cv::InputOutputArray a, WarmUpType wtype = WARMUP_READ);
|
||||
|
||||
performance_metrics& calcMetrics();
|
||||
|
||||
void RunPerfTestBody();
|
||||
|
||||
#ifdef CV_COLLECT_IMPL_DATA
|
||||
ImplData implConf;
|
||||
#endif
|
||||
#ifdef ENABLE_INSTRUMENTATION
|
||||
InstumentData instrConf;
|
||||
#endif
|
||||
|
||||
private:
|
||||
typedef std::vector<std::pair<int, cv::Size> > SizeVector;
|
||||
typedef std::vector<int64> TimeVector;
|
||||
|
||||
SizeVector inputData;
|
||||
SizeVector outputData;
|
||||
unsigned int getTotalInputSize() const;
|
||||
unsigned int getTotalOutputSize() const;
|
||||
|
||||
enum PERF_STRATEGY testStrategy;
|
||||
|
||||
TimeVector times;
|
||||
int64 lastTime;
|
||||
int64 totalTime;
|
||||
int64 timeLimit;
|
||||
static int64 timeLimitDefault;
|
||||
static unsigned int iterationsLimitDefault;
|
||||
|
||||
unsigned int minIters;
|
||||
unsigned int nIters;
|
||||
unsigned int currentIter;
|
||||
unsigned int runsPerIteration;
|
||||
unsigned int perfValidationStage;
|
||||
|
||||
performance_metrics metrics;
|
||||
void validateMetrics();
|
||||
|
||||
static void warmup_impl(cv::Mat m, WarmUpType wtype);
|
||||
static int getSizeInBytes(cv::InputArray a);
|
||||
static cv::Size getSize(cv::InputArray a);
|
||||
static void declareArray(SizeVector& sizes, cv::InputOutputArray a, WarmUpType wtype);
|
||||
|
||||
class _declareHelper
|
||||
{
|
||||
public:
|
||||
_declareHelper& in(cv::InputOutputArray a1, WarmUpType wtype = WARMUP_READ);
|
||||
_declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, WarmUpType wtype = WARMUP_READ);
|
||||
_declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, WarmUpType wtype = WARMUP_READ);
|
||||
_declareHelper& in(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, cv::InputOutputArray a4, WarmUpType wtype = WARMUP_READ);
|
||||
|
||||
_declareHelper& out(cv::InputOutputArray a1, WarmUpType wtype = WARMUP_WRITE);
|
||||
_declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, WarmUpType wtype = WARMUP_WRITE);
|
||||
_declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, WarmUpType wtype = WARMUP_WRITE);
|
||||
_declareHelper& out(cv::InputOutputArray a1, cv::InputOutputArray a2, cv::InputOutputArray a3, cv::InputOutputArray a4, WarmUpType wtype = WARMUP_WRITE);
|
||||
|
||||
_declareHelper& iterations(unsigned int n);
|
||||
_declareHelper& time(double timeLimitSecs);
|
||||
_declareHelper& tbb_threads(int n = -1);
|
||||
_declareHelper& runs(unsigned int runsNumber);
|
||||
|
||||
_declareHelper& strategy(enum PERF_STRATEGY s);
|
||||
private:
|
||||
TestBase* test;
|
||||
_declareHelper(TestBase* t);
|
||||
_declareHelper(const _declareHelper&);
|
||||
_declareHelper& operator=(const _declareHelper&);
|
||||
friend class TestBase;
|
||||
};
|
||||
friend class _declareHelper;
|
||||
|
||||
bool verified;
|
||||
|
||||
public:
|
||||
_declareHelper declare;
|
||||
|
||||
void setVerified() { this->verified = true; }
|
||||
};
|
||||
|
||||
template<typename T> class TestBaseWithParam: public TestBase, public ::testing::WithParamInterface<T> {};
|
||||
|
||||
typedef tuple<cv::Size, MatType> Size_MatType_t;
|
||||
typedef TestBaseWithParam<Size_MatType_t> Size_MatType;
|
||||
|
||||
/*****************************************************************************************\
|
||||
* Print functions for googletest *
|
||||
\*****************************************************************************************/
|
||||
void PrintTo(const MatType& t, std::ostream* os);
|
||||
|
||||
} //namespace perf
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
void PrintTo(const String& str, ::std::ostream* os);
|
||||
void PrintTo(const Size& sz, ::std::ostream* os);
|
||||
|
||||
} //namespace cv
|
||||
|
||||
|
||||
/*****************************************************************************************\
|
||||
* Macro definitions for performance tests *
|
||||
\*****************************************************************************************/
|
||||
|
||||
#define CV__PERF_TEST_BODY_IMPL(name) \
|
||||
{ \
|
||||
CV__TEST_NAMESPACE_CHECK \
|
||||
CV__TRACE_APP_FUNCTION_NAME("PERF_TEST: " name); \
|
||||
try { \
|
||||
::cvtest::testSetUp(); \
|
||||
RunPerfTestBody(); \
|
||||
} \
|
||||
catch (cvtest::details::SkipTestExceptionBase& e) \
|
||||
{ \
|
||||
printf("[ SKIP ] %s\n", e.what()); \
|
||||
} \
|
||||
::cvtest::testTearDown(); \
|
||||
}
|
||||
|
||||
#define PERF_PROXY_NAMESPACE_NAME_(test_case_name, test_name) \
|
||||
test_case_name##_##test_name##_perf_namespace_proxy
|
||||
|
||||
// Defines a performance test.
|
||||
//
|
||||
// The first parameter is the name of the test case, and the second
|
||||
// parameter is the name of the test within the test case.
|
||||
//
|
||||
// The user should put his test code between braces after using this
|
||||
// macro. Example:
|
||||
//
|
||||
// PERF_TEST(FooTest, InitializesCorrectly) {
|
||||
// Foo foo;
|
||||
// EXPECT_TRUE(foo.StatusIsOK());
|
||||
// }
|
||||
#define PERF_TEST(test_case_name, test_name)\
|
||||
TEST_(test_case_name, test_name, ::perf::TestBase, PerfTestBody, CV_OVERRIDE, CV__PERF_TEST_BODY_IMPL)
|
||||
|
||||
// Defines a performance test that uses a test fixture.
|
||||
//
|
||||
// The first parameter is the name of the test fixture class, which
|
||||
// also doubles as the test case name. The second parameter is the
|
||||
// name of the test within the test case.
|
||||
//
|
||||
// A test fixture class must be declared earlier. The user should put
|
||||
// his test code between braces after using this macro. Example:
|
||||
//
|
||||
// class FooTest : public ::perf::TestBase {
|
||||
// protected:
|
||||
// virtual void SetUp() { TestBase::SetUp(); b_.AddElement(3); }
|
||||
//
|
||||
// Foo a_;
|
||||
// Foo b_;
|
||||
// };
|
||||
//
|
||||
// PERF_TEST_F(FooTest, InitializesCorrectly) {
|
||||
// EXPECT_TRUE(a_.StatusIsOK());
|
||||
// }
|
||||
//
|
||||
// PERF_TEST_F(FooTest, ReturnsElementCountCorrectly) {
|
||||
// EXPECT_EQ(0, a_.size());
|
||||
// EXPECT_EQ(1, b_.size());
|
||||
// }
|
||||
#define PERF_TEST_F(fixture, testname) \
|
||||
namespace PERF_PROXY_NAMESPACE_NAME_(fixture, testname) {\
|
||||
class TestBase {/*compile error for this class means that you are trying to use perf::TestBase as a fixture*/};\
|
||||
class fixture : public ::fixture {\
|
||||
public:\
|
||||
fixture() {}\
|
||||
protected:\
|
||||
virtual void PerfTestBody() CV_OVERRIDE;\
|
||||
};\
|
||||
TEST_F(fixture, testname){ CV__PERF_TEST_BODY_IMPL(#fixture "_" #testname); }\
|
||||
}\
|
||||
void PERF_PROXY_NAMESPACE_NAME_(fixture, testname)::fixture::PerfTestBody()
|
||||
|
||||
// Defines a parametrized performance test.
|
||||
//
|
||||
// @Note PERF_TEST_P() below violates behavior of original Google Tests - there is no tests instantiation in original TEST_P()
|
||||
// This macro is intended for usage with separate INSTANTIATE_TEST_CASE_P macro
|
||||
#define PERF_TEST_P_(test_case_name, test_name) CV__TEST_P(test_case_name, test_name, PerfTestBody, CV_OVERRIDE, CV__PERF_TEST_BODY_IMPL)
|
||||
|
||||
// Defines a parametrized performance test.
|
||||
//
|
||||
// @Note Original TEST_P() macro doesn't instantiate tests with parameters. To keep original usage use PERF_TEST_P_() macro
|
||||
//
|
||||
// The first parameter is the name of the test fixture class, which
|
||||
// also doubles as the test case name. The second parameter is the
|
||||
// name of the test within the test case.
|
||||
//
|
||||
// The user should put his test code between braces after using this
|
||||
// macro. Example:
|
||||
//
|
||||
// typedef ::perf::TestBaseWithParam<cv::Size> FooTest;
|
||||
//
|
||||
// PERF_TEST_P(FooTest, DoTestingRight, ::testing::Values(::perf::szVGA, ::perf::sz720p) {
|
||||
// cv::Mat b(GetParam(), CV_8U, cv::Scalar(10));
|
||||
// cv::Mat a(GetParam(), CV_8U, cv::Scalar(20));
|
||||
// cv::Mat c(GetParam(), CV_8U, cv::Scalar(0));
|
||||
//
|
||||
// declare.in(a, b).out(c).time(0.5);
|
||||
//
|
||||
// TEST_CYCLE() cv::add(a, b, c);
|
||||
//
|
||||
// SANITY_CHECK(c);
|
||||
// }
|
||||
#define PERF_TEST_P(fixture, name, params) \
|
||||
class fixture##_##name : public fixture {\
|
||||
public:\
|
||||
fixture##_##name() {}\
|
||||
protected:\
|
||||
virtual void PerfTestBody() CV_OVERRIDE;\
|
||||
};\
|
||||
CV__TEST_P(fixture##_##name, name, PerfTestBodyDummy,, CV__PERF_TEST_BODY_IMPL){} \
|
||||
INSTANTIATE_TEST_CASE_P(/*none*/, fixture##_##name, params);\
|
||||
void fixture##_##name::PerfTestBody()
|
||||
|
||||
#ifndef __CV_TEST_EXEC_ARGS
|
||||
#if defined(_MSC_VER) && (_MSC_VER <= 1400)
|
||||
#define __CV_TEST_EXEC_ARGS(...) \
|
||||
while (++argc >= (--argc,-1)) {__VA_ARGS__; break;} /*this ugly construction is needed for VS 2005*/
|
||||
#else
|
||||
#define __CV_TEST_EXEC_ARGS(...) \
|
||||
__VA_ARGS__;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#define CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, ...) \
|
||||
CV_TRACE_FUNCTION(); \
|
||||
{ CV_TRACE_REGION("INIT"); \
|
||||
::perf::Regression::Init(#modulename); \
|
||||
::perf::TestBase::Init(std::vector<std::string>(impls, impls + sizeof impls / sizeof *impls), \
|
||||
argc, argv); \
|
||||
::testing::InitGoogleTest(&argc, argv); \
|
||||
::testing::UnitTest::GetInstance()->listeners().Append(new cvtest::SystemInfoCollector); \
|
||||
::testing::Test::RecordProperty("cv_module_name", #modulename); \
|
||||
::perf::TestBase::RecordRunParameters(); \
|
||||
__CV_TEST_EXEC_ARGS(__VA_ARGS__) \
|
||||
} \
|
||||
return RUN_ALL_TESTS();
|
||||
|
||||
// impls must be an array, not a pointer; "plain" should always be one of the implementations
|
||||
#define CV_PERF_TEST_MAIN_WITH_IMPLS(modulename, impls, ...) \
|
||||
int main(int argc, char **argv)\
|
||||
{\
|
||||
CV_PERF_TEST_MAIN_INTERNALS(modulename, impls, __VA_ARGS__)\
|
||||
}
|
||||
|
||||
#define CV_PERF_TEST_MAIN(modulename, ...) \
|
||||
int main(int argc, char **argv)\
|
||||
{\
|
||||
const char * plain_only[] = { "plain" };\
|
||||
CV_PERF_TEST_MAIN_INTERNALS(modulename, plain_only, __VA_ARGS__)\
|
||||
}
|
||||
|
||||
//! deprecated
|
||||
#define TEST_CYCLE_N(n) for(declare.iterations(n); next() && startTimer(); stopTimer())
|
||||
//! deprecated
|
||||
#define TEST_CYCLE() for(; next() && startTimer(); stopTimer())
|
||||
//! deprecated
|
||||
#define TEST_CYCLE_MULTIRUN(runsNum) for(declare.runs(runsNum); next() && startTimer(); stopTimer()) for(int r = 0; r < runsNum; ++r)
|
||||
|
||||
#define PERF_SAMPLE_BEGIN() \
|
||||
for(; next() && startTimer(); stopTimer()) \
|
||||
{ \
|
||||
CV_TRACE_REGION("iteration");
|
||||
#define PERF_SAMPLE_END() \
|
||||
}
|
||||
|
||||
namespace perf
|
||||
{
|
||||
namespace comparators
|
||||
{
|
||||
|
||||
template<typename T>
|
||||
struct RectLess_
|
||||
{
|
||||
bool operator()(const cv::Rect_<T>& r1, const cv::Rect_<T>& r2) const
|
||||
{
|
||||
return r1.x < r2.x ||
|
||||
(r1.x == r2.x && r1.y < r2.y) ||
|
||||
(r1.x == r2.x && r1.y == r2.y && r1.width < r2.width) ||
|
||||
(r1.x == r2.x && r1.y == r2.y && r1.width == r2.width && r1.height < r2.height);
|
||||
}
|
||||
};
|
||||
|
||||
typedef RectLess_<int> RectLess;
|
||||
|
||||
struct KeypointGreater
|
||||
{
|
||||
bool operator()(const cv::KeyPoint& kp1, const cv::KeyPoint& kp2) const
|
||||
{
|
||||
if (kp1.response > kp2.response) return true;
|
||||
if (kp1.response < kp2.response) return false;
|
||||
if (kp1.size > kp2.size) return true;
|
||||
if (kp1.size < kp2.size) return false;
|
||||
if (kp1.octave > kp2.octave) return true;
|
||||
if (kp1.octave < kp2.octave) return false;
|
||||
if (kp1.pt.y < kp2.pt.y) return false;
|
||||
if (kp1.pt.y > kp2.pt.y) return true;
|
||||
return kp1.pt.x < kp2.pt.x;
|
||||
}
|
||||
};
|
||||
|
||||
} //namespace comparators
|
||||
|
||||
void sort(std::vector<cv::KeyPoint>& pts, cv::InputOutputArray descriptors);
|
||||
} //namespace perf
|
||||
|
||||
#endif //OPENCV_TS_PERF_HPP
|
||||
Reference in New Issue
Block a user