Skip to content

Commit 622318a

Browse files
committed
Merge pull request opencv#9561 from dkurt:fix_8693
2 parents b8b5d83 + 8b09475 commit 622318a

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

modules/core/src/matrix.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4021,6 +4021,11 @@ void cv::reduce(InputArray _src, OutputArray _dst, int dim, int op, int dtype)
40214021
CV_OCL_RUN(_dst.isUMat(),
40224022
ocl_reduce(_src, _dst, dim, op, op0, stype, dtype))
40234023

4024+
// Fake reference to source. Resolves issue 8693 in case of src == dst.
4025+
UMat srcUMat;
4026+
if (_src.isUMat())
4027+
srcUMat = _src.getUMat();
4028+
40244029
Mat src = _src.getMat();
40254030
_dst.create(dim == 0 ? 1 : src.rows, dim == 0 ? src.cols : 1, dtype);
40264031
Mat dst = _dst.getMat(), temp = dst;

modules/core/src/umatrix.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,8 @@ void UMat::convertTo(OutputArray _dst, int _type, double alpha, double beta) con
961961
}
962962
}
963963
#endif
964+
UMat src = *this; // Fake reference to itself.
965+
// Resolves issue 8693 in case of src == dst.
964966
Mat m = getMat(ACCESS_READ);
965967
m.convertTo(_dst, _type, alpha, beta);
966968
}

modules/core/test/test_umat.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,4 +1366,21 @@ TEST(UMat, DISABLED_regression_5991)
13661366
EXPECT_EQ(0, cvtest::norm(mat.getMat(ACCESS_READ), Mat(3, sz, CV_8U, Scalar(1)), NORM_INF));
13671367
}
13681368

1369+
TEST(UMat, testTempObjects_Mat_issue_8693)
1370+
{
1371+
UMat srcUMat(3, 4, CV_32FC1);
1372+
Mat srcMat;
1373+
1374+
randu(srcUMat, -1.f, 1.f);
1375+
srcUMat.copyTo(srcMat);
1376+
1377+
reduce(srcUMat, srcUMat, 0, CV_REDUCE_SUM);
1378+
reduce(srcMat, srcMat, 0, CV_REDUCE_SUM);
1379+
1380+
srcUMat.convertTo(srcUMat, CV_64FC1);
1381+
srcMat.convertTo(srcMat, CV_64FC1);
1382+
1383+
EXPECT_EQ(0, cvtest::norm(srcUMat.getMat(ACCESS_READ), srcMat, NORM_INF));
1384+
}
1385+
13691386
} } // namespace cvtest::ocl

0 commit comments

Comments
 (0)