2012-01-18 14:43:34 +01:00
Features Finding and Images Matching
====================================
.. highlight :: cpp
detail::ImageFeatures
-----------------------
2012-05-30 13:13:07 +02:00
.. ocv:struct :: detail::ImageFeatures
2012-01-18 14:43:34 +01:00
Structure containing image keypoints and descriptors. ::
struct CV_EXPORTS ImageFeatures
{
int img_idx;
Size img_size;
std::vector<KeyPoint> keypoints;
Mat descriptors;
};
detail::FeaturesFinder
----------------------
.. ocv:class :: detail::FeaturesFinder
Feature finders base class. ::
class CV_EXPORTS FeaturesFinder
{
public:
virtual ~FeaturesFinder() {}
void operator ()(const Mat &image, ImageFeatures &features);
void operator ()(const Mat &image, ImageFeatures &features, const std::vector<cv::Rect> &rois);
virtual void collectGarbage() {}
protected:
virtual void find(const Mat &image, ImageFeatures &features) = 0;
};
2012-01-26 12:47:33 +01:00
detail::FeaturesFinder::operator()
----------------------------------
Finds features in the given image.
.. ocv:function :: void detail::FeaturesFinder::operator ()(const Mat &image, ImageFeatures &features)
.. ocv:function :: void detail::FeaturesFinder::operator ()(const Mat &image, ImageFeatures &features, const std::vector<cv::Rect> &rois)
:param image: Source image
:param features: Found features
2012-05-30 13:13:07 +02:00
2012-01-26 12:47:33 +01:00
:param rois: Regions of interest
2012-05-30 13:13:07 +02:00
.. seealso :: :ocv:struct: `detail::ImageFeatures` , :ocv:class: `Rect_`
2012-01-26 12:47:33 +01:00
detail::FeaturesFinder::collectGarbage
--------------------------------------
Frees unused memory allocated before if there is any.
.. ocv:function :: void detail::FeaturesFinder::collectGarbage()
detail::FeaturesFinder::find
----------------------------
This method must implement features finding logic in order to make the wrappers `detail::FeaturesFinder::operator()`_ work.
2012-05-30 13:13:07 +02:00
.. ocv:function :: void detail::FeaturesFinder::find(const Mat &image, ImageFeatures &features)
2012-01-26 12:47:33 +01:00
:param image: Source image
2012-05-30 13:13:07 +02:00
2012-01-26 12:47:33 +01:00
:param features: Found features
.. seealso :: :ocv:struct: `detail::ImageFeatures`
2012-01-18 14:43:34 +01:00
detail::SurfFeaturesFinder
--------------------------
2012-05-30 13:13:07 +02:00
.. ocv:class :: detail::SurfFeaturesFinder : public detail::FeaturesFinder
2012-01-18 14:43:34 +01:00
SURF features finder. ::
class CV_EXPORTS SurfFeaturesFinder : public FeaturesFinder
{
public:
SurfFeaturesFinder(double hess_thresh = 300., int num_octaves = 3, int num_layers = 4,
int num_octaves_descr = /*4* /3, int num_layers_descr = /*2* /4);
private:
/* hidden * /
};
2012-01-26 12:47:33 +01:00
.. seealso :: :ocv:class: `detail::FeaturesFinder` , :ocv:class: `SURF`
2012-01-18 14:43:34 +01:00
detail::OrbFeaturesFinder
-------------------------
2012-05-30 13:13:07 +02:00
.. ocv:class :: detail::OrbFeaturesFinder : public detail::FeaturesFinder
2012-01-18 14:43:34 +01:00
ORB features finder. ::
class CV_EXPORTS OrbFeaturesFinder : public FeaturesFinder
{
public:
2012-05-30 13:13:07 +02:00
OrbFeaturesFinder(Size _grid_size = Size(3,1), size_t n_features = 1500,
2012-01-18 14:43:34 +01:00
const ORB::CommonParams &detector_params = ORB::CommonParams(1.3f, 5));
private:
/* hidden * /
};
2012-01-26 12:47:33 +01:00
.. seealso :: :ocv:class: `detail::FeaturesFinder` , :ocv:class: `ORB`
2012-01-18 14:43:34 +01:00
detail::MatchesInfo
-------------------
2012-01-26 12:47:33 +01:00
.. ocv:struct :: detail::MatchesInfo
2012-01-18 14:43:34 +01:00
Structure containing information about matches between two images. It's assumed that there is a homography between those images. ::
struct CV_EXPORTS MatchesInfo
{
MatchesInfo();
MatchesInfo(const MatchesInfo &other);
const MatchesInfo& operator =(const MatchesInfo &other);
int src_img_idx, dst_img_idx; // Images indices (optional)
std::vector<DMatch> matches;
std::vector<uchar> inliers_mask; // Geometrically consistent matches mask
int num_inliers; // Number of geometrically consistent matches
Mat H; // Estimated homography
double confidence; // Confidence two images are from the same panorama
};
detail::FeaturesMatcher
-----------------------
.. ocv:class :: detail::FeaturesMatcher
Feature matchers base class. ::
class CV_EXPORTS FeaturesMatcher
{
public:
virtual ~FeaturesMatcher() {}
2012-05-30 13:13:07 +02:00
void operator ()(const ImageFeatures &features1, const ImageFeatures &features2,
2012-01-18 14:43:34 +01:00
MatchesInfo& matches_info) { match(features1, features2, matches_info); }
2012-05-30 13:13:07 +02:00
void operator ()(const std::vector<ImageFeatures> &features, std::vector<MatchesInfo> &pairwise_matches,
2012-01-26 12:47:33 +01:00
const Mat &mask = cv::Mat());
2012-01-18 14:43:34 +01:00
bool isThreadSafe() const { return is_thread_safe_; }
virtual void collectGarbage() {}
protected:
FeaturesMatcher(bool is_thread_safe = false) : is_thread_safe_(is_thread_safe) {}
2012-05-30 13:13:07 +02:00
virtual void match(const ImageFeatures &features1, const ImageFeatures &features2,
2012-01-18 14:43:34 +01:00
MatchesInfo& matches_info) = 0;
bool is_thread_safe_;
};
2012-01-26 12:47:33 +01:00
detail::FeaturesMatcher::operator()
-----------------------------------
Performs images matching.
.. ocv:function :: void detail::FeaturesMatcher::operator ()(const ImageFeatures &features1, const ImageFeatures &features2, MatchesInfo& matches_info)
:param features1: First image features
:param features2: Second image features
:param matches_info: Found matches
2012-05-30 13:13:07 +02:00
.. ocv:function :: void detail::FeaturesMatcher::operator ()( const std::vector<ImageFeatures> & features, std::vector<MatchesInfo> & pairwise_matches, const Mat & mask=Mat() )
2012-01-26 12:47:33 +01:00
:param features: Features of the source images
:param pairwise_matches: Found pairwise matches
:param mask: Mask indicating which image pairs must be matched
2012-04-13 17:31:18 +02:00
The function is parallelized with the TBB library.
2012-01-26 12:47:33 +01:00
.. seealso :: :ocv:struct: `detail::MatchesInfo`
detail::FeaturesMatcher::isThreadSafe
-------------------------------------
.. ocv:function :: bool detail::FeaturesMatcher::isThreadSafe() const
:return: True, if it's possible to use the same matcher instance in parallel, false otherwise
detail::FeaturesMatcher::collectGarbage
---------------------------------------
Frees unused memory allocated before if there is any.
.. ocv:function :: void detail::FeaturesMatcher::collectGarbage()
detail::FeaturesMatcher::match
------------------------------
This method must implement matching logic in order to make the wrappers `detail::FeaturesMatcher::operator()`_ work.
.. ocv:function :: void detail::FeaturesMatcher::match(const ImageFeatures &features1, const ImageFeatures &features2, MatchesInfo& matches_info)
:param features1: First image features
2012-05-30 13:13:07 +02:00
2012-01-26 12:47:33 +01:00
:param features2: Second image features
:param matches_info: Found matches
2012-01-18 14:43:34 +01:00
detail::BestOf2NearestMatcher
-----------------------------
2012-05-30 13:13:07 +02:00
.. ocv:class :: detail::BestOf2NearestMatcher : public detail::FeaturesMatcher
2012-01-18 14:43:34 +01:00
Features matcher which finds two best matches for each feature and leaves the best one only if the ratio between descriptor distances is greater than the threshold `` match_conf `` . ::
class CV_EXPORTS BestOf2NearestMatcher : public FeaturesMatcher
{
public:
2012-05-30 13:13:07 +02:00
BestOf2NearestMatcher(bool try_use_gpu = false, float match_conf = 0.65f,
2012-01-18 14:43:34 +01:00
int num_matches_thresh1 = 6, int num_matches_thresh2 = 6);
void collectGarbage();
protected:
void match(const ImageFeatures &features1, const ImageFeatures &features2, MatchesInfo &matches_info);
int num_matches_thresh1_;
int num_matches_thresh2_;
Ptr<FeaturesMatcher> impl_;
};
.. seealso :: :ocv:class: `detail::FeaturesMatcher`
2012-01-26 12:47:33 +01:00
detail::BestOf2NearestMatcher::BestOf2NearestMatcher
----------------------------------------------------
Constructs a "best of 2 nearest" matcher.
2012-05-30 13:13:07 +02:00
.. ocv:function :: detail::BestOf2NearestMatcher::BestOf2NearestMatcher(bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6, int num_matches_thresh2 = 6)
2012-01-26 12:47:33 +01:00
:param try_use_gpu: Should try to use GPU or not
:param match_conf: Match distances ration threshold
:param num_matches_thresh1: Minimum number of matches required for the 2D projective transform estimation used in the inliers classification step
2012-03-29 10:07:57 +02:00
:param num_matches_thresh2: Minimum number of matches required for the 2D projective transform re-estimation on inliers