From 1983991d2f7ff8ece8684c6b477973b1fd399b2d Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 16 May 2018 17:58:16 +0300 Subject: [PATCH 1/2] photo(test): update test checks - allow 5% of changed pixels with intensity difference <= 1 --- modules/photo/test/test_cloning.cpp | 43 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/modules/photo/test/test_cloning.cpp b/modules/photo/test/test_cloning.cpp index f83960cd63..34642d4120 100644 --- a/modules/photo/test/test_cloning.cpp +++ b/modules/photo/test/test_cloning.cpp @@ -53,7 +53,7 @@ namespace opencv_test { namespace { #define SAVE(x) #endif -static const double numerical_precision = 1000.; +static const double numerical_precision = 0.05; // 95% of pixels should have exact values TEST(Photo_SeamlessClone_normal, regression) { @@ -82,8 +82,10 @@ TEST(Photo_SeamlessClone_normal, regression) SAVE(result); - double error = cvtest::norm(reference, result, NORM_L1); - EXPECT_LE(error, numerical_precision); + double errorINF = cvtest::norm(reference, result, NORM_INF); + EXPECT_LE(errorINF, 1); + double errorL1 = cvtest::norm(reference, result, NORM_L1); + EXPECT_LE(errorL1, reference.total() * numerical_precision) << "size=" << reference.size(); } TEST(Photo_SeamlessClone_mixed, regression) @@ -113,9 +115,10 @@ TEST(Photo_SeamlessClone_mixed, regression) Mat reference = imread(reference_path); ASSERT_FALSE(reference.empty()) << "Could not load reference image " << reference_path; - double error = cvtest::norm(reference, result, NORM_L1); - EXPECT_LE(error, numerical_precision); - + double errorINF = cvtest::norm(reference, result, NORM_INF); + EXPECT_LE(errorINF, 1); + double errorL1 = cvtest::norm(reference, result, NORM_L1); + EXPECT_LE(errorL1, reference.total() * numerical_precision) << "size=" << reference.size(); } TEST(Photo_SeamlessClone_featureExchange, regression) @@ -145,9 +148,10 @@ TEST(Photo_SeamlessClone_featureExchange, regression) Mat reference = imread(reference_path); ASSERT_FALSE(reference.empty()) << "Could not load reference image " << reference_path; - double error = cvtest::norm(reference, result, NORM_L1); - EXPECT_LE(error, numerical_precision); - + double errorINF = cvtest::norm(reference, result, NORM_INF); + EXPECT_LE(errorINF, 1); + double errorL1 = cvtest::norm(reference, result, NORM_L1); + EXPECT_LE(errorL1, reference.total() * numerical_precision) << "size=" << reference.size(); } TEST(Photo_SeamlessClone_colorChange, regression) @@ -171,9 +175,10 @@ TEST(Photo_SeamlessClone_colorChange, regression) Mat reference = imread(reference_path); ASSERT_FALSE(reference.empty()) << "Could not load reference image " << reference_path; - double error = cvtest::norm(reference, result, NORM_L1); - EXPECT_LE(error, numerical_precision); - + double errorINF = cvtest::norm(reference, result, NORM_INF); + EXPECT_LE(errorINF, 1); + double errorL1 = cvtest::norm(reference, result, NORM_L1); + EXPECT_LE(errorL1, reference.total() * numerical_precision) << "size=" << reference.size(); } TEST(Photo_SeamlessClone_illuminationChange, regression) @@ -195,9 +200,12 @@ TEST(Photo_SeamlessClone_illuminationChange, regression) SAVE(result); Mat reference = imread(reference_path); - double error = cvtest::norm(reference, result, NORM_L1); - EXPECT_LE(error, numerical_precision); + ASSERT_FALSE(reference.empty()) << "Could not load reference image " << reference_path; + double errorINF = cvtest::norm(reference, result, NORM_INF); + EXPECT_LE(errorINF, 1); + double errorL1 = cvtest::norm(reference, result, NORM_L1); + EXPECT_LE(errorL1, reference.total() * numerical_precision) << "size=" << reference.size(); } TEST(Photo_SeamlessClone_textureFlattening, regression) @@ -221,9 +229,10 @@ TEST(Photo_SeamlessClone_textureFlattening, regression) Mat reference = imread(reference_path); ASSERT_FALSE(reference.empty()) << "Could not load reference image " << reference_path; - double error = cvtest::norm(reference, result, NORM_L1); - EXPECT_LE(error, numerical_precision); - + double errorINF = cvtest::norm(reference, result, NORM_INF); + EXPECT_LE(errorINF, 1); + double errorL1 = cvtest::norm(reference, result, NORM_L1); + EXPECT_LE(errorL1, reference.total() * numerical_precision) << "size=" << reference.size(); } }} // namespace From 491e3627b6ad23fc23e5ffbfe7ab45925b44f6f5 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 17 May 2018 15:30:11 +0300 Subject: [PATCH 2/2] photo: initialize cos() table with double type This avoids MSVC 19.14.26428.1 to call vectorized __vdecl_cosf4() function with less precision. --- modules/photo/src/seamless_cloning_impl.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/photo/src/seamless_cloning_impl.cpp b/modules/photo/src/seamless_cloning_impl.cpp index 6073a9bc4c..2d710cc61e 100644 --- a/modules/photo/src/seamless_cloning_impl.cpp +++ b/modules/photo/src/seamless_cloning_impl.cpp @@ -251,13 +251,15 @@ void Cloning::initVariables(const Mat &destination, const Mat &binaryMask) //init of the filters used in the dst const int w = destination.cols; filter_X.resize(w - 2); + double scale = CV_PI / (w - 1); for(int i = 0 ; i < w-2 ; ++i) - filter_X[i] = 2.0f * std::cos(static_cast(CV_PI) * (i + 1) / (w - 1)); + filter_X[i] = 2.0f * (float)std::cos(scale * (i + 1)); const int h = destination.rows; filter_Y.resize(h - 2); + scale = CV_PI / (h - 1); for(int j = 0 ; j < h - 2 ; ++j) - filter_Y[j] = 2.0f * std::cos(static_cast(CV_PI) * (j + 1) / (h - 1)); + filter_Y[j] = 2.0f * (float)std::cos(scale * (j + 1)); } void Cloning::computeDerivatives(const Mat& destination, const Mat &patch, const Mat &binaryMask)