pub trait BinaryDescriptorMatcherTraitConst: AlgorithmTraitConst {
    fn as_raw_BinaryDescriptorMatcher(&self) -> *const c_void;

    fn match_(
        &self,
        query_descriptors: &Mat,
        train_descriptors: &Mat,
        matches: &mut Vector<DMatch>,
        mask: &Mat
    ) -> Result<()> { ... } fn knn_match(
        &self,
        query_descriptors: &Mat,
        train_descriptors: &Mat,
        matches: &mut Vector<Vector<DMatch>>,
        k: i32,
        mask: &Mat,
        compact_result: bool
    ) -> Result<()> { ... } fn radius_match(
        &self,
        query_descriptors: &Mat,
        train_descriptors: &Mat,
        matches: &mut Vector<Vector<DMatch>>,
        max_distance: f32,
        mask: &Mat,
        compact_result: bool
    ) -> Result<()> { ... } }
Expand description

furnishes all functionalities for querying a dataset provided by user or internal to class (that user must, anyway, populate) on the model of @ref features2d_match

Once descriptors have been extracted from an image (both they represent lines and points), it becomes interesting to be able to match a descriptor with another one extracted from a different image and representing the same line or point, seen from a differente perspective or on a different scale. In reaching such goal, the main headache is designing an efficient search algorithm to associate a query descriptor to one extracted from a dataset. In the following, a matching modality based on Multi-Index Hashing (MiHashing) will be described.

Multi-Index Hashing

The theory described in this section is based on MIH . Given a dataset populated with binary codes, each code is indexed m times into m different hash tables, according to m substrings it has been divided into. Thus, given a query code, all the entries close to it at least in one substring are returned by search as neighbor candidates. Returned entries are then checked for validity by verifying that their full codes are not distant (in Hamming space) more than r bits from query code. In details, each binary code h composed of b bits is divided into m disjoint substrings inline formula, each with length inline formula or inline formula bits. Formally, when two codes h and g differ by at the most r bits, in at the least one of their m substrings they differ by at the most inline formula bits. In particular, when inline formula (where inline formula is the Hamming norm), there must exist a substring k (with inline formula) such that

block formula

That means that if Hamming distance between each of the m substring is strictly greater than inline formula, then inline formula must be larger that r and that is a contradiction. If the codes in dataset are divided into m substrings, then m tables will be built. Given a query q with substrings inline formula, i-th hash table is searched for entries distant at the most inline formula from inline formula and a set of candidates inline formula is obtained. The union of sets inline formula is a superset of the r-neighbors of q. Then, last step of algorithm is computing the Hamming distance between q and each element in inline formula, deleting the codes that are distant more that r from q.

Required Methods

Provided Methods

For every input query descriptor, retrieve the best matching one from a dataset provided from user or from the one internal to class

Parameters
  • queryDescriptors: query descriptors
  • trainDescriptors: dataset of descriptors furnished by user
  • matches: vector to host retrieved matches
  • mask: mask to select which input descriptors must be matched to one in dataset
C++ default parameters
  • mask: Mat()

For every input query descriptor, retrieve the best k matching ones from a dataset provided from user or from the one internal to class

Parameters
  • queryDescriptors: query descriptors
  • trainDescriptors: dataset of descriptors furnished by user
  • matches: vector to host retrieved matches
  • k: number of the closest descriptors to be returned for every input query
  • mask: mask to select which input descriptors must be matched to ones in dataset
  • compactResult: flag to obtain a compact result (if true, a vector that doesn’t contain any matches for a given query is not inserted in final result)
C++ default parameters
  • mask: Mat()
  • compact_result: false

For every input query descriptor, retrieve, from a dataset provided from user or from the one internal to class, all the descriptors that are not further than maxDist from input query

Parameters
  • queryDescriptors: query descriptors
  • trainDescriptors: dataset of descriptors furnished by user
  • matches: vector to host retrieved matches
  • maxDistance: search radius
  • mask: mask to select which input descriptors must be matched to ones in dataset
  • compactResult: flag to obtain a compact result (if true, a vector that doesn’t contain any matches for a given query is not inserted in final result)
C++ default parameters
  • mask: Mat()
  • compact_result: false

Implementors