Class cv::line_descriptor::BinaryDescriptorMatcher#

furnishes all functionalities for querying a dataset provided by user or internal to class (that user must, anyway, populate) on the model of Descriptor Matchers View details

Collaboration diagram for cv::line_descriptor::BinaryDescriptorMatcher:

Public Member Functions#

Public Member Functions inherited from cv::Algorithm

Return

Name

Description

Algorithm()

~Algorithm()

void

clear()

Clears the algorithm state.

bool

empty()

Returns true if the Algorithm is empty (e.g. in the very beginning or after unsuccessful read.

String

getDefaultName()

void

read(const FileNode & fn)

Reads algorithm parameters from a file storage.

void

save(const String & filename)

void

write(
    const Ptr< FileStorage > & fs,
    const String & name = String() )

void

write(FileStorage & fs)

Stores algorithm parameters in a file storage.

void

write(
    FileStorage & fs,
    const String & name )

Static Public Member Functions#

Static Public Member Functions inherited from cv::Algorithm

Return

Name

Description

static Ptr< _Tp >

load(
    const String & filename,
    const String & objname = String() )

Loads algorithm from the file.

static Ptr< _Tp >

loadFromString(
    const String & strModel,
    const String & objname = String() )

Loads algorithm from a String.

static Ptr< _Tp >

read(const FileNode & fn)

Reads algorithm from the file node.

Additional Inherited Members#

Protected Member Functions inherited from cv::Algorithm

Return

Name

Description

void

writeFormat(FileStorage & fs)

Detailed Description#

class BinaryDescriptorMatcher : public cv::Algorithm#

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

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 \(\mathbf{h}^{(1)}, ..., \mathbf{h}^{(m)}\), each with length \(\lfloor b/m \rfloor\) or \(\lceil b/m \rceil\) 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 \(\lfloor r/m \rfloor\) bits. In particular, when \(||\mathbf{h}-\mathbf{g}||_H \le r\) (where \(||.||_H\) is the Hamming norm), there must exist a substring k (with \(1 \le k \le m\)) such that

\[||\mathbf{h}^{(k)} - \mathbf{g}^{(k)}||_H \le \left\lfloor \frac{r}{m} \right\rfloor .\]

That means that if Hamming distance between each of the m substring is strictly greater than \(\lfloor r/m \rfloor\), then \(||\mathbf{h}-\mathbf{g}||_H\) 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 \(\{\mathbf{q}^{(i)}\}^m_{i=1}\), i-th hash table is searched for entries distant at the most \(\lfloor r/m \rfloor\) from \(\mathbf{q}^{(i)}\) and a set of candidates \(\mathcal{N}_i(\mathbf{q})\) is obtained. The union of sets \(\mathcal{N}(\mathbf{q}) = \bigcup_i \mathcal{N}_i(\mathbf{q})\) 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 \(\mathcal{N}(\mathbf{q})\), deleting the codes that are distant more that r from q.

Constructor & Destructor Documentation#

BinaryDescriptorMatcher()#

cv::line_descriptor::BinaryDescriptorMatcher::BinaryDescriptorMatcher()

Python:

cv.line_descriptor.BinaryDescriptorMatcher() -> <line_descriptor_BinaryDescriptorMatcher object>

Constructor.

The BinaryDescriptorMatcher constructed is able to store and manage 256-bits long entries.

~BinaryDescriptorMatcher()#

cv::line_descriptor::BinaryDescriptorMatcher::~BinaryDescriptorMatcher()

destructor

Member Function Documentation#

add()#

void cv::line_descriptor::BinaryDescriptorMatcher::add(const std::vector< Mat > & descriptors)

Store locally new descriptors to be inserted in dataset, without updating dataset.

Note

Each matrix i in descriptors should contain descriptors relative to lines extracted from i*-th image.

Parameters

  • descriptors — matrices containing descriptors to be inserted into dataset

clear()#

void cv::line_descriptor::BinaryDescriptorMatcher::clear()

Clear dataset and internal data.

knnMatch()#

void cv::line_descriptor::BinaryDescriptorMatcher::knnMatch(
const Mat & queryDescriptors,
const Mat & trainDescriptors,
std::vector< std::vector< DMatch > > & matches,
int k,
const Mat & mask = Mat(),
bool compactResult = false )

Python:

cv.line_descriptor.BinaryDescriptorMatcher.knnMatch(queryDescriptors, trainDescriptors, k[, mask[, compactResult]]) -> matches
cv.line_descriptor.BinaryDescriptorMatcher.knnMatchQuery(queryDescriptors, matches, k[, masks[, compactResult]])

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)

knnMatch()#

void cv::line_descriptor::BinaryDescriptorMatcher::knnMatch(
const Mat & queryDescriptors,
std::vector< std::vector< DMatch > > & matches,
int k,
const std::vector< Mat > & masks = std::vector< Mat >(),
bool compactResult = false )

Python:

cv.line_descriptor.BinaryDescriptorMatcher.knnMatch(queryDescriptors, trainDescriptors, k[, mask[, compactResult]]) -> matches
cv.line_descriptor.BinaryDescriptorMatcher.knnMatchQuery(queryDescriptors, matches, k[, masks[, compactResult]])

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Parameters

  • queryDescriptors — query descriptors

  • matches — vector to host retrieved matches

  • k — number of the closest descriptors to be returned for every input query

  • masks — vector of masks to select which input descriptors must be matched to ones in dataset (the i-th mask in vector indicates whether each input query can be matched with descriptors in dataset relative to i-th image)

  • 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)

match()#

void cv::line_descriptor::BinaryDescriptorMatcher::match(
const Mat & queryDescriptors,
const Mat & trainDescriptors,
std::vector< DMatch > & matches,
const Mat & mask = Mat() )

Python:

cv.line_descriptor.BinaryDescriptorMatcher.match(queryDescriptors, trainDescriptors[, mask]) -> matches
cv.line_descriptor.BinaryDescriptorMatcher.matchQuery(queryDescriptors[, masks]) -> matches

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

match()#

void cv::line_descriptor::BinaryDescriptorMatcher::match(
const Mat & queryDescriptors,
std::vector< DMatch > & matches,
const std::vector< Mat > & masks = std::vector< Mat >() )

Python:

cv.line_descriptor.BinaryDescriptorMatcher.match(queryDescriptors, trainDescriptors[, mask]) -> matches
cv.line_descriptor.BinaryDescriptorMatcher.matchQuery(queryDescriptors[, masks]) -> matches

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Parameters

  • queryDescriptors — query descriptors

  • matches — vector to host retrieved matches

  • masks — vector of masks to select which input descriptors must be matched to one in dataset (the i-th mask in vector indicates whether each input query can be matched with descriptors in dataset relative to i-th image)

radiusMatch()#

void cv::line_descriptor::BinaryDescriptorMatcher::radiusMatch(
const Mat & queryDescriptors,
const Mat & trainDescriptors,
std::vector< std::vector< DMatch > > & matches,
float maxDistance,
const Mat & mask = Mat(),
bool compactResult = 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)

radiusMatch()#

void cv::line_descriptor::BinaryDescriptorMatcher::radiusMatch(
const Mat & queryDescriptors,
std::vector< std::vector< DMatch > > & matches,
float maxDistance,
const std::vector< Mat > & masks = std::vector< Mat >(),
bool compactResult = false )

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Parameters

  • queryDescriptors — query descriptors

  • matches — vector to host retrieved matches

  • maxDistance — search radius

  • masks — vector of masks to select which input descriptors must be matched to ones in dataset (the i-th mask in vector indicates whether each input query can be matched with descriptors in dataset relative to i-th image)

  • 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)

train()#

void cv::line_descriptor::BinaryDescriptorMatcher::train()

Update dataset by inserting into it all descriptors that were stored locally by add function.

Note

Every time this function is invoked, current dataset is deleted and locally stored descriptors are inserted into dataset. The locally stored copy of just inserted descriptors is then removed.

createBinaryDescriptorMatcher()#

static Ptr< BinaryDescriptorMatcher > cv::line_descriptor::BinaryDescriptorMatcher::createBinaryDescriptorMatcher()

Create a BinaryDescriptorMatcher object and return a smart pointer to it.

checkKDistances()#

void cv::line_descriptor::BinaryDescriptorMatcher::checkKDistances(
UINT32 * numres,
int k,
std::vector< int > & k_distances,
int row,
int string_length )

retrieve Hamming distances

Member Data Documentation#

dataset#

Ptr< Mihasher > cv::line_descriptor::BinaryDescriptorMatcher::dataset

internal MiHaser representing dataset

descrInDS#

int cv::line_descriptor::BinaryDescriptorMatcher::descrInDS

number of descriptors in dataset

descriptorsMat#

Mat cv::line_descriptor::BinaryDescriptorMatcher::descriptorsMat

matrix to store new descriptors

indexesMap#

std::map< int, int > cv::line_descriptor::BinaryDescriptorMatcher::indexesMap

map storing where each bunch of descriptors benins in DS

nextAddedIndex#

int cv::line_descriptor::BinaryDescriptorMatcher::nextAddedIndex

index from which next added descriptors’ bunch must begin

numImages#

int cv::line_descriptor::BinaryDescriptorMatcher::numImages

number of images whose descriptors are stored in DS

Source file#

The documentation for this class was generated from the following file: