diff --git a/modules/xfeatures2d/CMakeLists.txt b/modules/xfeatures2d/CMakeLists.txt index b6663eda957..f30d2ed8c21 100644 --- a/modules/xfeatures2d/CMakeLists.txt +++ b/modules/xfeatures2d/CMakeLists.txt @@ -5,17 +5,34 @@ if(HAVE_CUDA) endif() ocv_define_module(xfeatures2d opencv_core opencv_imgproc opencv_features2d opencv_calib3d OPTIONAL opencv_shape opencv_ml opencv_cudaarithm WRAP python java objc) -include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_vgg.cmake) -include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_boostdesc.cmake) -set(DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/downloads/xfeatures2d") -download_boost_descriptors("${DOWNLOAD_DIR}" boost_status) -download_vgg_descriptors("${DOWNLOAD_DIR}" vgg_status) -if(NOT boost_status OR NOT vgg_status) - ocv_module_disable(xfeatures2d) -endif() +if(NOT OPENCV_SKIP_FEATURES2D_DOWNLOADING) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_vgg.cmake) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/download_boostdesc.cmake) + set(DOWNLOAD_DIR "${OpenCV_BINARY_DIR}/downloads/xfeatures2d") + download_boost_descriptors("${DOWNLOAD_DIR}" boost_status) + download_vgg_descriptors("${DOWNLOAD_DIR}" vgg_status) + if(boost_status) + ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/boostdesc.cpp "OPENCV_XFEATURES2D_HAS_BOOST_DATA=1") + else() + message(WARNING "features2d: Boost descriptor implementation is not available due to missing data (download failed: https://github.com/opencv/opencv_contrib/issues/1301)") + endif() + if(vgg_status) + ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/vgg.cpp "OPENCV_XFEATURES2D_HAS_VGG_DATA=1") + else() + message(WARNING "features2d: VGG descriptor implementation is not available due to missing data (download failed: https://github.com/opencv/opencv_contrib/issues/1301)") + endif() -ocv_module_include_directories("${DOWNLOAD_DIR}") + if(boost_status OR vgg_status) + ocv_module_include_directories("${DOWNLOAD_DIR}") + endif() +endif() if(TARGET opencv_test_${name}) ocv_target_include_directories(opencv_test_${name} "${OpenCV_SOURCE_DIR}/modules") # use common files from features2d tests + if(boost_status) + ocv_target_compile_definitions(opencv_test_${name} PRIVATE "OPENCV_XFEATURES2D_HAS_BOOST_DATA=1") + endif() + if(vgg_status) + ocv_target_compile_definitions(opencv_test_${name} PRIVATE "OPENCV_XFEATURES2D_HAS_VGG_DATA=1") + endif() endif() diff --git a/modules/xfeatures2d/perf/perf_vgg.cpp b/modules/xfeatures2d/perf/perf_vgg.cpp index 8de79a531d3..095a745dd52 100644 --- a/modules/xfeatures2d/perf/perf_vgg.cpp +++ b/modules/xfeatures2d/perf/perf_vgg.cpp @@ -5,6 +5,8 @@ namespace opencv_test { namespace { +#ifdef OPENCV_XFEATURES2D_HAS_VGG_DATA + typedef perf::TestBaseWithParam vgg; #define VGG_IMAGES \ @@ -32,4 +34,6 @@ PERF_TEST_P(vgg, extract, testing::Values(VGG_IMAGES)) SANITY_CHECK_NOTHING(); } +#endif // OPENCV_XFEATURES2D_HAS_VGG_DATA + }} // namespace diff --git a/modules/xfeatures2d/src/boostdesc.cpp b/modules/xfeatures2d/src/boostdesc.cpp index 3f7ee225fc9..fe672a7324f 100644 --- a/modules/xfeatures2d/src/boostdesc.cpp +++ b/modules/xfeatures2d/src/boostdesc.cpp @@ -65,6 +65,8 @@ namespace cv namespace xfeatures2d { +#ifdef OPENCV_XFEATURES2D_HAS_BOOST_DATA + /* !BoostDesc implementation */ @@ -729,9 +731,16 @@ BoostDesc_Impl::~BoostDesc_Impl() { } +#endif // OPENCV_XFEATURES2D_HAS_BOOST_DATA + Ptr BoostDesc::create( int desc, bool use_scale_orientation, float scale_factor ) { +#ifdef OPENCV_XFEATURES2D_HAS_BOOST_DATA return makePtr( desc, use_scale_orientation, scale_factor ); +#else + CV_UNUSED(desc); CV_UNUSED(use_scale_orientation); CV_UNUSED(scale_factor); + CV_Error(Error::StsNotImplemented, "The OpenCV xfeatures2d binaries is built without downloaded Boost decriptor features: https://github.com/opencv/opencv_contrib/issues/1301"); +#endif } diff --git a/modules/xfeatures2d/src/vgg.cpp b/modules/xfeatures2d/src/vgg.cpp index a187f6b1d7a..506f5d0c13d 100644 --- a/modules/xfeatures2d/src/vgg.cpp +++ b/modules/xfeatures2d/src/vgg.cpp @@ -66,6 +66,8 @@ namespace cv namespace xfeatures2d { +#ifdef OPENCV_XFEATURES2D_HAS_VGG_DATA + /* !VGG implementation */ @@ -527,10 +529,18 @@ VGG_Impl::~VGG_Impl() { } +#endif + Ptr VGG::create( int desc, float isigma, bool img_normalize, bool use_scale_orientation, float scale_factor, bool dsc_normalize ) { +#ifdef OPENCV_XFEATURES2D_HAS_VGG_DATA return makePtr( desc, isigma, img_normalize, use_scale_orientation, scale_factor, dsc_normalize ); +#else + CV_UNUSED(desc); CV_UNUSED(isigma); CV_UNUSED(img_normalize); + CV_UNUSED(use_scale_orientation); CV_UNUSED(scale_factor); CV_UNUSED(dsc_normalize); + CV_Error(Error::StsNotImplemented, "The OpenCV xfeatures2d binaries is built without downloaded VGG decriptor features: https://github.com/opencv/opencv_contrib/issues/1301"); +#endif } diff --git a/modules/xfeatures2d/test/test_features2d.cpp b/modules/xfeatures2d/test/test_features2d.cpp index 6cf3bc09907..325d5972f20 100644 --- a/modules/xfeatures2d/test/test_features2d.cpp +++ b/modules/xfeatures2d/test/test_features2d.cpp @@ -192,13 +192,16 @@ TEST(Features2d_DescriptorExtractor_BEBLID, regression ) test.safe_run(); } +#ifdef OPENCV_XFEATURES2D_HAS_VGG_DATA TEST( Features2d_DescriptorExtractor_VGG, regression ) { CV_DescriptorExtractorTest > test( "descriptor-vgg", 0.03f, VGG::create() ); test.safe_run(); } +#endif // OPENCV_XFEATURES2D_HAS_VGG_DATA +#ifdef OPENCV_XFEATURES2D_HAS_BOOST_DATA TEST( Features2d_DescriptorExtractor_BGM, regression ) { CV_DescriptorExtractorTest test( "descriptor-boostdesc-bgm", @@ -254,7 +257,7 @@ TEST( Features2d_DescriptorExtractor_BINBOOST_256, regression ) BoostDesc::create(BoostDesc::BINBOOST_256) ); test.safe_run(); } - +#endif // OPENCV_XFEATURES2D_HAS_BOOST_DATA #ifdef OPENCV_ENABLE_NONFREE TEST(Features2d_BruteForceDescriptorMatcher_knnMatch, regression) diff --git a/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp b/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp index 538fac526db..707a0bab4da 100644 --- a/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp +++ b/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp @@ -40,6 +40,7 @@ INSTANTIATE_TEST_CASE_P(DAISY, DescriptorRotationInvariance, Values( DAISY::create(15, 3, 8, 8, DAISY::NRM_NONE, noArray(), true, true), 0.79f) )); +#ifdef OPENCV_XFEATURES2D_HAS_VGG_DATA INSTANTIATE_TEST_CASE_P(VGG120, DescriptorRotationInvariance, Values( make_tuple(IMAGE_TSUKUBA, KAZE::create(), @@ -64,7 +65,7 @@ INSTANTIATE_TEST_CASE_P(VGG48, DescriptorRotationInvariance, Values( VGG::create(VGG::VGG_48, 1.4f, true, true, 48.0f, false), 0.97f) )); - +#endif // OPENCV_XFEATURES2D_HAS_VGG_DATA #ifdef OPENCV_ENABLE_NONFREE @@ -96,6 +97,7 @@ INSTANTIATE_TEST_CASE_P(FREAK, DescriptorRotationInvariance, Values( 0.90f) )); +#ifdef OPENCV_XFEATURES2D_HAS_BOOST_DATA INSTANTIATE_TEST_CASE_P(BoostDesc_BGM, DescriptorRotationInvariance, Values( make_tuple(IMAGE_TSUKUBA, SURF::create(), @@ -144,6 +146,7 @@ INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_256, DescriptorRotationInvariance, Va BoostDesc::create(BoostDesc::BINBOOST_256, true, 6.25f), 0.999f) )); +#endif // OPENCV_XFEATURES2D_HAS_BOOST_DATA #endif @@ -170,6 +173,7 @@ INSTANTIATE_TEST_CASE_P(DISABLED_DAISY, DescriptorScaleInvariance, Values( )); #endif +#ifdef OPENCV_XFEATURES2D_HAS_VGG_DATA INSTANTIATE_TEST_CASE_P(VGG120, DescriptorScaleInvariance, Values( make_tuple(IMAGE_BIKES, KAZE::create(), @@ -194,8 +198,10 @@ INSTANTIATE_TEST_CASE_P(VGG48, DescriptorScaleInvariance, Values( VGG::create(VGG::VGG_48, 1.4f, true, true, 48.0f, false), 0.93f) )); +#endif // OPENCV_XFEATURES2D_HAS_VGG_DATA #ifdef OPENCV_ENABLE_NONFREE // SURF detector is used in tests +#ifdef OPENCV_XFEATURES2D_HAS_BOOST_DATA INSTANTIATE_TEST_CASE_P(BoostDesc_BGM, DescriptorScaleInvariance, Values( make_tuple(IMAGE_BIKES, SURF::create(), @@ -238,6 +244,7 @@ INSTANTIATE_TEST_CASE_P(BoostDesc_BINBOOST_256, DescriptorScaleInvariance, Value BoostDesc::create(BoostDesc::BINBOOST_256, true, 6.25f), 0.98f) )); +#endif // OPENCV_XFEATURES2D_HAS_BOOST_DATA #endif // NONFREE