diff --git a/modules/imgproc/test/test_imgwarp.cpp b/modules/imgproc/test/test_imgwarp.cpp index c2cf2bfc69..0568cbce0a 100644 --- a/modules/imgproc/test/test_imgwarp.cpp +++ b/modules/imgproc/test/test_imgwarp.cpp @@ -1372,6 +1372,49 @@ void CV_GetQuadSubPixTest::prepare_to_validation( int /*test_case_idx*/ ) dst.convertTo(dst0, dst0.depth()); } +////////////////////////////// resizeArea ///////////////////////////////// + +template +static void check_resize_area(const Mat& expected, const Mat& actual, double tolerance = 1.0) +{ + ASSERT_EQ(actual.type(), expected.type()); + ASSERT_EQ(actual.size(), expected.size()); + + Mat diff; + absdiff(actual, expected, diff); + + Mat one_channel_diff = diff; //.reshape(1); + + Size dsize = actual.size(); + bool next = true; + for (int dy = 0; dy < dsize.height && next; ++dy) + { + const T* eD = expected.ptr(dy); + const T* aD = actual.ptr(dy); + + for (int dx = 0; dx < dsize.width && next; ++dx) + if (fabs(static_cast(aD[dx] - eD[dx])) > tolerance) + { + cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Inf norm: %f\n", static_cast(norm(actual, expected, NORM_INF))); + cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Error in : (%d, %d)\n", dx, dy); + + const int radius = 3; + int rmin = MAX(dy - radius, 0), rmax = MIN(dy + radius, dsize.height); + int cmin = MAX(dx - radius, 0), cmax = MIN(dx + radius, dsize.width); + + std::cout << "Abs diff:" << std::endl << diff << std::endl; + std::cout << "actual result:\n" << actual(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; + std::cout << "expected result:\n" << expected(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; + + next = false; + } + } + + ASSERT_EQ(0, norm(one_channel_diff, cv::NORM_INF)); +} + +/////////////////////////////////////////////////////////////////////////// + TEST(Imgproc_cvWarpAffine, regression) { IplImage* src = cvCreateImage(cvSize(100, 100), IPL_DEPTH_8U, 1); @@ -1501,52 +1544,18 @@ TEST(Imgproc_resize_area, regression) cv::resize(src, actual, cv::Size(), 0.3, 0.3, INTER_AREA); - ASSERT_EQ(actual.type(), expected.type()); - ASSERT_EQ(actual.size(), expected.size()); - - Mat diff; - absdiff(actual, expected, diff); - - Mat one_channel_diff = diff; //.reshape(1); - - float elem_diff = 1.0f; - Size dsize = actual.size(); - bool next = true; - for (int dy = 0; dy < dsize.height && next; ++dy) - { - ushort* eD = expected.ptr(dy); - ushort* aD = actual.ptr(dy); - - for (int dx = 0; dx < dsize.width && next; ++dx) - if (fabs(static_cast(aD[dx] - eD[dx])) > elem_diff) - { - cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Inf norm: %f\n", static_cast(norm(actual, expected, NORM_INF))); - cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Error in : (%d, %d)\n", dx, dy); - - const int radius = 3; - int rmin = MAX(dy - radius, 0), rmax = MIN(dy + radius, dsize.height); - int cmin = MAX(dx - radius, 0), cmax = MIN(dx + radius, dsize.width); - - std::cout << "Abs diff:" << std::endl << diff << std::endl; - std::cout << "actual result:\n" << actual(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; - std::cout << "expected result:\n" << expected(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; - - next = false; - } - } - - ASSERT_EQ(cvtest::norm(one_channel_diff, cv::NORM_INF), 0); + check_resize_area(expected, actual, 1.0); } TEST(Imgproc_resize_area, regression_half_round) { static uchar input_data[32 * 32]; for(int i = 0; i < 32 * 32; ++i) - input_data[i] = i % 2 + 253 + i / (16 * 32); + input_data[i] = (uchar)(i % 2 + 253 + i / (16 * 32)); static uchar expected_data[16 * 16]; for(int i = 0; i < 16 * 16; ++i) - expected_data[i] = 254 + i / (16 * 8); + expected_data[i] = (uchar)(254 + i / (16 * 8)); cv::Mat src(32, 32, CV_8UC1, input_data); cv::Mat expected(16, 16, CV_8UC1, expected_data); @@ -1554,46 +1563,14 @@ TEST(Imgproc_resize_area, regression_half_round) cv::resize(src, actual, cv::Size(), 0.5, 0.5, INTER_AREA); - ASSERT_EQ(actual.type(), expected.type()); - ASSERT_EQ(actual.size(), expected.size()); - - Mat diff; - absdiff(actual, expected, diff); - - float elem_diff = 0.5f; - Size dsize = actual.size(); - bool next = true; - for (int dy = 0; dy < dsize.height && next; ++dy) - { - uchar* eD = expected.ptr(dy); - uchar* aD = actual.ptr(dy); - - for (int dx = 0; dx < dsize.width && next; ++dx) - if (fabs(static_cast(aD[dx] - eD[dx])) > elem_diff) - { - cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Inf norm: %f\n", static_cast(norm(actual, expected, NORM_INF))); - cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Error in : (%d, %d)\n", dx, dy); - - const int radius = 3; - int rmin = MAX(dy - radius, 0), rmax = MIN(dy + radius, dsize.height); - int cmin = MAX(dx - radius, 0), cmax = MIN(dx + radius, dsize.width); - - std::cout << "Abs diff:" << std::endl << diff << std::endl; - std::cout << "actual result:\n" << actual(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; - std::cout << "expected result:\n" << expected(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; - - next = false; - } - } - - ASSERT_EQ(norm(diff, cv::NORM_INF), 0); + check_resize_area(expected, actual, 0.5); } TEST(Imgproc_resize_area, regression_quarter_round) { static uchar input_data[32 * 32]; for(int i = 0; i < 32 * 32; ++i) - input_data[i] = i % 2 + 253 + i / (16 * 32); + input_data[i] = (uchar)(i % 2 + 253 + i / (16 * 32)); static uchar expected_data[8 * 8]; for(int i = 0; i < 8 * 8; ++i) @@ -1605,39 +1582,7 @@ TEST(Imgproc_resize_area, regression_quarter_round) cv::resize(src, actual, cv::Size(), 0.25, 0.25, INTER_AREA); - ASSERT_EQ(actual.type(), expected.type()); - ASSERT_EQ(actual.size(), expected.size()); - - Mat diff; - absdiff(actual, expected, diff); - - float elem_diff = 0.5f; - Size dsize = actual.size(); - bool next = true; - for (int dy = 0; dy < dsize.height && next; ++dy) - { - uchar* eD = expected.ptr(dy); - uchar* aD = actual.ptr(dy); - - for (int dx = 0; dx < dsize.width && next; ++dx) - if (fabs(static_cast(aD[dx] - eD[dx])) > elem_diff) - { - cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Inf norm: %f\n", static_cast(norm(actual, expected, NORM_INF))); - cvtest::TS::ptr()->printf(cvtest::TS::SUMMARY, "Error in : (%d, %d)\n", dx, dy); - - const int radius = 3; - int rmin = MAX(dy - radius, 0), rmax = MIN(dy + radius, dsize.height); - int cmin = MAX(dx - radius, 0), cmax = MIN(dx + radius, dsize.width); - - std::cout << "Abs diff:" << std::endl << diff << std::endl; - std::cout << "actual result:\n" << actual(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; - std::cout << "expected result:\n" << expected(Range(rmin, rmax), Range(cmin, cmax)) << std::endl; - - next = false; - } - } - - ASSERT_EQ(norm(diff, cv::NORM_INF), 0); + check_resize_area(expected, actual, 0.5); }