diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index d7c9c64c3c..c0eaf8114c 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -2501,6 +2501,9 @@ static bool ocl_warpTransform_cols4(InputArray _src, OutputArray _dst, InputArra _dst.create( dsize.empty() ? src.size() : dsize, src.type() ); UMat dst = _dst.getUMat(); + if (src.u == dst.u) + src = src.clone(); + float M[9] = {0}; int matRows = (op_type == OCL_OP_AFFINE ? 2 : 3); Mat matM(matRows, 3, CV_32F, M), M1 = _M0.getMat(); @@ -2605,6 +2608,9 @@ static bool ocl_warpTransform(InputArray _src, OutputArray _dst, InputArray _M0, _dst.create( dsize.empty() ? src.size() : dsize, src.type() ); UMat dst = _dst.getUMat(); + if (src.u == dst.u) + src = src.clone(); + double M[9] = {0}; int matRows = (op_type == OCL_OP_AFFINE ? 2 : 3); Mat matM(matRows, 3, CV_64F, M), M1 = _M0.getMat(); diff --git a/modules/imgproc/test/ocl/test_warp.cpp b/modules/imgproc/test/ocl/test_warp.cpp index 852dc465ab..73d93bb41f 100644 --- a/modules/imgproc/test/ocl/test_warp.cpp +++ b/modules/imgproc/test/ocl/test_warp.cpp @@ -185,6 +185,26 @@ OCL_TEST_P(WarpAffine, Mat) } } +OCL_TEST_P(WarpAffine, inplace_25853) // when src and dst are the same variable, ocl on/off should produce consistent and correct results +{ + for (int j = 0; j < test_loop_times; j++) + { + double eps = depth < CV_32F ? 0.04 : 0.06; + random_roi(); + + Mat M = getRotationMatrix2D(Point2f(src_roi.cols / 2.0f, src_roi.rows / 2.0f), + rng.uniform(-180.f, 180.f), rng.uniform(0.4f, 2.0f)); + + OCL_OFF(cv::warpAffine(src_roi, src_roi, M, dsize, interpolation)); + OCL_ON(cv::warpAffine(usrc_roi, usrc_roi, M, dsize, interpolation)); + + dst_roi = src_roi.clone(); + udst_roi = usrc_roi.clone(); + + Near(eps); + } +} + typedef WarpTest_cols4_Base WarpAffine_cols4; OCL_TEST_P(WarpAffine_cols4, Mat)