diff --git a/modules/gpu/src/gftt.cpp b/modules/gpu/src/gftt.cpp index ad24debcd7..0c8f165ae1 100644 --- a/modules/gpu/src/gftt.cpp +++ b/modules/gpu/src/gftt.cpp @@ -85,6 +85,12 @@ void cv::gpu::GoodFeaturesToTrackDetector_GPU::operator ()(const GpuMat& image, int total = findCorners_gpu(eig_, static_cast(maxVal * qualityLevel), mask, tmpCorners_.ptr(), tmpCorners_.cols); + if (total == 0) + { + corners.release(); + return; + } + sortCorners_gpu(eig_, tmpCorners_.ptr(), total); if (minDistance < 1) diff --git a/modules/gpu/test/test_video.cpp b/modules/gpu/test/test_video.cpp index ca9442d697..ecba4b5a0f 100644 --- a/modules/gpu/test/test_video.cpp +++ b/modules/gpu/test/test_video.cpp @@ -203,6 +203,21 @@ TEST_P(GoodFeaturesToTrack, Accuracy) } } +TEST_P(GoodFeaturesToTrack, EmptyCorners) +{ + int maxCorners = 1000; + double qualityLevel = 0.01; + + cv::gpu::GoodFeaturesToTrackDetector_GPU detector(maxCorners, qualityLevel, minDistance); + + cv::gpu::GpuMat src(100, 100, CV_8UC1, cv::Scalar::all(0)); + cv::gpu::GpuMat corners(1, maxCorners, CV_32FC2); + + detector(src, corners); + + ASSERT_TRUE( corners.empty() ); +} + INSTANTIATE_TEST_CASE_P(GPU_Video, GoodFeaturesToTrack, testing::Combine( ALL_DEVICES, testing::Values(MinDistance(0.0), MinDistance(3.0))));