From 03bcfe4107eacaf38bd7bf708eda174602e4a985 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 12 Dec 2016 14:22:52 +0300 Subject: [PATCH 1/3] test: fix RNG problem in accuracy tests --- modules/ts/include/opencv2/ts.hpp | 4 +++- modules/ts/include/opencv2/ts/ts_ext.hpp | 4 +++- modules/ts/src/ts.cpp | 5 +++++ modules/ts/src/ts_perf.cpp | 1 - 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/ts/include/opencv2/ts.hpp b/modules/ts/include/opencv2/ts.hpp index 28a071a565..c573905c6f 100644 --- a/modules/ts/include/opencv2/ts.hpp +++ b/modules/ts/include/opencv2/ts.hpp @@ -539,11 +539,13 @@ protected: } }; +extern uint64 param_seed; + struct CV_EXPORTS DefaultRngAuto { const uint64 old_state; - DefaultRngAuto() : old_state(cv::theRNG().state) { cv::theRNG().state = (uint64)-1; } + DefaultRngAuto() : old_state(cv::theRNG().state) { cv::theRNG().state = cvtest::param_seed; } ~DefaultRngAuto() { cv::theRNG().state = old_state; } DefaultRngAuto& operator=(const DefaultRngAuto&); diff --git a/modules/ts/include/opencv2/ts/ts_ext.hpp b/modules/ts/include/opencv2/ts/ts_ext.hpp index 781b61e4dd..05ccc63cc1 100644 --- a/modules/ts/include/opencv2/ts/ts_ext.hpp +++ b/modules/ts/include/opencv2/ts/ts_ext.hpp @@ -12,7 +12,9 @@ namespace cvtest { void checkIppStatus(); } -#define CV_TEST_INIT cv::ipp::setIppStatus(0); +#define CV_TEST_INIT \ + cv::ipp::setIppStatus(0); \ + cv::theRNG().state = cvtest::param_seed; #define CV_TEST_CLEANUP ::cvtest::checkIppStatus(); #define CV_TEST_BODY_IMPL \ { \ diff --git a/modules/ts/src/ts.cpp b/modules/ts/src/ts.cpp index c60e5d635a..b2763d4469 100644 --- a/modules/ts/src/ts.cpp +++ b/modules/ts/src/ts.cpp @@ -80,6 +80,8 @@ namespace cvtest { +uint64 param_seed = 0x12345678; // real value is passed via parseCustomOptions function + static std::string path_join(const std::string& prefix, const std::string& subpath) { CV_Assert(subpath.empty() || subpath[0] != '/'); @@ -695,6 +697,7 @@ void parseCustomOptions(int argc, char **argv) { const char * const command_line_keys = "{ ipp test_ipp_check |false |check whether IPP works without failures }" + "{ test_seed |809564 |seed for random numbers generator }" "{ h help |false |print help info }"; cv::CommandLineParser parser(argc, argv, command_line_keys); @@ -711,6 +714,8 @@ void parseCustomOptions(int argc, char **argv) #else test_ipp_check = false; #endif + + param_seed = parser.get("test_seed"); } diff --git a/modules/ts/src/ts_perf.cpp b/modules/ts/src/ts_perf.cpp index f4967748ee..84ce5d6a64 100644 --- a/modules/ts/src/ts_perf.cpp +++ b/modules/ts/src/ts_perf.cpp @@ -38,7 +38,6 @@ static double param_max_outliers; static double param_max_deviation; static unsigned int param_min_samples; static unsigned int param_force_samples; -static uint64 param_seed; static double param_time_limit; static int param_threads; static bool param_write_sanity; From fb223784a6199b44ffca5019c080dab3521c3d92 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 12 Dec 2016 14:39:08 +0300 Subject: [PATCH 2/3] test: fix Core_HAL.mat_decomp test implementation --- modules/core/test/test_hal_core.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/modules/core/test/test_hal_core.cpp b/modules/core/test/test_hal_core.cpp index dfd0867def..ab85659ec1 100644 --- a/modules/core/test/test_hal_core.cpp +++ b/modules/core/test/test_hal_core.cpp @@ -120,15 +120,20 @@ TEST(Core_HAL, mathfuncs) } } +namespace { + enum { HAL_LU = 0, HAL_CHOL = 1 }; -TEST(Core_HAL, mat_decomp) +typedef testing::TestWithParam HAL; + +TEST_P(HAL, mat_decomp) { - for( int hcase = 0; hcase < 16; hcase++ ) + int hcase = GetParam(); + SCOPED_TRACE(cv::format("hcase=%d", hcase)); { int depth = hcase % 2 == 0 ? CV_32F : CV_64F; int size = (hcase / 2) % 4; @@ -137,7 +142,7 @@ TEST(Core_HAL, mat_decomp) double eps = depth == CV_32F ? 1e-5 : 1e-10; if( size == 3 ) - continue; + return; // TODO ??? Mat a0(size, size, depth), a(size, size, depth), b(size, 1, depth), x(size, 1, depth), x0(size, 1, depth); randu(a0, -1, 1); @@ -175,14 +180,19 @@ TEST(Core_HAL, mat_decomp) min_hal_t = std::min(min_hal_t, t); t = (double)getTickCount(); - solve(a0, b, x0, (nfunc == HAL_LU ? DECOMP_LU : DECOMP_CHOLESKY)); + bool solveStatus = solve(a0, b, x0, (nfunc == HAL_LU ? DECOMP_LU : DECOMP_CHOLESKY)); t = (double)getTickCount() - t; + EXPECT_TRUE(solveStatus); min_ocv_t = std::min(min_ocv_t, t); } //std::cout << "x: " << Mat(x.t()) << std::endl; //std::cout << "x0: " << Mat(x0.t()) << std::endl; - EXPECT_LE(norm(x, x0, NORM_INF | NORM_RELATIVE), eps); + EXPECT_LE(norm(x, x0, NORM_INF | NORM_RELATIVE), eps) + << "x: " << Mat(x.t()) + << "\nx0: " << Mat(x0.t()) + << "\na0: " << a0 + << "\nb: " << b; double freq = getTickFrequency(); printf("%s (%d x %d, %s): hal time=%.2fusec, ocv time=%.2fusec\n", @@ -192,3 +202,7 @@ TEST(Core_HAL, mat_decomp) min_hal_t*1e6/freq, min_ocv_t*1e6/freq); } } + +INSTANTIATE_TEST_CASE_P(Core, HAL, testing::Range(0, 16)); + +} // namespace From ec859ceb2c95689b569d6f184a66db4a1163ded0 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 12 Dec 2016 18:09:02 +0300 Subject: [PATCH 3/3] test: limit chessboard generator parameters --- modules/calib3d/test/test_chessboardgenerator.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/calib3d/test/test_chessboardgenerator.cpp b/modules/calib3d/test/test_chessboardgenerator.cpp index 7c0bd34dc7..8a9c5ea936 100644 --- a/modules/calib3d/test/test_chessboardgenerator.cpp +++ b/modules/calib3d/test/test_chessboardgenerator.cpp @@ -51,7 +51,7 @@ using namespace cv; using namespace std; ChessBoardGenerator::ChessBoardGenerator(const Size& _patternSize) : sensorWidth(32), sensorHeight(24), - squareEdgePointsNum(200), min_cos(std::sqrt(2.f)*0.5f), cov(0.5), + squareEdgePointsNum(200), min_cos(std::sqrt(3.f)*0.5f), cov(0.5), patternSize(_patternSize), rendererResolutionMultiplier(4), tvec(Mat::zeros(1, 3, CV_32F)) { Rodrigues(Mat::eye(3, 3, CV_32F), rvec); @@ -85,8 +85,10 @@ void cv::ChessBoardGenerator::generateBasis(Point3f& pb1, Point3f& pb2) const { n[0] = rng.uniform(-1.f, 1.f); n[1] = rng.uniform(-1.f, 1.f); - n[2] = rng.uniform(-1.f, 1.f); + n[2] = rng.uniform(0.0f, 1.f); float len = (float)norm(n); + if (len < 1e-3) + continue; n[0]/=len; n[1]/=len; n[2]/=len;