mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-08 04:20:20 +08:00
Fixed crash when adding new words to incremental FLANN (after some were removed from the dictionnary and deleted when transferring to database)
This commit is contained in:
@@ -85,6 +85,8 @@ public:
|
||||
}
|
||||
nextIndex_ = 0;
|
||||
isLSH_ = false;
|
||||
addedDescriptors_.clear();
|
||||
removedIndexes_.clear();
|
||||
}
|
||||
|
||||
unsigned int indexedFeatures() const
|
||||
@@ -142,6 +144,14 @@ public:
|
||||
index_ = new rtflann::Index<rtflann::L2<float> >(dataset, params);
|
||||
((rtflann::Index<rtflann::L2<float> >*)index_)->buildIndex();
|
||||
}
|
||||
|
||||
if(features.rows == 1)
|
||||
{
|
||||
// incremental FLANN
|
||||
addedDescriptors_.insert(std::make_pair(nextIndex_, features));
|
||||
}
|
||||
// else assume that the features are kept in memory outside this class (e.g., dataTree_)
|
||||
|
||||
nextIndex_ = features.rows;
|
||||
}
|
||||
|
||||
@@ -165,14 +175,41 @@ public:
|
||||
UASSERT(feature.rows == 1);
|
||||
if(featuresType_ == CV_8UC1)
|
||||
{
|
||||
rtflann::Matrix<unsigned char> dataset(feature.data, feature.rows, feature.cols);
|
||||
((rtflann::Index<rtflann::Hamming<unsigned char> >*)index_)->addPoints(dataset);
|
||||
rtflann::Matrix<unsigned char> point(feature.data, feature.rows, feature.cols);
|
||||
rtflann::Index<rtflann::Hamming<unsigned char> > * index = (rtflann::Index<rtflann::Hamming<unsigned char> >*)index_;
|
||||
index->addPoints(point, 0);
|
||||
// Rebuild index if it doubles in size
|
||||
if(index->sizeAtBuild() * 2 < index->size()+index->removedCount())
|
||||
{
|
||||
// clean not used features
|
||||
for(std::list<int>::iterator iter=removedIndexes_.begin(); iter!=removedIndexes_.end(); ++iter)
|
||||
{
|
||||
addedDescriptors_.erase(*iter);
|
||||
}
|
||||
removedIndexes_.clear();
|
||||
index->buildIndex();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rtflann::Matrix<float> dataset((float*)feature.data, feature.rows, feature.cols);
|
||||
((rtflann::Index<rtflann::L2<float> >*)index_)->addPoints(dataset);
|
||||
rtflann::Matrix<float> point((float*)feature.data, feature.rows, feature.cols);
|
||||
rtflann::Index<rtflann::L2<float> > * index = (rtflann::Index<rtflann::L2<float> >*)index_;
|
||||
index->addPoints(point, 0);
|
||||
// Rebuild index if it doubles in size
|
||||
if(index->sizeAtBuild() * 2 < index->size()+index->removedCount())
|
||||
{
|
||||
// clean not used features
|
||||
for(std::list<int>::iterator iter=removedIndexes_.begin(); iter!=removedIndexes_.end(); ++iter)
|
||||
{
|
||||
addedDescriptors_.erase(*iter);
|
||||
}
|
||||
removedIndexes_.clear();
|
||||
index->buildIndex();
|
||||
}
|
||||
}
|
||||
|
||||
addedDescriptors_.insert(std::make_pair(nextIndex_, feature));
|
||||
|
||||
return nextIndex_++;
|
||||
}
|
||||
|
||||
@@ -197,6 +234,7 @@ public:
|
||||
{
|
||||
((rtflann::Index<rtflann::L2<float> >*)index_)->removePoint(index);
|
||||
}
|
||||
removedIndexes_.push_back(index);
|
||||
}
|
||||
|
||||
void knnSearch(
|
||||
@@ -236,6 +274,11 @@ private:
|
||||
int featuresType_;
|
||||
int featuresDim_;
|
||||
bool isLSH_;
|
||||
|
||||
// keep feature in memory until the tree is rebuilt
|
||||
// (in case the word is deleted when removed from the VWDictionary)
|
||||
std::map<int, cv::Mat> addedDescriptors_;
|
||||
std::list<int> removedIndexes_;
|
||||
};
|
||||
|
||||
const int VWDictionary::ID_START = 1;
|
||||
|
||||
@@ -203,6 +203,16 @@ public:
|
||||
return size_ - removed_count_;
|
||||
}
|
||||
|
||||
inline size_t removedCount() const
|
||||
{
|
||||
return removed_count_;
|
||||
}
|
||||
|
||||
inline size_t sizeAtBuild() const
|
||||
{
|
||||
return size_at_build_;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The dimensionality of the features in this index.
|
||||
*/
|
||||
|
||||
@@ -200,6 +200,16 @@ public:
|
||||
return nnIndex_->size();
|
||||
}
|
||||
|
||||
size_t removedCount() const
|
||||
{
|
||||
return nnIndex_->removedCount();
|
||||
}
|
||||
|
||||
size_t sizeAtBuild() const
|
||||
{
|
||||
return nnIndex_->sizeAtBuild();
|
||||
}
|
||||
|
||||
/**
|
||||
* \returns The index type (kdtree, kmeans,...)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user