1
0
mirror of https://github.com/opencv/opencv_contrib.git synced 2025-10-19 11:21:39 +08:00
Files
opencv_contrib/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp
2018-09-07 18:50:57 +03:00

290 lines
9.5 KiB
C++

// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html
#include "test_precomp.hpp"
#include "features2d/test/test_detectors_invariance.impl.hpp" // main OpenCV repo
#include "features2d/test/test_descriptors_invariance.impl.hpp" // main OpenCV repo
namespace opencv_test { namespace {
static const char* const IMAGE_TSUKUBA = "features2d/tsukuba.png";
static const char* const IMAGE_BIKES = "detectors_descriptors_evaluation/images_datasets/bikes/img1.png";
// ========================== ROTATION INVARIANCE =============================
#ifdef OPENCV_ENABLE_NONFREE
INSTANTIATE_TEST_CASE_P(SURF, DetectorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA, SURF::create(), 0.40f, 0.76f)
));
INSTANTIATE_TEST_CASE_P(SIFT, DetectorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA, SIFT::create(), 0.45f, 0.70f)
));
INSTANTIATE_TEST_CASE_P(SURF, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA, SURF::create(), SURF::create(), 0.83f)
));
INSTANTIATE_TEST_CASE_P(SIFT, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA, SIFT::create(), SIFT::create(), 0.98f)
));
INSTANTIATE_TEST_CASE_P(LATCH, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA, SIFT::create(), LATCH::create(), 0.9999f)
));
#endif // NONFREE
INSTANTIATE_TEST_CASE_P(DAISY, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
BRISK::create(),
DAISY::create(15, 3, 8, 8, DAISY::NRM_NONE, noArray(), true, true),
0.79f)
));
INSTANTIATE_TEST_CASE_P(VGG120, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
KAZE::create(),
VGG::create(VGG::VGG_120, 1.4f, true, true, 48.0f, false),
0.97f)
));
INSTANTIATE_TEST_CASE_P(VGG80, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
KAZE::create(),
VGG::create(VGG::VGG_80, 1.4f, true, true, 48.0f, false),
0.97f)
));
INSTANTIATE_TEST_CASE_P(VGG64, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
KAZE::create(),
VGG::create(VGG::VGG_64, 1.4f, true, true, 48.0f, false),
0.97f)
));
INSTANTIATE_TEST_CASE_P(VGG48, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
KAZE::create(),
VGG::create(VGG::VGG_48, 1.4f, true, true, 48.0f, false),
0.97f)
));
#ifdef OPENCV_ENABLE_NONFREE
INSTANTIATE_TEST_CASE_P(BRIEF_64, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BriefDescriptorExtractor::create(64,true),
0.98f)
));
INSTANTIATE_TEST_CASE_P(BRIEF_32, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BriefDescriptorExtractor::create(32,true),
0.97f)
));
INSTANTIATE_TEST_CASE_P(BRIEF_16, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BriefDescriptorExtractor::create(16, true),
0.98f)
));
INSTANTIATE_TEST_CASE_P(FREAK, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
FREAK::create(),
0.90f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BGM, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BoostDesc::create(BoostDesc::BGM, true, 6.25f),
0.999f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BGM_HARD, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BoostDesc::create(BoostDesc::BGM_HARD, true, 6.25f),
0.98f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BGM_BILINEAR, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BoostDesc::create(BoostDesc::BGM_BILINEAR, true, 6.25f),
0.98f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BGM_LBGM, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BoostDesc::create(BoostDesc::LBGM, true, 6.25f),
0.999f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_64, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BoostDesc::create(BoostDesc::BINBOOST_64, true, 6.25f),
0.98f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_128, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BoostDesc::create(BoostDesc::BINBOOST_128, true, 6.25f),
0.98f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_256, DescriptorRotationInvariance, Values(
make_tuple(IMAGE_TSUKUBA,
SURF::create(),
BoostDesc::create(BoostDesc::BINBOOST_256, true, 6.25f),
0.999f)
));
#endif
// ============================ SCALE INVARIANCE ==============================
#ifdef OPENCV_ENABLE_NONFREE
INSTANTIATE_TEST_CASE_P(SURF, DetectorScaleInvariance, Values(
make_tuple(IMAGE_BIKES, SURF::create(), 0.64f, 0.84f)
));
INSTANTIATE_TEST_CASE_P(SIFT, DetectorScaleInvariance, Values(
make_tuple(IMAGE_BIKES, SIFT::create(), 0.55f, 0.99f)
));
INSTANTIATE_TEST_CASE_P(SURF, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES, SURF::create(), SURF::create(), 0.7f)
));
INSTANTIATE_TEST_CASE_P(SIFT, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES, SIFT::create(), SIFT::create(), 0.3f)
));
#endif // NONFREE
#if 0 // DAISY is not scale invariant
INSTANTIATE_TEST_CASE_P(DISABLED_DAISY, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
BRISK::create(),
DAISY::create(15, 3, 8, 8, DAISY::NRM_NONE, noArray(), true, true),
0.1f)
));
#endif
INSTANTIATE_TEST_CASE_P(VGG120, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
KAZE::create(),
VGG::create(VGG::VGG_120, 1.4f, true, true, 48.0f, false),
0.98f)
));
INSTANTIATE_TEST_CASE_P(VGG80, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
KAZE::create(),
VGG::create(VGG::VGG_80, 1.4f, true, true, 48.0f, false),
0.98f)
));
INSTANTIATE_TEST_CASE_P(VGG64, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
KAZE::create(),
VGG::create(VGG::VGG_64, 1.4f, true, true, 48.0f, false),
0.97f)
));
INSTANTIATE_TEST_CASE_P(VGG48, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
KAZE::create(),
VGG::create(VGG::VGG_48, 1.4f, true, true, 48.0f, false),
0.93f)
));
#ifdef OPENCV_ENABLE_NONFREE // SURF detector is used in tests
INSTANTIATE_TEST_CASE_P(BoostDesc_BGM, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
SURF::create(),
BoostDesc::create(BoostDesc::BGM, true, 6.25f),
0.98f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BGM_HARD, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
SURF::create(),
BoostDesc::create(BoostDesc::BGM_HARD, true, 6.25f),
0.75f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BGM_BILINEAR, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
SURF::create(),
BoostDesc::create(BoostDesc::BGM_BILINEAR, true, 6.25f),
0.95f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_LBGM, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
SURF::create(),
BoostDesc::create(BoostDesc::LBGM, true, 6.25f),
0.95f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_64, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
SURF::create(),
BoostDesc::create(BoostDesc::BINBOOST_64, true, 6.25f),
0.75f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_128, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
SURF::create(),
BoostDesc::create(BoostDesc::BINBOOST_128, true, 6.25f),
0.95f)
));
INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_256, DescriptorScaleInvariance, Values(
make_tuple(IMAGE_BIKES,
SURF::create(),
BoostDesc::create(BoostDesc::BINBOOST_256, true, 6.25f),
0.98f)
));
#endif // NONFREE
// ============================== OTHER TESTS =================================
#ifdef OPENCV_ENABLE_NONFREE
TEST(Features2d_RotationInvariance2_Detector_SURF, regression)
{
Mat cross(100, 100, CV_8UC1, Scalar(255));
line(cross, Point(30, 50), Point(69, 50), Scalar(100), 3);
line(cross, Point(50, 30), Point(50, 69), Scalar(100), 3);
Ptr<SURF> surf = SURF::create(8000., 3, 4, true, false);
vector<KeyPoint> keypoints;
surf->detect(cross, keypoints);
// Expect 5 keypoints. One keypoint has coordinates (50.0, 50.0).
// The other 4 keypoints should have the same response.
// The order of the keypoints is indeterminate.
ASSERT_EQ(keypoints.size(), (vector<KeyPoint>::size_type) 5);
int i1 = -1;
for(int i = 0; i < 5; i++)
{
if(keypoints[i].pt.x == 50.0f)
;
else if(i1 == -1)
i1 = i;
else
ASSERT_LT(fabs(keypoints[i1].response - keypoints[i].response) / keypoints[i1].response, 1e-6);
}
}
#endif // NONFREE
}} // namespace