--- /dev/null
+diff -ruN a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp
+--- a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp 2019-12-19 04:02:03.000000000 -0700
++++ b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp 2020-03-24 17:09:02.143528875 -0600
+@@ -50,40 +50,6 @@
+ namespace xfeatures2d
+ {
+
+-//! @addtogroup xfeatures2d_nonfree
+-//! @{
+-
+-/** @brief Class for extracting keypoints and computing descriptors using the Scale Invariant Feature Transform
+-(SIFT) algorithm by D. Lowe @cite Lowe04 .
+- */
+-class CV_EXPORTS_W SIFT : public Feature2D
+-{
+-public:
+- /**
+- @param nfeatures The number of best features to retain. The features are ranked by their scores
+- (measured in SIFT algorithm as the local contrast)
+-
+- @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The
+- number of octaves is computed automatically from the image resolution.
+-
+- @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform
+- (low-contrast) regions. The larger the threshold, the less features are produced by the detector.
+-
+- @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning
+- is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are
+- filtered out (more features are retained).
+-
+- @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image
+- is captured with a weak camera with soft lenses, you might want to reduce the number.
+- */
+- CV_WRAP static Ptr<SIFT> create( int nfeatures = 0, int nOctaveLayers = 3,
+- double contrastThreshold = 0.04, double edgeThreshold = 10,
+- double sigma = 1.6);
+-};
+-
+-typedef SIFT SiftFeatureDetector;
+-typedef SIFT SiftDescriptorExtractor;
+-
+ /** @brief Class for extracting Speeded Up Robust Features from an image @cite Bay06 .
+
+ The algorithm parameters:
+diff -ruN a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp
+--- a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp 2019-12-19 04:02:03.000000000 -0700
++++ b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp 2020-03-24 17:09:02.143528875 -0600
+@@ -67,6 +67,39 @@
+ namespace xfeatures2d
+ {
+
++
++/** @brief Class for extracting keypoints and computing descriptors using the Scale Invariant Feature Transform
++(SIFT) algorithm by D. Lowe @cite Lowe04 .
++*/
++class CV_EXPORTS_W SIFT : public Feature2D
++{
++public:
++ /**
++ @param nfeatures The number of best features to retain. The features are ranked by their scores
++ (measured in SIFT algorithm as the local contrast)
++
++ @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The
++ number of octaves is computed automatically from the image resolution.
++
++ @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform
++ (low-contrast) regions. The larger the threshold, the less features are produced by the detector.
++
++ @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning
++ is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are
++ filtered out (more features are retained).
++
++ @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image
++ is captured with a weak camera with soft lenses, you might want to reduce the number.
++ */
++ CV_WRAP static Ptr<SIFT> create(int nfeatures = 0, int nOctaveLayers = 3,
++ double contrastThreshold = 0.04, double edgeThreshold = 10,
++ double sigma = 1.6);
++};
++
++typedef SIFT SiftFeatureDetector;
++typedef SIFT SiftDescriptorExtractor;
++
++
+ //! @addtogroup xfeatures2d_experiment
+ //! @{
+
+diff -ruN a/opencv_contrib/modules/xfeatures2d/src/sift.cpp b/opencv_contrib/modules/xfeatures2d/src/sift.cpp
+--- a/opencv_contrib/modules/xfeatures2d/src/sift.cpp 2019-12-19 04:02:03.000000000 -0700
++++ b/opencv_contrib/modules/xfeatures2d/src/sift.cpp 2020-03-24 17:09:07.164676799 -0600
+@@ -114,8 +114,6 @@
+ namespace xfeatures2d
+ {
+
+-#ifdef OPENCV_ENABLE_NONFREE
+-
+ /*!
+ SIFT implementation.
+
+@@ -1202,14 +1200,5 @@
+ }
+ }
+
+-#else // ! #ifdef OPENCV_ENABLE_NONFREE
+-Ptr<SIFT> SIFT::create( int, int, double, double, double )
+-{
+- CV_Error(Error::StsNotImplemented,
+- "This algorithm is patented and is excluded in this configuration; "
+- "Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library");
+-}
+-#endif
+-
+ }
+ }
+diff -ruN a/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp b/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp
+--- a/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp 2019-12-19 04:02:03.000000000 -0700
++++ b/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp 2020-03-24 17:09:07.165676829 -0600
+@@ -94,7 +94,6 @@
+ /*
+ * Descriptors
+ */
+-#ifdef OPENCV_ENABLE_NONFREE
+ TEST( Features2d_DescriptorExtractor_SIFT, regression )
+ {
+ CV_DescriptorExtractorTest<L1<float> > test( "descriptor-sift", 1.0f,
+@@ -102,6 +101,7 @@
+ test.safe_run();
+ }
+
++#ifdef OPENCV_ENABLE_NONFREE
+ TEST( Features2d_DescriptorExtractor_SURF, regression )
+ {
+ #ifdef HAVE_OPENCL
+@@ -375,8 +375,9 @@
+ Ptr<Feature2D> f2d;
+ };
+
+-#ifdef OPENCV_ENABLE_NONFREE
+ TEST(Features2d_SIFTHomographyTest, regression) { CV_DetectPlanarTest test("SIFT", 80, SIFT::create()); test.safe_run(); }
++
++#ifdef OPENCV_ENABLE_NONFREE
+ TEST(Features2d_SURFHomographyTest, regression) { CV_DetectPlanarTest test("SURF", 80, SURF::create()); test.safe_run(); }
+ #endif
+
+@@ -441,13 +442,13 @@
+ Ptr<FeatureDetector> featureDetector_;
+ };
+
+-#ifdef OPENCV_ENABLE_NONFREE
+ TEST(Features2d_SIFT_using_mask, regression)
+ {
+ FeatureDetectorUsingMaskTest test(SIFT::create());
+ test.safe_run();
+ }
+
++#ifdef OPENCV_ENABLE_NONFREE
+ TEST(DISABLED_Features2d_SURF_using_mask, regression)
+ {
+ FeatureDetectorUsingMaskTest test(SURF::create());