From e22979f33425e40e2e4f6e803af329c7eccc1a85 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Mon, 18 May 2015 14:16:55 +0300 Subject: [PATCH] fix #4343 : cv::cuda::findMinMaxLoc incorrect output for single row matrix --- modules/cudaarithm/test/test_reductions.cpp | 38 ++++++++++++++++++++++ .../opencv2/cudev/grid/detail/minmaxloc.hpp | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/modules/cudaarithm/test/test_reductions.cpp b/modules/cudaarithm/test/test_reductions.cpp index a95d007..9a88549 100644 --- a/modules/cudaarithm/test/test_reductions.cpp +++ b/modules/cudaarithm/test/test_reductions.cpp @@ -587,6 +587,44 @@ CUDA_TEST_P(MinMaxLoc, WithoutMask) } } +CUDA_TEST_P(MinMaxLoc, OneRowMat) +{ + cv::Mat src = randomMat(cv::Size(size.width, 1), depth); + + double minVal, maxVal; + cv::Point minLoc, maxLoc; + cv::cuda::minMaxLoc(loadMat(src, useRoi), &minVal, &maxVal, &minLoc, &maxLoc); + + double minVal_gold, maxVal_gold; + cv::Point minLoc_gold, maxLoc_gold; + minMaxLocGold(src, &minVal_gold, &maxVal_gold, &minLoc_gold, &maxLoc_gold); + + EXPECT_DOUBLE_EQ(minVal_gold, minVal); + EXPECT_DOUBLE_EQ(maxVal_gold, maxVal); + + expectEqual(src, minLoc_gold, minLoc); + expectEqual(src, maxLoc_gold, maxLoc); +} + +CUDA_TEST_P(MinMaxLoc, OneColumnMat) +{ + cv::Mat src = randomMat(cv::Size(1, size.height), depth); + + double minVal, maxVal; + cv::Point minLoc, maxLoc; + cv::cuda::minMaxLoc(loadMat(src, useRoi), &minVal, &maxVal, &minLoc, &maxLoc); + + double minVal_gold, maxVal_gold; + cv::Point minLoc_gold, maxLoc_gold; + minMaxLocGold(src, &minVal_gold, &maxVal_gold, &minLoc_gold, &maxLoc_gold); + + EXPECT_DOUBLE_EQ(minVal_gold, minVal); + EXPECT_DOUBLE_EQ(maxVal_gold, maxVal); + + expectEqual(src, minLoc_gold, minLoc); + expectEqual(src, maxLoc_gold, maxLoc); +} + CUDA_TEST_P(MinMaxLoc, Async) { cv::Mat src = randomMat(size, depth); diff --git a/modules/cudev/include/opencv2/cudev/grid/detail/minmaxloc.hpp b/modules/cudev/include/opencv2/cudev/grid/detail/minmaxloc.hpp index 793dcc7..eb34d7f 100644 --- a/modules/cudev/include/opencv2/cudev/grid/detail/minmaxloc.hpp +++ b/modules/cudev/include/opencv2/cudev/grid/detail/minmaxloc.hpp @@ -156,7 +156,7 @@ namespace grid_minmaxloc_detail __host__ void minMaxLoc(const SrcPtr& src, ResType* minVal, ResType* maxVal, int* minLoc, int* maxLoc, const MaskPtr& mask, int rows, int cols, cudaStream_t stream) { dim3 block, grid; - getLaunchCfg(cols, rows, block, grid); + getLaunchCfg(rows, cols, block, grid); const int patch_x = divUp(divUp(cols, grid.x), block.x); const int patch_y = divUp(divUp(rows, grid.y), block.y); -- 2.7.4