Files
rtabmap/api/latest/classrtabmap_1_1FlannIndex.html
T

692 lines
41 KiB
HTML

<!-- HTML header for doxygen 1.9.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>RTAB-Map: rtabmap::FlannIndex Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="custom.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript">window.RTABMAP_DOC_ROOT="";</script>
<script type="text/javascript" src="../versions.js"></script>
<script type="text/javascript" src="version-switcher.js"></script>
<script type="text/javascript" src="doxygen-awesome-darkmode-toggle.js"></script>
<script type="text/javascript">DoxygenAwesomeDarkModeToggle.init();</script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">RTAB-Map<span id="projectnumber">&#160;0.23.11</span>
</div>
<div id="projectbrief">Real-Time Appearance-Based Mapping</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('classrtabmap_1_1FlannIndex.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#pub-types">Public Types</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classrtabmap_1_1FlannIndex-members.html">List of all members</a> </div>
<div class="headertitle"><div class="title">rtabmap::FlannIndex Class Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Nearest neighbor index over a set of features.
<a href="classrtabmap_1_1FlannIndex.html#details">More...</a></p>
<p><code>#include &lt;<a class="el" href="FlannIndex_8h_source.html">FlannIndex.h</a>&gt;</code></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-types" name="pub-types"></a>
Public Types</h2></td></tr>
<tr class="memitem:a88ddfe63de9e9f574ac804ade460f010" id="r_a88ddfe63de9e9f574ac804ade460f010"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">flann_algorithm_t</a> { <br />
&#160;&#160;<a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010ad91d542360e077f1f119dca41dcef818">FLANN_INDEX_LINEAR</a> = 0
, <a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010a4e3f4b810ce249000373d41046ab273d">FLANN_INDEX_KDTREE</a> = 1
, <a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010a519b6d4008708066a792ac2929607081">FLANN_INDEX_KDTREE_SINGLE</a> = 4
, <a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010a9f4f22cd092844bde159ebc0b004a5c8">FLANN_INDEX_LSH</a> = 6
, <br />
&#160;&#160;<a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010a4132d1ad7d7b3717b83f71aa60fa39e3">NANOFLANN_INDEX_KDTREE_SINGLE</a> = 100
<br />
}</td></tr>
<tr class="memdesc:a88ddfe63de9e9f574ac804ade460f010"><td class="mdescLeft">&#160;</td><td class="mdescRight">The index structure built by <a class="el" href="classrtabmap_1_1FlannIndex.html#aad2f29314c6b021d1c53217a7a041521" title="Build the index over the given features, releasing any previous one.">buildIndex()</a> <a href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">More...</a><br /></td></tr>
<tr class="separator:a88ddfe63de9e9f574ac804ade460f010"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a6eb4692afb561932aa6a20f7ebdee6c4" id="r_a6eb4692afb561932aa6a20f7ebdee6c4"><td class="memItemLeft" align="right" valign="top"><a id="a6eb4692afb561932aa6a20f7ebdee6c4" name="a6eb4692afb561932aa6a20f7ebdee6c4"></a>
void&#160;</td><td class="memItemRight" valign="bottom"><b>release</b> ()</td></tr>
<tr class="memdesc:a6eb4692afb561932aa6a20f7ebdee6c4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Drop the index and everything it holds, back to the state of a new one. <br /></td></tr>
<tr class="separator:a6eb4692afb561932aa6a20f7ebdee6c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1f2bf8718a75aa0b5dded8c287293c23" id="r_a1f2bf8718a75aa0b5dded8c287293c23"><td class="memItemLeft" align="right" valign="top">std::vector&lt; unsigned char &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a1f2bf8718a75aa0b5dded8c287293c23">serializeIndex</a> (bool computeChecksum=true) const</td></tr>
<tr class="memdesc:a1f2bf8718a75aa0b5dded8c287293c23"><td class="mdescLeft">&#160;</td><td class="mdescRight">Serialize the index, to be given back to <a class="el" href="classrtabmap_1_1FlannIndex.html#a826b3a33e22f455f04688df9d0d25b0b" title="Load an index serialized by serializeIndex(), releasing any previous one.">loadIndex()</a> <br /></td></tr>
<tr class="separator:a1f2bf8718a75aa0b5dded8c287293c23"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a759817fbddaf8c6bdb04ba0a44e9847a" id="r_a759817fbddaf8c6bdb04ba0a44e9847a"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a759817fbddaf8c6bdb04ba0a44e9847a">indexedFeatures</a> () const</td></tr>
<tr class="separator:a759817fbddaf8c6bdb04ba0a44e9847a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5a2eed18fe1216142d09c05243e9d06f" id="r_a5a2eed18fe1216142d09c05243e9d06f"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a5a2eed18fe1216142d09c05243e9d06f">memoryUsed</a> () const</td></tr>
<tr class="separator:a5a2eed18fe1216142d09c05243e9d06f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aad2f29314c6b021d1c53217a7a041521" id="r_aad2f29314c6b021d1c53217a7a041521"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#aad2f29314c6b021d1c53217a7a041521">buildIndex</a> (<a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">flann_algorithm_t</a> algorithm, const cv::Mat &amp;features, bool useDistanceL1=false, float rebalancingFactor=2.0f)</td></tr>
<tr class="memdesc:aad2f29314c6b021d1c53217a7a041521"><td class="mdescLeft">&#160;</td><td class="mdescRight">Build the index over the given features, releasing any previous one. <br /></td></tr>
<tr class="separator:aad2f29314c6b021d1c53217a7a041521"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a826b3a33e22f455f04688df9d0d25b0b" id="r_a826b3a33e22f455f04688df9d0d25b0b"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a826b3a33e22f455f04688df9d0d25b0b">loadIndex</a> (const std::vector&lt; unsigned char &gt; &amp;indexData, <a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">flann_algorithm_t</a> algorithm, const cv::Mat &amp;features, bool useDistanceL1=false, float rebalancingFactor=2.0f, std::string *errorMsg=NULL)</td></tr>
<tr class="memdesc:a826b3a33e22f455f04688df9d0d25b0b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Load an index serialized by <a class="el" href="classrtabmap_1_1FlannIndex.html#a1f2bf8718a75aa0b5dded8c287293c23" title="Serialize the index, to be given back to loadIndex()">serializeIndex()</a>, releasing any previous one. <br /></td></tr>
<tr class="separator:a826b3a33e22f455f04688df9d0d25b0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a028eac4aeef64d62b9edea1f7b38a71e" id="r_a028eac4aeef64d62b9edea1f7b38a71e"><td class="memItemLeft" align="right" valign="top"><a id="a028eac4aeef64d62b9edea1f7b38a71e" name="a028eac4aeef64d62b9edea1f7b38a71e"></a>
bool&#160;</td><td class="memItemRight" valign="bottom"><b>loadIndex</b> (const unsigned char *indexData, size_t indexDataSize, <a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">flann_algorithm_t</a> algorithm, const cv::Mat &amp;features, bool useDistanceL1=false, float rebalancingFactor=2.0f, std::string *errorMsg=NULL)</td></tr>
<tr class="memdesc:a028eac4aeef64d62b9edea1f7b38a71e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Load an index from a raw buffer, see the overload above. <br /></td></tr>
<tr class="separator:a028eac4aeef64d62b9edea1f7b38a71e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4a5c33446a515bd8f0c2f73a1adaeb23" id="r_a4a5c33446a515bd8f0c2f73a1adaeb23"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a4a5c33446a515bd8f0c2f73a1adaeb23">isBuilt</a> ()</td></tr>
<tr class="separator:a4a5c33446a515bd8f0c2f73a1adaeb23"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ace329768df8b54b935fbe7a8921efe69" id="r_ace329768df8b54b935fbe7a8921efe69"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#ace329768df8b54b935fbe7a8921efe69">featuresType</a> () const</td></tr>
<tr class="separator:ace329768df8b54b935fbe7a8921efe69"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8191e3ba9cc7a5361443430171691df3" id="r_a8191e3ba9cc7a5361443430171691df3"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a8191e3ba9cc7a5361443430171691df3">featuresDim</a> () const</td></tr>
<tr class="separator:a8191e3ba9cc7a5361443430171691df3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8bd8312e92376d6bf2885907f5d93c68" id="r_a8bd8312e92376d6bf2885907f5d93c68"><td class="memItemLeft" align="right" valign="top">std::vector&lt; unsigned int &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a8bd8312e92376d6bf2885907f5d93c68">addPoints</a> (const cv::Mat &amp;features)</td></tr>
<tr class="memdesc:a8bd8312e92376d6bf2885907f5d93c68"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add features to the index. <br /></td></tr>
<tr class="separator:a8bd8312e92376d6bf2885907f5d93c68"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7d78d049ac4afb9f90fc0705506a6ce0" id="r_a7d78d049ac4afb9f90fc0705506a6ce0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a7d78d049ac4afb9f90fc0705506a6ce0">removePoint</a> (unsigned int index)</td></tr>
<tr class="memdesc:a7d78d049ac4afb9f90fc0705506a6ce0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Remove an indexed feature, by the index <a class="el" href="classrtabmap_1_1FlannIndex.html#a8bd8312e92376d6bf2885907f5d93c68" title="Add features to the index.">addPoints()</a> gave for it. <br /></td></tr>
<tr class="separator:a7d78d049ac4afb9f90fc0705506a6ce0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aee58e859aa067646b4c6ffd63b593928" id="r_aee58e859aa067646b4c6ffd63b593928"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#aee58e859aa067646b4c6ffd63b593928">knnSearch</a> (const cv::Mat &amp;query, cv::Mat &amp;indices, cv::Mat &amp;dists, int knn, int checks=32, float eps=0.0, bool sorted=true, int cores=1) const</td></tr>
<tr class="memdesc:aee58e859aa067646b4c6ffd63b593928"><td class="mdescLeft">&#160;</td><td class="mdescRight">Search the k nearest neighbors of each query. <br /></td></tr>
<tr class="separator:aee58e859aa067646b4c6ffd63b593928"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a28052e827934cfbc6a9ce14f8b5714df" id="r_a28052e827934cfbc6a9ce14f8b5714df"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classrtabmap_1_1FlannIndex.html#a28052e827934cfbc6a9ce14f8b5714df">radiusSearch</a> (const cv::Mat &amp;query, std::vector&lt; std::vector&lt; size_t &gt; &gt; &amp;indices, std::vector&lt; std::vector&lt; float &gt; &gt; &amp;dists, float radius, int maxNeighbors=0, int checks=32, float eps=0.0, bool sorted=true, int cores=1) const</td></tr>
<tr class="memdesc:a28052e827934cfbc6a9ce14f8b5714df"><td class="mdescLeft">&#160;</td><td class="mdescRight">Search the neighbors of each query within a radius. <br /></td></tr>
<tr class="separator:a28052e827934cfbc6a9ce14f8b5714df"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Nearest neighbor index over a set of features. </p>
<p>Wraps the search structures of the vendored rtflann and nanoflann libraries behind one interface, the structure being chosen with flann_algorithm_t at build time. Used for the visual word dictionary (<a class="el" href="classrtabmap_1_1VWDictionary.html" title="Manages a dictionary of visual words for visual place recognition and loop closure detection.">VWDictionary</a>) and for the 2D point searches of visual registration (<a class="el" href="classrtabmap_1_1RegistrationVis.html" title="Visual registration between two signatures using features and geometry.">RegistrationVis</a>).</p>
<p>The features are not copied: the index refers to the matrices it is given and keeps them alive, cv::Mat data being reference counted, so they must not be modified in place while it is in use. Every point it holds is designated by an index, assigned in the order the points were added and stable for the lifetime of the index: <a class="el" href="classrtabmap_1_1FlannIndex.html#a7d78d049ac4afb9f90fc0705506a6ce0" title="Remove an indexed feature, by the index addPoints() gave for it.">removePoint()</a> leaves a hole rather than renumbering the points after it. </p>
<p class="definition">Definition at line <a class="el" href="FlannIndex_8h_source.html#l00055">55</a> of file <a class="el" href="FlannIndex_8h_source.html">FlannIndex.h</a>.</p>
</div><h2 class="groupheader">Member Enumeration Documentation</h2>
<a id="a88ddfe63de9e9f574ac804ade460f010" name="a88ddfe63de9e9f574ac804ade460f010"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a88ddfe63de9e9f574ac804ade460f010">&#9670;&#160;</a></span>flann_algorithm_t</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">rtabmap::FlannIndex::flann_algorithm_t</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>The index structure built by <a class="el" href="classrtabmap_1_1FlannIndex.html#aad2f29314c6b021d1c53217a7a041521" title="Build the index over the given features, releasing any previous one.">buildIndex()</a> </p>
<p>The values under 8 are forwarded from rtflann's own enum and have to match it (see src/rtflann/defines.h); the nanoflann ones are rtabmap-specific and kept outside its range (0-7, 254, 255). A value is written in the serialized index header and checked back on load, so none of them may be renumbered.</p>
<p>The nanoflann structures take float features only (nanoflann has no Hamming metric) and search exactly, ignoring "checks". That makes them the fastest ones for 2D and 3D points, and the wrong ones for descriptors: an exact search visits more and more of the tree as the dimension grows, down to being as slow as an exhaustive search. Prefer the approximate rtflann kd-trees for those. </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a88ddfe63de9e9f574ac804ade460f010ad91d542360e077f1f119dca41dcef818" name="a88ddfe63de9e9f574ac804ade460f010ad91d542360e077f1f119dca41dcef818"></a>FLANN_INDEX_LINEAR&#160;</td><td class="fielddoc"><p>Exhaustive search. </p>
</td></tr>
<tr><td class="fieldname"><a id="a88ddfe63de9e9f574ac804ade460f010a4e3f4b810ce249000373d41046ab273d" name="a88ddfe63de9e9f574ac804ade460f010a4e3f4b810ce249000373d41046ab273d"></a>FLANN_INDEX_KDTREE&#160;</td><td class="fielddoc"><p>4 randomized kd-trees, searched approximately </p>
</td></tr>
<tr><td class="fieldname"><a id="a88ddfe63de9e9f574ac804ade460f010a519b6d4008708066a792ac2929607081" name="a88ddfe63de9e9f574ac804ade460f010a519b6d4008708066a792ac2929607081"></a>FLANN_INDEX_KDTREE_SINGLE&#160;</td><td class="fielddoc"><p>Single kd-tree, searched exactly. </p>
</td></tr>
<tr><td class="fieldname"><a id="a88ddfe63de9e9f574ac804ade460f010a9f4f22cd092844bde159ebc0b004a5c8" name="a88ddfe63de9e9f574ac804ade460f010a9f4f22cd092844bde159ebc0b004a5c8"></a>FLANN_INDEX_LSH&#160;</td><td class="fielddoc"><p>Locality-Sensitive Hashing (binary descriptors) </p>
</td></tr>
<tr><td class="fieldname"><a id="a88ddfe63de9e9f574ac804ade460f010a4132d1ad7d7b3717b83f71aa60fa39e3" name="a88ddfe63de9e9f574ac804ade460f010a4132d1ad7d7b3717b83f71aa60fa39e3"></a>NANOFLANN_INDEX_KDTREE_SINGLE&#160;</td><td class="fielddoc"><p>nanoflann kd-tree. With a rebalancing factor of 1 it is built once, which is the cheapest to build and to search; over 1 it is the weight-balanced tree accepting <a class="el" href="classrtabmap_1_1FlannIndex.html#a8bd8312e92376d6bf2885907f5d93c68" title="Add features to the index.">addPoints()</a>/removePoint(), which cannot be serialized while some of its points are removed. </p>
</td></tr>
</table>
<p class="definition">Definition at line <a class="el" href="FlannIndex_8h_source.html#l00075">75</a> of file <a class="el" href="FlannIndex_8h_source.html">FlannIndex.h</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="a1f2bf8718a75aa0b5dded8c287293c23" name="a1f2bf8718a75aa0b5dded8c287293c23"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1f2bf8718a75aa0b5dded8c287293c23">&#9670;&#160;</a></span>serializeIndex()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt; unsigned char &gt; rtabmap::FlannIndex::serializeIndex </td>
<td>(</td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>computeChecksum</em> = <code>true</code></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p>Serialize the index, to be given back to <a class="el" href="classrtabmap_1_1FlannIndex.html#a826b3a33e22f455f04688df9d0d25b0b" title="Load an index serialized by serializeIndex(), releasing any previous one.">loadIndex()</a> </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">computeChecksum</td><td>Add a checksum of the indexed features to the data, which <a class="el" href="classrtabmap_1_1FlannIndex.html#a826b3a33e22f455f04688df9d0d25b0b" title="Load an index serialized by serializeIndex(), releasing any previous one.">loadIndex()</a> compares against the features it is given </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>The serialized index, empty when there is nothing to serialize or when the structure in use cannot be</dd></dl>
<p>The format depends on the architecture and on the versions of the vendored libraries: <a class="el" href="classrtabmap_1_1FlannIndex.html#a826b3a33e22f455f04688df9d0d25b0b" title="Load an index serialized by serializeIndex(), releasing any previous one.">loadIndex()</a> refuses an index it cannot read, leaving it to be rebuilt. </p>
</div>
</div>
<a id="a759817fbddaf8c6bdb04ba0a44e9847a" name="a759817fbddaf8c6bdb04ba0a44e9847a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a759817fbddaf8c6bdb04ba0a44e9847a">&#9670;&#160;</a></span>indexedFeatures()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t rtabmap::FlannIndex::indexedFeatures </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>Number of indexed features, the removed ones excluded. </dd></dl>
</div>
</div>
<a id="a5a2eed18fe1216142d09c05243e9d06f" name="a5a2eed18fe1216142d09c05243e9d06f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5a2eed18fe1216142d09c05243e9d06f">&#9670;&#160;</a></span>memoryUsed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t rtabmap::FlannIndex::memoryUsed </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>Bytes used by the index, the features themselves excluded as they are only referred to. </dd></dl>
</div>
</div>
<a id="aad2f29314c6b021d1c53217a7a041521" name="aad2f29314c6b021d1c53217a7a041521"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aad2f29314c6b021d1c53217a7a041521">&#9670;&#160;</a></span>buildIndex()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rtabmap::FlannIndex::buildIndex </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">flann_algorithm_t</a>&#160;</td>
<td class="paramname"><em>algorithm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const cv::Mat &amp;&#160;</td>
<td class="paramname"><em>features</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>useDistanceL1</em> = <code>false</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>rebalancingFactor</em> = <code>2.0f</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Build the index over the given features, releasing any previous one. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">algorithm</td><td>The structure to build </td></tr>
<tr><td class="paramname">features</td><td>One feature per row, CV_32FC1 or, for the rtflann structures only, CV_8UC1 for binary descriptors (Hamming distance) </td></tr>
<tr><td class="paramname">useDistanceL1</td><td>Search with the L1 distance instead of L2, ignored by LSH and by the binary descriptors </td></tr>
<tr><td class="paramname">rebalancingFactor</td><td>Fraction (factor-1)/factor of the index that can be left removed before it is rebuilt, e.g. half of it for 2. Set to 1 to never rebuild it. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="a826b3a33e22f455f04688df9d0d25b0b" name="a826b3a33e22f455f04688df9d0d25b0b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a826b3a33e22f455f04688df9d0d25b0b">&#9670;&#160;</a></span>loadIndex()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool rtabmap::FlannIndex::loadIndex </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; unsigned char &gt; &amp;&#160;</td>
<td class="paramname"><em>indexData</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classrtabmap_1_1FlannIndex.html#a88ddfe63de9e9f574ac804ade460f010">flann_algorithm_t</a>&#160;</td>
<td class="paramname"><em>algorithm</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const cv::Mat &amp;&#160;</td>
<td class="paramname"><em>features</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>useDistanceL1</em> = <code>false</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>rebalancingFactor</em> = <code>2.0f</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::string *&#160;</td>
<td class="paramname"><em>errorMsg</em> = <code>NULL</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Load an index serialized by <a class="el" href="classrtabmap_1_1FlannIndex.html#a1f2bf8718a75aa0b5dded8c287293c23" title="Serialize the index, to be given back to loadIndex()">serializeIndex()</a>, releasing any previous one. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">indexData</td><td>The serialized index </td></tr>
<tr><td class="paramname">algorithm</td><td>The structure it was built with </td></tr>
<tr><td class="paramname">features</td><td>The very same features it was built with, in the same order: the index refers to them by their row </td></tr>
<tr><td class="paramname">useDistanceL1</td><td>The distance it was built with </td></tr>
<tr><td class="paramname">rebalancingFactor</td><td>See <a class="el" href="classrtabmap_1_1FlannIndex.html#aad2f29314c6b021d1c53217a7a041521" title="Build the index over the given features, releasing any previous one.">buildIndex()</a>. The serialized data carries the one the index was built with, which is deprecated and ignored: this one is used instead. </td></tr>
<tr><td class="paramname">errorMsg</td><td>Filled with what didn't match when the index is refused </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>False if the data doesn't correspond to the given features and parameters, in which case the index is left released </dd></dl>
</div>
</div>
<a id="a4a5c33446a515bd8f0c2f73a1adaeb23" name="a4a5c33446a515bd8f0c2f73a1adaeb23"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4a5c33446a515bd8f0c2f73a1adaeb23">&#9670;&#160;</a></span>isBuilt()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool rtabmap::FlannIndex::isBuilt </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>Whether an index has been built or loaded. </dd></dl>
</div>
</div>
<a id="ace329768df8b54b935fbe7a8921efe69" name="ace329768df8b54b935fbe7a8921efe69"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ace329768df8b54b935fbe7a8921efe69">&#9670;&#160;</a></span>featuresType()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int rtabmap::FlannIndex::featuresType </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>Type of the indexed features (CV_32FC1 or CV_8UC1). </dd></dl>
<p class="definition">Definition at line <a class="el" href="FlannIndex_8h_source.html#l00169">169</a> of file <a class="el" href="FlannIndex_8h_source.html">FlannIndex.h</a>.</p>
</div>
</div>
<a id="a8191e3ba9cc7a5361443430171691df3" name="a8191e3ba9cc7a5361443430171691df3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8191e3ba9cc7a5361443430171691df3">&#9670;&#160;</a></span>featuresDim()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">int rtabmap::FlannIndex::featuresDim </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>Dimension of the indexed features. </dd></dl>
<p class="definition">Definition at line <a class="el" href="FlannIndex_8h_source.html#l00171">171</a> of file <a class="el" href="FlannIndex_8h_source.html">FlannIndex.h</a>.</p>
</div>
</div>
<a id="a8bd8312e92376d6bf2885907f5d93c68" name="a8bd8312e92376d6bf2885907f5d93c68"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8bd8312e92376d6bf2885907f5d93c68">&#9670;&#160;</a></span>addPoints()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt; unsigned int &gt; rtabmap::FlannIndex::addPoints </td>
<td>(</td>
<td class="paramtype">const cv::Mat &amp;&#160;</td>
<td class="paramname"><em>features</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Add features to the index. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">features</td><td>One feature per row, of the type and dimension the index was built with </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>The index assigned to each of them, empty when the structure doesn't accept points after it is built </dd></dl>
</div>
</div>
<a id="a7d78d049ac4afb9f90fc0705506a6ce0" name="a7d78d049ac4afb9f90fc0705506a6ce0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7d78d049ac4afb9f90fc0705506a6ce0">&#9670;&#160;</a></span>removePoint()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rtabmap::FlannIndex::removePoint </td>
<td>(</td>
<td class="paramtype">unsigned int&#160;</td>
<td class="paramname"><em>index</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Remove an indexed feature, by the index <a class="el" href="classrtabmap_1_1FlannIndex.html#a8bd8312e92376d6bf2885907f5d93c68" title="Add features to the index.">addPoints()</a> gave for it. </p>
<p>The feature is only marked as removed: it is skipped by the searches, but keeps taking memory until the index is rebuilt (see the rebalancing factor of <a class="el" href="classrtabmap_1_1FlannIndex.html#aad2f29314c6b021d1c53217a7a041521" title="Build the index over the given features, releasing any previous one.">buildIndex()</a>). Not supported by every structure. </p>
</div>
</div>
<a id="aee58e859aa067646b4c6ffd63b593928" name="aee58e859aa067646b4c6ffd63b593928"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aee58e859aa067646b4c6ffd63b593928">&#9670;&#160;</a></span>knnSearch()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rtabmap::FlannIndex::knnSearch </td>
<td>(</td>
<td class="paramtype">const cv::Mat &amp;&#160;</td>
<td class="paramname"><em>query</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">cv::Mat &amp;&#160;</td>
<td class="paramname"><em>indices</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">cv::Mat &amp;&#160;</td>
<td class="paramname"><em>dists</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>knn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>checks</em> = <code>32</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>eps</em> = <code>0.0</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>sorted</em> = <code>true</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>cores</em> = <code>1</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p>Search the k nearest neighbors of each query. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">query</td><td>One feature per row, of the type and dimension the index was built with </td></tr>
<tr><td class="paramname">indices</td><td>Neighbors found, one query per row, CV_32SC1. The neighbors that couldn't be found are set to -1. </td></tr>
<tr><td class="paramname">dists</td><td>Their squared distances, CV_32FC1, or CV_32SC1 for the Hamming distances of binary descriptors </td></tr>
<tr><td class="paramname">knn</td><td>Number of neighbors to search for </td></tr>
<tr><td class="paramname">checks</td><td>Number of leaves an approximate search visits, the exact structures ignoring it </td></tr>
<tr><td class="paramname">eps</td><td>Search for eps-approximate neighbors </td></tr>
<tr><td class="paramname">sorted</td><td>Give the neighbors back by increasing distance </td></tr>
<tr><td class="paramname">cores</td><td>Threads for the batch search (0 = all available) </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="a28052e827934cfbc6a9ce14f8b5714df" name="a28052e827934cfbc6a9ce14f8b5714df"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a28052e827934cfbc6a9ce14f8b5714df">&#9670;&#160;</a></span>radiusSearch()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void rtabmap::FlannIndex::radiusSearch </td>
<td>(</td>
<td class="paramtype">const cv::Mat &amp;&#160;</td>
<td class="paramname"><em>query</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::vector&lt; std::vector&lt; size_t &gt; &gt; &amp;&#160;</td>
<td class="paramname"><em>indices</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">std::vector&lt; std::vector&lt; float &gt; &gt; &amp;&#160;</td>
<td class="paramname"><em>dists</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>radius</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>maxNeighbors</em> = <code>0</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>checks</em> = <code>32</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">float&#160;</td>
<td class="paramname"><em>eps</em> = <code>0.0</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>sorted</em> = <code>true</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>cores</em> = <code>1</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td> const</td>
</tr>
</table>
</div><div class="memdoc">
<p>Search the neighbors of each query within a radius. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">query</td><td>One feature per row, of the type and dimension the index was built with </td></tr>
<tr><td class="paramname">indices</td><td>Neighbors found, one vector per query </td></tr>
<tr><td class="paramname">dists</td><td>Their squared distances, one vector per query </td></tr>
<tr><td class="paramname">radius</td><td>Search radius, squared internally: it is a distance, not a squared one </td></tr>
<tr><td class="paramname">maxNeighbors</td><td>Maximum number of neighbors per query, the nearest ones being kept. 0 for all of them. </td></tr>
<tr><td class="paramname">checks</td><td>Number of leaves an approximate search visits, the exact structures ignoring it </td></tr>
<tr><td class="paramname">eps</td><td>Search for eps-approximate neighbors </td></tr>
<tr><td class="paramname">sorted</td><td>Give the neighbors back by increasing distance </td></tr>
<tr><td class="paramname">cores</td><td>Threads for the batch search (0 = all available) </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>corelib/include/rtabmap/core/<a class="el" href="FlannIndex_8h_source.html">FlannIndex.h</a></li>
</ul>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="namespacertabmap.html">rtabmap</a></li><li class="navelem"><a class="el" href="classrtabmap_1_1FlannIndex.html">FlannIndex</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>