Matchers of keypoint descriptors in OpenCV have wrappers with a common interface that enables you to easily switch
between different algorithms solving the same problem. This section is devoted to matching descriptors
that cannot be represented as vectors in a multidimensional space. GenericDescriptorMatcher
is a more generic interface for descriptors. It does not make any assumptions about descriptor representation.
Every descriptor with the
DescriptorExtractor
interface has a wrapper with the GenericDescriptorMatcher
interface (see
VectorDescriptorMatcher
).
There are descriptors such as the One-way descriptor and Ferns that have the GenericDescriptorMatcher
interface implemented but do not support DescriptorExtractor
.
Note
GenericDescriptorMatcher
¶Abstract interface for extracting and matching a keypoint descriptor. There are also DescriptorExtractor
and DescriptorMatcher
for these purposes but their interfaces are intended for descriptors represented as vectors in a multidimensional space. GenericDescriptorMatcher
is a more generic interface for descriptors. DescriptorMatcher
and GenericDescriptorMatcher
have two groups of match methods: for matching keypoints of an image with another image or with an image set.
class GenericDescriptorMatcher
{
public:
GenericDescriptorMatcher();
virtual ~GenericDescriptorMatcher();
virtual void add( const vector<Mat>& images,
vector<vector<KeyPoint> >& keypoints );
const vector<Mat>& getTrainImages() const;
const vector<vector<KeyPoint> >& getTrainKeypoints() const;
virtual void clear();
virtual void train() = 0;
virtual bool isMaskSupported() = 0;
void classify( const Mat& queryImage,
vector<KeyPoint>& queryKeypoints,
const Mat& trainImage,
vector<KeyPoint>& trainKeypoints ) const;
void classify( const Mat& queryImage,
vector<KeyPoint>& queryKeypoints );
/*
* Group of methods to match keypoints from an image pair.
*/
void match( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
vector<DMatch>& matches, const Mat& mask=Mat() ) const;
void knnMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
vector<vector<DMatch> >& matches, int k,
const Mat& mask=Mat(), bool compactResult=false ) const;
void radiusMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
vector<vector<DMatch> >& matches, float maxDistance,
const Mat& mask=Mat(), bool compactResult=false ) const;
/*
* Group of methods to match keypoints from one image to an image set.
*/
void match( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
vector<DMatch>& matches, const vector<Mat>& masks=vector<Mat>() );
void knnMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
vector<vector<DMatch> >& matches, int k,
const vector<Mat>& masks=vector<Mat>(), bool compactResult=false );
void radiusMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
vector<vector<DMatch> >& matches, float maxDistance,
const vector<Mat>& masks=vector<Mat>(), bool compactResult=false );
virtual void read( const FileNode& );
virtual void write( FileStorage& ) const;
virtual Ptr<GenericDescriptorMatcher> clone( bool emptyTrainData=false ) const = 0;
protected:
...
};
Adds images and their keypoints to the training collection stored in the class instance.
void GenericDescriptorMatcher::
add
(const vector<Mat>& images, vector<vector<KeyPoint>>& keypoints)¶Parameters: |
|
---|
Returns a train image collection.
const vector<Mat>& GenericDescriptorMatcher::
getTrainImages
() const
¶Returns a train keypoints collection.
const vector<vector<KeyPoint>>& GenericDescriptorMatcher::
getTrainKeypoints
() const
¶Clears a train collection (images and keypoints).
void GenericDescriptorMatcher::
clear
()¶Trains descriptor matcher
void GenericDescriptorMatcher::
train
()¶Prepares descriptor matcher, for example, creates a tree-based structure, to extract descriptors or to optimize descriptors matching.
Returns true
if a generic descriptor matcher supports masking permissible matches.
bool GenericDescriptorMatcher::
isMaskSupported
()¶Classifies keypoints from a query set.
void GenericDescriptorMatcher::
classify
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints) const
¶
void GenericDescriptorMatcher::
classify
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints)¶Parameters: |
|
---|
The method classifies each keypoint from a query set. The first variant of the method takes a train image and its keypoints as an input argument. The second variant uses the internally stored training collection that can be built using the GenericDescriptorMatcher::add
method.
The methods do the following:
GenericDescriptorMatcher::match
method to find correspondence between the query set and the training set.class_id
field of each keypoint from the query set to class_id
of the corresponding keypoint from the training set.Finds the best match in the training set for each keypoint from the query set.
void GenericDescriptorMatcher::
match
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints, vector<DMatch>& matches, const Mat& mask=Mat() ) const
¶
void GenericDescriptorMatcher::
match
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, vector<DMatch>& matches, const vector<Mat>& masks=vector<Mat>() )¶Parameters: |
|
---|
The methods find the best match for each query keypoint. In the first variant of the method, a train image and its keypoints are the input arguments. In the second variant, query keypoints are matched to the internally stored training collection that can be built using the GenericDescriptorMatcher::add
method. Optional mask (or masks) can be passed to specify which query and training descriptors can be matched. Namely, queryKeypoints[i]
can be matched with trainKeypoints[j]
only if mask.at<uchar>(i,j)
is non-zero.
Finds the k
best matches for each query keypoint.
void GenericDescriptorMatcher::
knnMatch
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints, vector<vector<DMatch>>& matches, int k, const Mat& mask=Mat(), bool compactResult=false ) const
¶
void GenericDescriptorMatcher::
knnMatch
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, vector<vector<DMatch>>& matches, int k, const vector<Mat>& masks=vector<Mat>(), bool compactResult=false )¶The methods are extended variants of GenericDescriptorMatch::match
. The parameters are similar, and the semantics is similar to DescriptorMatcher::knnMatch
. But this class does not require explicitly computed keypoint descriptors.
For each query keypoint, finds the training keypoints not farther than the specified distance.
void GenericDescriptorMatcher::
radiusMatch
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints, vector<vector<DMatch>>& matches, float maxDistance, const Mat& mask=Mat(), bool compactResult=false ) const
¶
void GenericDescriptorMatcher::
radiusMatch
(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, vector<vector<DMatch>>& matches, float maxDistance, const vector<Mat>& masks=vector<Mat>(), bool compactResult=false )¶The methods are similar to DescriptorMatcher::radius
. But this class does not require explicitly computed keypoint descriptors.
Reads a matcher object from a file node.
void GenericDescriptorMatcher::
read
(const FileNode& fn)¶Writes a match object to a file storage.
void GenericDescriptorMatcher::
write
(FileStorage& fs) const
¶Clones the matcher.
Ptr<GenericDescriptorMatcher> GenericDescriptorMatcher::
clone
(bool emptyTrainData=false ) const
¶Parameters: |
|
---|
VectorDescriptorMatcher
: public GenericDescriptorMatcher
¶Class used for matching descriptors that can be described as vectors in a finite-dimensional space.
class CV_EXPORTS VectorDescriptorMatcher : public GenericDescriptorMatcher
{
public:
VectorDescriptorMatcher( const Ptr<DescriptorExtractor>& extractor, const Ptr<DescriptorMatcher>& matcher );
virtual ~VectorDescriptorMatcher();
virtual void add( const vector<Mat>& imgCollection,
vector<vector<KeyPoint> >& pointCollection );
virtual void clear();
virtual void train();
virtual bool isMaskSupported();
virtual void read( const FileNode& fn );
virtual void write( FileStorage& fs ) const;
virtual Ptr<GenericDescriptorMatcher> clone( bool emptyTrainData=false ) const;
protected:
...
};
Example:
VectorDescriptorMatcher matcher( new SurfDescriptorExtractor,
new BruteForceMatcher<L2<float> > );