From: Felix Endres Date: Thu, 2 Oct 2014 10:17:01 +0000 (+0200) Subject: Exposing the FAST detector threshold for ORB X-Git-Tag: submit/tizen_ivi/20141117.190038~2^2~62^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ee6835492cc3cbb71070b1d1a309119f51485eb3;p=profile%2Fivi%2Fopencv.git Exposing the FAST detector threshold for ORB 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. --- diff --git a/modules/features2d/include/opencv2/features2d.hpp b/modules/features2d/include/opencv2/features2d.hpp index 9f46ee2..b9e0855 100644 --- a/modules/features2d/include/opencv2/features2d.hpp +++ b/modules/features2d/include/opencv2/features2d.hpp @@ -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; diff --git a/modules/features2d/src/features2d_init.cpp b/modules/features2d/src/features2d_init.cpp index eb71456..01bf7c9 100644 --- a/modules/features2d/src/features2d_init.cpp +++ b/modules/features2d/src/features2d_init.cpp @@ -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 +} diff --git a/modules/features2d/src/orb.cpp b/modules/features2d/src/orb.cpp index 4fe9cbc..6f14565 100644 --- a/modules/features2d/src/orb.cpp +++ b/modules/features2d/src/orb.cpp @@ -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& 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 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 // 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& keypoints, Outpu (*this)(image, Mat(), keypoints, descriptors, true); } + } diff --git a/modules/features2d/test/test_orb.cpp b/modules/features2d/test/test_orb.cpp index aa8cdbd..45e7690 100644 --- a/modules/features2d/test/test_orb.cpp +++ b/modules/features2d/test/test_orb.cpp @@ -48,6 +48,8 @@ using namespace cv; TEST(Features2D_ORB, _1996) { Ptr 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 de = DescriptorExtractor::create("ORB"); Mat image = imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/lena.png");