Merge pull request #3299 from felixendres:orb_keypoint_detector_threshold
This commit is contained in:
commit
9575a82a9e
@ -317,7 +317,7 @@ public:
|
|||||||
enum { kBytes = 32, HARRIS_SCORE=0, FAST_SCORE=1 };
|
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,
|
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
|
// returns the descriptor size in bytes
|
||||||
int descriptorSize() const;
|
int descriptorSize() const;
|
||||||
@ -348,6 +348,7 @@ protected:
|
|||||||
CV_PROP_RW int WTA_K;
|
CV_PROP_RW int WTA_K;
|
||||||
CV_PROP_RW int scoreType;
|
CV_PROP_RW int scoreType;
|
||||||
CV_PROP_RW int patchSize;
|
CV_PROP_RW int patchSize;
|
||||||
|
CV_PROP_RW int fastThreshold;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef ORB OrbFeatureDetector;
|
typedef ORB OrbFeatureDetector;
|
||||||
|
@ -91,7 +91,8 @@ CV_INIT_ALGORITHM(ORB, "Feature2D.ORB",
|
|||||||
obj.info()->addParam(obj, "edgeThreshold", obj.edgeThreshold);
|
obj.info()->addParam(obj, "edgeThreshold", obj.edgeThreshold);
|
||||||
obj.info()->addParam(obj, "patchSize", obj.patchSize);
|
obj.info()->addParam(obj, "patchSize", obj.patchSize);
|
||||||
obj.info()->addParam(obj, "WTA_K", obj.WTA_K);
|
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))
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -649,10 +649,10 @@ static inline float getScale(int level, int firstLevel, double scaleFactor)
|
|||||||
* @param detector_params parameters to use
|
* @param detector_params parameters to use
|
||||||
*/
|
*/
|
||||||
ORB::ORB(int _nfeatures, float _scaleFactor, int _nlevels, int _edgeThreshold,
|
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),
|
nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(_nlevels),
|
||||||
edgeThreshold(_edgeThreshold), firstLevel(_firstLevel), WTA_K(_WTA_K),
|
edgeThreshold(_edgeThreshold), firstLevel(_firstLevel), WTA_K(_WTA_K),
|
||||||
scoreType(_scoreType), patchSize(_patchSize)
|
scoreType(_scoreType), patchSize(_patchSize), fastThreshold(_fastThreshold)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -730,7 +730,7 @@ static void computeKeyPoints(const Mat& imagePyramid,
|
|||||||
std::vector<KeyPoint>& allKeypoints,
|
std::vector<KeyPoint>& allKeypoints,
|
||||||
int nfeatures, double scaleFactor,
|
int nfeatures, double scaleFactor,
|
||||||
int edgeThreshold, int patchSize, int scoreType,
|
int edgeThreshold, int patchSize, int scoreType,
|
||||||
bool useOCL )
|
bool useOCL, int fastThreshold )
|
||||||
{
|
{
|
||||||
int i, nkeypoints, level, nlevels = (int)layerInfo.size();
|
int i, nkeypoints, level, nlevels = (int)layerInfo.size();
|
||||||
std::vector<int> nfeaturesPerLevel(nlevels);
|
std::vector<int> nfeaturesPerLevel(nlevels);
|
||||||
@ -781,7 +781,7 @@ static void computeKeyPoints(const Mat& imagePyramid,
|
|||||||
Mat mask = maskPyramid.empty() ? Mat() : maskPyramid(layerInfo[level]);
|
Mat mask = maskPyramid.empty() ? Mat() : maskPyramid(layerInfo[level]);
|
||||||
|
|
||||||
// Detect FAST features, 20 is a good threshold
|
// Detect FAST features, 20 is a good threshold
|
||||||
FastFeatureDetector fd(20, true);
|
FastFeatureDetector fd(fastThreshold, true);
|
||||||
fd.detect(img, keypoints, mask);
|
fd.detect(img, keypoints, mask);
|
||||||
|
|
||||||
// Remove keypoints very close to the border
|
// Remove keypoints very close to the border
|
||||||
@ -1033,7 +1033,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
|
// Get keypoints, those will be far enough from the border that no check will be required for the descriptor
|
||||||
computeKeyPoints(imagePyramid, uimagePyramid, maskPyramid,
|
computeKeyPoints(imagePyramid, uimagePyramid, maskPyramid,
|
||||||
layerInfo, ulayerInfo, layerScale, keypoints,
|
layerInfo, ulayerInfo, layerScale, keypoints,
|
||||||
nfeatures, scaleFactor, edgeThreshold, patchSize, scoreType, useOCL);
|
nfeatures, scaleFactor, edgeThreshold, patchSize, scoreType, useOCL, fastThreshold);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1131,4 +1131,5 @@ void ORB::computeImpl( InputArray image, std::vector<KeyPoint>& keypoints, Outpu
|
|||||||
(*this)(image, Mat(), keypoints, descriptors, true);
|
(*this)(image, Mat(), keypoints, descriptors, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,8 @@ using namespace cv;
|
|||||||
TEST(Features2D_ORB, _1996)
|
TEST(Features2D_ORB, _1996)
|
||||||
{
|
{
|
||||||
Ptr<FeatureDetector> fd = FeatureDetector::create("ORB");
|
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");
|
Ptr<DescriptorExtractor> de = DescriptorExtractor::create("ORB");
|
||||||
|
|
||||||
Mat image = imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/lena.png");
|
Mat image = imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/lena.png");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user