Fixed missing visual words when parameter Mem/InitWMWithAllNodes is set

git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@1828 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
matlabbe
2014-10-02 20:35:45 +00:00
parent 0a807e8cde
commit 61603cdf0f

View File

@@ -222,7 +222,36 @@ bool Memory::init(const std::string & dbUrl, bool dbOverwritten, const Parameter
if(_dbDriver && _dbDriver->isConnected()) if(_dbDriver && _dbDriver->isConnected())
{ {
if(postInitEvents) UEventsManager::post(new RtabmapEventInit("Loading dictionary...")); if(postInitEvents) UEventsManager::post(new RtabmapEventInit("Loading dictionary..."));
_dbDriver->load(_vwd); if(loadAllNodesInWM)
{
// load all referenced words in working memory
std::set<int> wordIds;
const std::map<int, Signature *> & signatures = this->getSignatures();
for(std::map<int, Signature *>::const_iterator i=signatures.begin(); i!=signatures.end(); ++i)
{
const std::multimap<int, cv::KeyPoint> & words = i->second->getWords();
std::list<int> keys = uUniqueKeys(words);
wordIds.insert(keys.begin(), keys.end());
}
if(wordIds.size())
{
std::list<VisualWord*> words;
_dbDriver->loadWords(wordIds, words);
for(std::list<VisualWord*>::iterator iter = words.begin(); iter!=words.end(); ++iter)
{
_vwd->addWord(*iter);
}
// Get Last word id
int id = 0;
_dbDriver->getLastWordId(id);
_vwd->setLastWordId(id);
}
}
else
{
// load the last dictionary
_dbDriver->load(_vwd);
}
UDEBUG("%d words loaded!", _vwd->getUnusedWordsSize()); UDEBUG("%d words loaded!", _vwd->getUnusedWordsSize());
_vwd->update(); _vwd->update();
if(postInitEvents) UEventsManager::post(new RtabmapEventInit(uFormat("Loading dictionary, done! (%d words)", (int)_vwd->getUnusedWordsSize()))); if(postInitEvents) UEventsManager::post(new RtabmapEventInit(uFormat("Loading dictionary, done! (%d words)", (int)_vwd->getUnusedWordsSize())));
@@ -230,26 +259,23 @@ bool Memory::init(const std::string & dbUrl, bool dbOverwritten, const Parameter
if(postInitEvents) UEventsManager::post(new RtabmapEventInit(std::string("Adding word references..."))); if(postInitEvents) UEventsManager::post(new RtabmapEventInit(std::string("Adding word references...")));
// Enable loaded signatures // Enable loaded signatures
Signature * ss;
const std::map<int, Signature *> & signatures = this->getSignatures(); const std::map<int, Signature *> & signatures = this->getSignatures();
for(std::map<int, Signature *>::const_iterator i=signatures.begin(); i!=signatures.end(); ++i) for(std::map<int, Signature *>::const_iterator i=signatures.begin(); i!=signatures.end(); ++i)
{ {
ss = this->_getSignature(i->first); Signature * s = this->_getSignature(i->first);
if(ss) UASSERT(s != 0);
const std::multimap<int, cv::KeyPoint> & words = s->getWords();
if(words.size())
{ {
const std::multimap<int, cv::KeyPoint> & words = ss->getWords(); UDEBUG("node=%d, word references=%d", s->id(), words.size());
if(words.size()) for(std::multimap<int, cv::KeyPoint>::const_iterator iter = words.begin(); iter!=words.end(); ++iter)
{ {
UDEBUG("node=%d, word references=%d", ss->id(), words.size()); _vwd->addWordRef(iter->first, i->first);
for(std::multimap<int, cv::KeyPoint>::const_iterator iter = words.begin(); iter!=words.end(); ++iter)
{
_vwd->addWordRef(iter->first, i->first);
}
ss->setEnabled(true);
} }
s->setEnabled(true);
} }
} }
if(postInitEvents) UEventsManager::post(new RtabmapEventInit(uFormat("Adding word references, done! (%d)", _vwd->getTotalActiveReferences()))); if(postInitEvents) UEventsManager::post(new RtabmapEventInit(uFormat("Adding word references, done! (%d)", _vwd->getTotalActiveReferences())));
if(_vwd->getUnusedWordsSize()) if(_vwd->getUnusedWordsSize())