diff --git a/modules/features2d/include/opencv2/features2d/features2d.hpp b/modules/features2d/include/opencv2/features2d/features2d.hpp index 489bf8d1e..a9e973923 100644 --- a/modules/features2d/include/opencv2/features2d/features2d.hpp +++ b/modules/features2d/include/opencv2/features2d/features2d.hpp @@ -1248,6 +1248,13 @@ public: protected: virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const = 0; + + /* + * Remove keypoints that are not in the mask. + * Helper function, useful when wrapping a library call for keypoint detection that + * does not support a mask argument. + */ + static void removeInvalidPoints( const Mat& mask, vector<KeyPoint>& keypoints ); }; class CV_EXPORTS FastFeatureDetector : public FeatureDetector @@ -1258,7 +1265,7 @@ public: virtual void write( FileStorage& fs ) const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; int threshold; bool nonmaxSuppression; @@ -1291,9 +1298,9 @@ public: virtual void write( FileStorage& fs ) const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; - - Params params; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + + Params params; }; class CV_EXPORTS MserFeatureDetector : public FeatureDetector @@ -1306,7 +1313,7 @@ public: virtual void write( FileStorage& fs ) const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; MSER mser; }; @@ -1321,7 +1328,7 @@ public: virtual void write( FileStorage& fs ) const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; StarDetector star; }; @@ -1340,7 +1347,7 @@ public: virtual void write( FileStorage& fs ) const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; SIFT sift; }; @@ -1353,7 +1360,7 @@ public: virtual void write( FileStorage& fs ) const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; SURF surf; }; @@ -1425,9 +1432,9 @@ public: // TODO implement read/write protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; - Params params; + Params params; }; /* @@ -1451,7 +1458,7 @@ public: virtual bool empty() const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; Ptr<FeatureDetector> detector; int maxTotalKeypoints; @@ -1472,7 +1479,7 @@ public: virtual bool empty() const; protected: - virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; + virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const; Ptr<FeatureDetector> detector; int levels; @@ -1655,6 +1662,12 @@ public: protected: virtual void computeImpl( const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors ) const = 0; + + /* + * Remove keypoints within borderPixels of an image edge. + */ + static void removeBorderKeypoints( vector<KeyPoint>& keypoints, + Size imageSize, int borderSize ); }; /* diff --git a/modules/features2d/src/descriptors.cpp b/modules/features2d/src/descriptors.cpp index 82dffd3ce..fb0bfb4a0 100644 --- a/modules/features2d/src/descriptors.cpp +++ b/modules/features2d/src/descriptors.cpp @@ -89,6 +89,12 @@ bool DescriptorExtractor::empty() const return false; } +void DescriptorExtractor::removeBorderKeypoints( vector<KeyPoint>& keypoints, + Size imageSize, int borderSize ) +{ + KeyPointsFilter::runByImageBorder( keypoints, imageSize, borderSize ); +} + Ptr<DescriptorExtractor> DescriptorExtractor::create(const string& descriptorExtractorType) { DescriptorExtractor* de = 0; diff --git a/modules/features2d/src/detectors.cpp b/modules/features2d/src/detectors.cpp index 552adf394..c6efe0053 100644 --- a/modules/features2d/src/detectors.cpp +++ b/modules/features2d/src/detectors.cpp @@ -82,6 +82,11 @@ bool FeatureDetector::empty() const return false; } +void FeatureDetector::removeInvalidPoints( const Mat& mask, vector<KeyPoint>& keypoints ) +{ + KeyPointsFilter::runByPixelsMask( keypoints, mask ); +} + Ptr<FeatureDetector> FeatureDetector::create( const string& detectorType ) { FeatureDetector* fd = 0;