diff --git a/modules/cudaarithm/perf/perf_reductions.cpp b/modules/cudaarithm/perf/perf_reductions.cpp index 78699c0a74..54c5147372 100644 --- a/modules/cudaarithm/perf/perf_reductions.cpp +++ b/modules/cudaarithm/perf/perf_reductions.cpp @@ -368,6 +368,8 @@ PERF_TEST_P(Sz_Depth_Cn_Code_Dim, Reduce, TEST_CYCLE() cv::cuda::reduce(d_src, dst, dim, reduceOp, CV_32F); + dst = dst.reshape(dst.channels(), 1); + CUDA_SANITY_CHECK(dst); } else diff --git a/modules/cudaarithm/src/cuda/reduce.cu b/modules/cudaarithm/src/cuda/reduce.cu index 5fb90287a9..3f907c7955 100644 --- a/modules/cudaarithm/src/cuda/reduce.cu +++ b/modules/cudaarithm/src/cuda/reduce.cu @@ -137,7 +137,7 @@ void cv::cuda::reduce(InputArray _src, OutputArray _dst, int dim, int reduceOp, if (dtype < 0) dtype = src.depth(); - GpuMat dst = getOutputMat(_dst, 1, dim == 0 ? src.cols : src.rows, CV_MAKE_TYPE(CV_MAT_DEPTH(dtype), src.channels()), stream); + GpuMat dst = getOutputMat(_dst, dim == 0 ? 1 : src.rows, dim == 0 ? src.cols : 1, CV_MAKE_TYPE(CV_MAT_DEPTH(dtype), src.channels()), stream); if (dim == 0) { diff --git a/modules/cudaarithm/test/test_reductions.cpp b/modules/cudaarithm/test/test_reductions.cpp index a0ff0dfa44..48abdfe40a 100644 --- a/modules/cudaarithm/test/test_reductions.cpp +++ b/modules/cudaarithm/test/test_reductions.cpp @@ -877,14 +877,11 @@ CUDA_TEST_P(Reduce, Cols) { cv::Mat src = randomMat(size, type); - cv::cuda::GpuMat dst = createMat(cv::Size(src.rows, 1), dst_type, useRoi); + cv::cuda::GpuMat dst; cv::cuda::reduce(loadMat(src, useRoi), dst, 1, reduceOp, dst_depth); cv::Mat dst_gold; cv::reduce(src, dst_gold, 1, reduceOp, dst_depth); - dst_gold.cols = dst_gold.rows; - dst_gold.rows = 1; - dst_gold.step = dst_gold.cols * dst_gold.elemSize(); EXPECT_MAT_NEAR(dst_gold, dst, dst_depth < CV_32F ? 0.0 : 0.02); } diff --git a/modules/cudev/include/opencv2/cudev/grid/reduce_to_vec.hpp b/modules/cudev/include/opencv2/cudev/grid/reduce_to_vec.hpp index 595ee8be6f..599c2514e5 100644 --- a/modules/cudev/include/opencv2/cudev/grid/reduce_to_vec.hpp +++ b/modules/cudev/include/opencv2/cudev/grid/reduce_to_vec.hpp @@ -182,7 +182,7 @@ __host__ void gridReduceToColumn_(const SrcPtr& src, GpuMat_& dst, cons CV_Assert( getRows(mask) == rows && getCols(mask) == cols ); - dst.create(1, rows); + cuda::createContinuous(rows, 1, dst.type(), dst); grid_reduce_to_vec_detail::reduceToColumn(shrinkPtr(src), dst[0], @@ -197,7 +197,7 @@ __host__ void gridReduceToColumn_(const SrcPtr& src, GpuMat_& dst, Stre const int rows = getRows(src); const int cols = getCols(src); - dst.create(1, rows); + cuda::createContinuous(rows, 1, dst.type(), dst); grid_reduce_to_vec_detail::reduceToColumn(shrinkPtr(src), dst[0], diff --git a/modules/cudev/test/test_reduction.cu b/modules/cudev/test/test_reduction.cu index c376059870..03c78def15 100644 --- a/modules/cudev/test/test_reduction.cu +++ b/modules/cudev/test/test_reduction.cu @@ -228,9 +228,6 @@ TEST(ReduceToColumn, Sum) Mat dst_gold; cv::reduce(src, dst_gold, 1, REDUCE_SUM, CV_32S); - dst_gold.cols = dst_gold.rows; - dst_gold.rows = 1; - dst_gold.step = dst_gold.cols * dst_gold.elemSize(); EXPECT_MAT_NEAR(dst_gold, dst, 0.0); } @@ -247,9 +244,6 @@ TEST(ReduceToColumn, Avg) Mat dst_gold; cv::reduce(src, dst_gold, 1, REDUCE_AVG, CV_32F); - dst_gold.cols = dst_gold.rows; - dst_gold.rows = 1; - dst_gold.step = dst_gold.cols * dst_gold.elemSize(); EXPECT_MAT_NEAR(dst_gold, dst, 1e-4); } @@ -266,9 +260,6 @@ TEST(ReduceToColumn, Min) Mat dst_gold; cv::reduce(src, dst_gold, 1, REDUCE_MIN); - dst_gold.cols = dst_gold.rows; - dst_gold.rows = 1; - dst_gold.step = dst_gold.cols * dst_gold.elemSize(); EXPECT_MAT_NEAR(dst_gold, dst, 0.0); } @@ -285,9 +276,6 @@ TEST(ReduceToColumn, Max) Mat dst_gold; cv::reduce(src, dst_gold, 1, REDUCE_MAX); - dst_gold.cols = dst_gold.rows; - dst_gold.rows = 1; - dst_gold.step = dst_gold.cols * dst_gold.elemSize(); EXPECT_MAT_NEAR(dst_gold, dst, 0.0); }