From 362655b02a028bb1780bf791f02ae4e523d0054c Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 29 Nov 2012 11:17:04 +0400 Subject: [PATCH] fixed Bug #2581 GoodFeaturesToTrackDetector_GPU fails when no corners found --- modules/gpu/src/gftt.cpp | 6 ++++++ modules/gpu/test/test_video.cpp | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/modules/gpu/src/gftt.cpp b/modules/gpu/src/gftt.cpp index ad24debcd..0c8f165ae 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 ca9442d69..ecba4b5a0 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))));