diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index 47cf92e3c..f0ed60959 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -1423,7 +1423,7 @@ public: dsize.width *= cn; AutoBuffer _buffer(dsize.width*2); WT *buf = _buffer, *sum = buf + dsize.width; - int k, sy, dx, cur_dy = 0; + int k = -1000, sy = -1000, dx = -1000, cur_dy = -1000; WT scale_y = (WT)scale_y_; CV_Assert( cn <= 4 ); @@ -1567,7 +1567,8 @@ public: T* D = (T*)(dst.data + dst.step*cur_dy); if( fabs(beta) < 1e-3 ) { - if(cur_dy >= dsize.height) return; + if(cur_dy >= dsize.height) + return; for( dx = 0; dx < dsize.width; dx++ ) { D[dx] = saturate_cast((sum[dx] + buf[dx]) / min(scale_y, src.rows - cur_dy * scale_y)); @@ -1614,19 +1615,23 @@ private: resizeArea_Invoker& operator=(const resizeArea_Invoker&); }; -template +template static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, int xofs_count, double scale_y_) { #ifdef HAVE_TBB Size ssize = src.size(), dsize = dst.size(); AutoBuffer _yofs(2 * ssize.height); int *yofs = _yofs, *cur_dy_ofs = _yofs + ssize.height; - int index = 0, cur_dy = 0, sy; + int index = 0, cur_dy = 0; - for( sy = 0; sy < ssize.height; sy++ ) + // cur_dy_ofs - dy for the current sy + // yofs - a starting row for calculating a band according to the current sy + + for (int sy = 0; sy < ssize.height; sy++) { - bool reset = false; cur_dy_ofs[sy] = cur_dy; + yofs[sy] = index; + if ((cur_dy + 1) * scale_y_ <= sy + 1 || sy == ssize.height - 1 ) { WT beta = (WT)std::max(sy + 1 - (cur_dy + 1) * scale_y_, 0.); @@ -1634,13 +1639,10 @@ static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, in { if (cur_dy >= dsize.height) break; - reset = true; + index = sy + 1; } cur_dy++; } - yofs[sy] = index; - if (reset) - index = sy + 1; } #endif diff --git a/modules/imgproc/test/test_imgwarp.cpp b/modules/imgproc/test/test_imgwarp.cpp index abed4bae6..83246db71 100644 --- a/modules/imgproc/test/test_imgwarp.cpp +++ b/modules/imgproc/test/test_imgwarp.cpp @@ -1491,18 +1491,21 @@ TEST(Imgproc_resize_area, regression) }; cv::Mat src(16, 16, CV_16UC1, input_data); - cv::Mat expected(5,5,CV_16UC1, expected_data); + cv::Mat expected(5, 5, CV_16UC1, expected_data); cv::Mat actual(expected.size(), expected.type()); 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); + std::cout << "Abs diff:" << std::endl << diff << std::endl; - int elem_diff = 1; + 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) @@ -1527,7 +1530,7 @@ TEST(Imgproc_resize_area, regression) } } - ASSERT_EQ(norm(one_channel_diff, cv::NORM_INF),0); + ASSERT_EQ(norm(one_channel_diff, cv::NORM_INF), 0); }