From f2e6a30046389d8d2b84ace340ec6321792512a0 Mon Sep 17 00:00:00 2001 From: Tomoaki Teshima Date: Thu, 19 Jan 2023 22:08:28 +0900 Subject: [PATCH] make test tolerate to rounding error --- modules/xfeatures2d/test/test_surf.cuda.cpp | 14 +++----- modules/xfeatures2d/test/test_surf.ocl.cpp | 37 +++++++++++++++++---- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/modules/xfeatures2d/test/test_surf.cuda.cpp b/modules/xfeatures2d/test/test_surf.cuda.cpp index 48ff01822a3..383ce3c736e 100644 --- a/modules/xfeatures2d/test/test_surf.cuda.cpp +++ b/modules/xfeatures2d/test/test_surf.cuda.cpp @@ -99,7 +99,8 @@ CUDA_TEST_P(CUDA_SURF, Detector) std::vector keypoints_gold; surf_gold->detect(image, keypoints_gold); - ASSERT_EQ(keypoints_gold.size(), keypoints.size()); + int lengthDiff = abs((int)keypoints_gold.size()) - ((int)keypoints.size()); + EXPECT_LE(lengthDiff, 1); int matchedCount = getMatchedPointsCount(keypoints_gold, keypoints); double matchedRatio = static_cast(matchedCount) / keypoints_gold.size(); @@ -130,7 +131,8 @@ CUDA_TEST_P(CUDA_SURF, Detector_Masked) std::vector keypoints_gold; surf_gold->detect(image, keypoints_gold, mask); - ASSERT_EQ(keypoints_gold.size(), keypoints.size()); + int lengthDiff = abs((int)keypoints_gold.size()) - ((int)keypoints.size()); + EXPECT_LE(lengthDiff, 1); int matchedCount = getMatchedPointsCount(keypoints_gold, keypoints); double matchedRatio = static_cast(matchedCount) / keypoints_gold.size(); @@ -171,19 +173,11 @@ CUDA_TEST_P(CUDA_SURF, Descriptor) EXPECT_GT(matchedRatio, 0.6); } -#if defined (__x86_64__) || defined (_M_X64) testing::internal::ValueArray3 thresholdValues = testing::Values( SURF_HessianThreshold(100.0), SURF_HessianThreshold(500.0), SURF_HessianThreshold(1000.0)); -#else -// hessian computation is not bit-exact and lower threshold causes different count of detection -testing::internal::ValueArray2 thresholdValues = - testing::Values( - SURF_HessianThreshold(830.0), - SURF_HessianThreshold(1000.0)); -#endif INSTANTIATE_TEST_CASE_P(CUDA_Features2D, CUDA_SURF, testing::Combine( thresholdValues, diff --git a/modules/xfeatures2d/test/test_surf.ocl.cpp b/modules/xfeatures2d/test/test_surf.ocl.cpp index 6a4ee6adf49..a1759141a46 100644 --- a/modules/xfeatures2d/test/test_surf.ocl.cpp +++ b/modules/xfeatures2d/test/test_surf.ocl.cpp @@ -78,13 +78,35 @@ static int getMatchedPointsCount(std::vector& gold, std::vector& shorter = gold; + std::vector& longer = actual; + if (actual.size() < gold.size()) + { + shorter = actual; + longer = gold; + } + for (size_t i = 0; i < shorter.size(); ++i) + { + const cv::KeyPoint& p1 = shorter[i]; + const cv::KeyPoint& p2 = longer[i]; + const cv::KeyPoint& p3 = longer[i+1]; + + if (keyPointsEquals(p1, p2) || keyPointsEquals(p1, p3)) + ++validCount; + } } return validCount; @@ -154,7 +176,8 @@ TEST_P(SURF, Detector) std::vector keypoints_gold; surf->detect(image, keypoints_gold, cv::noArray()); - ASSERT_EQ(keypoints_gold.size(), keypoints.size()); + int lengthDiff = abs((int)keypoints_gold.size()) - ((int)keypoints.size()); + EXPECT_LE(lengthDiff, 1); int matchedCount = getMatchedPointsCount(keypoints_gold, keypoints); double matchedRatio = static_cast(matchedCount) / keypoints_gold.size();