Exposing the FAST detector threshold for ORB
authorFelix Endres <endres@informatik.uni-freiburg.de>
Thu, 2 Oct 2014 10:17:01 +0000 (12:17 +0200)
committerFelix Endres <endres@informatik.uni-freiburg.de>
Thu, 2 Oct 2014 10:17:01 +0000 (12:17 +0200)
Implemented as a new optional parameter for
the constructor of the ORB detector. The
change of this parameter has been included
in the orb unit test.

modules/features2d/include/opencv2/features2d.hpp
modules/features2d/src/features2d_init.cpp
modules/features2d/src/orb.cpp
modules/features2d/test/test_orb.cpp

index 9f46ee2..b9e0855 100644 (file)
@@ -317,7 +317,7 @@ public:
     enum { kBytes = 32, HARRIS_SCORE=0, FAST_SCORE=1 };
 
     CV_WRAP explicit ORB(int nfeatures = 500, float scaleFactor = 1.2f, int nlevels = 8, int edgeThreshold = 31,
-        int firstLevel = 0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31 );
+        int firstLevel = 0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold = 20);
 
     // returns the descriptor size in bytes
     int descriptorSize() const;
@@ -348,6 +348,7 @@ protected:
     CV_PROP_RW int WTA_K;
     CV_PROP_RW int scoreType;
     CV_PROP_RW int patchSize;
+    CV_PROP_RW int fastThreshold;
 };
 
 typedef ORB OrbFeatureDetector;
index eb71456..01bf7c9 100644 (file)
@@ -104,7 +104,8 @@ CV_INIT_ALGORITHM(ORB, "Feature2D.ORB",
                   obj.info()->addParam(obj, "edgeThreshold", obj.edgeThreshold);
                   obj.info()->addParam(obj, "patchSize", obj.patchSize);
                   obj.info()->addParam(obj, "WTA_K", obj.WTA_K);
-                  obj.info()->addParam(obj, "scoreType", obj.scoreType))
+                  obj.info()->addParam(obj, "scoreType", obj.scoreType);
+                  obj.info()->addParam(obj, "fastThreshold", obj.fastThreshold))
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -226,4 +227,4 @@ bool cv::initModule_features2d(void)
     all &= !FlannBasedMatcher_info_auto.name().empty();
 
     return all;
-}
\ No newline at end of file
+}
index 4fe9cbc..6f14565 100644 (file)
@@ -648,10 +648,10 @@ static inline float getScale(int level, int firstLevel, double scaleFactor)
  * @param detector_params parameters to use
  */
 ORB::ORB(int _nfeatures, float _scaleFactor, int _nlevels, int _edgeThreshold,
-         int _firstLevel, int _WTA_K, int _scoreType, int _patchSize) :
+         int _firstLevel, int _WTA_K, int _scoreType, int _patchSize, int _fastThreshold) :
     nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(_nlevels),
     edgeThreshold(_edgeThreshold), firstLevel(_firstLevel), WTA_K(_WTA_K),
-    scoreType(_scoreType), patchSize(_patchSize)
+    scoreType(_scoreType), patchSize(_patchSize), fastThreshold(_fastThreshold)
 {}
 
 
@@ -729,7 +729,7 @@ static void computeKeyPoints(const Mat& imagePyramid,
                              std::vector<KeyPoint>& allKeypoints,
                              int nfeatures, double scaleFactor,
                              int edgeThreshold, int patchSize, int scoreType,
-                             bool useOCL )
+                             bool useOCL, int fastThreshold  )
 {
     int i, nkeypoints, level, nlevels = (int)layerInfo.size();
     std::vector<int> nfeaturesPerLevel(nlevels);
@@ -780,7 +780,7 @@ static void computeKeyPoints(const Mat& imagePyramid,
         Mat mask = maskPyramid.empty() ? Mat() : maskPyramid(layerInfo[level]);
 
         // Detect FAST features, 20 is a good threshold
-        FastFeatureDetector fd(20, true);
+        FastFeatureDetector fd(fastThreshold, true);
         fd.detect(img, keypoints, mask);
 
         // Remove keypoints very close to the border
@@ -1028,7 +1028,7 @@ void ORB::operator()( InputArray _image, InputArray _mask, std::vector<KeyPoint>
         // Get keypoints, those will be far enough from the border that no check will be required for the descriptor
         computeKeyPoints(imagePyramid, uimagePyramid, maskPyramid,
                          layerInfo, ulayerInfo, layerScale, keypoints,
-                         nfeatures, scaleFactor, edgeThreshold, patchSize, scoreType, useOCL);
+                         nfeatures, scaleFactor, edgeThreshold, patchSize, scoreType, useOCL, fastThreshold);
     }
     else
     {
@@ -1126,4 +1126,5 @@ void ORB::computeImpl( InputArray image, std::vector<KeyPoint>& keypoints, Outpu
     (*this)(image, Mat(), keypoints, descriptors, true);
 }
 
+
 }
index aa8cdbd..45e7690 100644 (file)
@@ -48,6 +48,8 @@ using namespace cv;
 TEST(Features2D_ORB, _1996)
 {
     Ptr<FeatureDetector> fd = FeatureDetector::create("ORB");
+    fd->set("nFeatures", 10000);//setting a higher maximum to make effect of threshold visible
+    fd->set("fastThreshold", 20);//more features than the default
     Ptr<DescriptorExtractor> de = DescriptorExtractor::create("ORB");
 
     Mat image = imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/lena.png");