Save/Load vocabulary options can read/write in session binary format
This commit is contained in:
parent
9d0c03f661
commit
ade5dd6729
@ -91,7 +91,7 @@ bool FindObject::loadSession(const QString & path)
|
||||
Settings::setParameter(iter.key(), iter.value());
|
||||
}
|
||||
|
||||
// save vocabulary
|
||||
// load vocabulary
|
||||
vocabulary_->load(in);
|
||||
|
||||
// load objects
|
||||
@ -156,7 +156,26 @@ bool FindObject::saveSession(const QString & path)
|
||||
|
||||
bool FindObject::saveVocabulary(const QString & filePath) const
|
||||
{
|
||||
if(!filePath.isEmpty() && QFileInfo(filePath).suffix().compare("bin") == 0)
|
||||
{
|
||||
QFile file(filePath);
|
||||
file.open(QIODevice::WriteOnly);
|
||||
QDataStream out(&file);
|
||||
|
||||
// ignore parameters
|
||||
out << ParametersMap();
|
||||
|
||||
// save vocabulary
|
||||
vocabulary_->save(out, true);
|
||||
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return vocabulary_->save(filePath);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FindObject::loadVocabulary(const QString & filePath)
|
||||
@ -166,6 +185,27 @@ bool FindObject::loadVocabulary(const QString & filePath)
|
||||
UWARN("Doesn't make sense to load a vocabulary if \"General/vocabularyFixed\" and \"General/invertedSearch\" are not enabled! It will "
|
||||
"be cleared at the time the objects are updated.");
|
||||
}
|
||||
|
||||
if(QFile::exists(filePath) && !filePath.isEmpty() && QFileInfo(filePath).suffix().compare("bin") == 0)
|
||||
{
|
||||
//binary format (from session format)
|
||||
QFile file(filePath);
|
||||
file.open(QIODevice::ReadOnly);
|
||||
QDataStream in(&file);
|
||||
|
||||
ParametersMap parameters;
|
||||
// ignore parameters
|
||||
in >> parameters;
|
||||
|
||||
// load vocabulary
|
||||
vocabulary_->load(in, true);
|
||||
file.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//yaml/xml format
|
||||
if(vocabulary_->load(filePath))
|
||||
{
|
||||
if(objects_.size())
|
||||
@ -174,6 +214,7 @@ bool FindObject::loadVocabulary(const QString & filePath)
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -627,7 +627,7 @@ void MainWindow::loadVocabulary()
|
||||
if(Settings::getGeneral_vocabularyFixed() &&
|
||||
Settings::getGeneral_invertedSearch())
|
||||
{
|
||||
QString path = QFileDialog::getOpenFileName(this, tr("Load vocabulary..."), Settings::workingDirectory(), "Data (*.yaml *.xml)");
|
||||
QString path = QFileDialog::getOpenFileName(this, tr("Load vocabulary..."), Settings::workingDirectory(), "Data (*.yaml *.xml *.bin)");
|
||||
if(!path.isEmpty())
|
||||
{
|
||||
if(findObject_->loadVocabulary(path))
|
||||
@ -651,10 +651,12 @@ void MainWindow::saveVocabulary()
|
||||
QMessageBox::warning(this, tr("Saving vocabulary..."), tr("Vocabulary is empty!"));
|
||||
return;
|
||||
}
|
||||
QString path = QFileDialog::getSaveFileName(this, tr("Save vocabulary..."), Settings::workingDirectory(), "Data (*.yaml *.xml)");
|
||||
QString path = QFileDialog::getSaveFileName(this, tr("Save vocabulary..."), Settings::workingDirectory(), "Data (*.yaml *.xml *.bin)");
|
||||
if(!path.isEmpty())
|
||||
{
|
||||
if(QFileInfo(path).suffix().compare("yaml") != 0 && QFileInfo(path).suffix().compare("xml") != 0)
|
||||
if( QFileInfo(path).suffix().compare("yaml") != 0 &&
|
||||
QFileInfo(path).suffix().compare("xml") != 0 &&
|
||||
QFileInfo(path).suffix().compare("bin") != 0)
|
||||
{
|
||||
path.append(".yaml");
|
||||
}
|
||||
|
||||
@ -70,10 +70,18 @@ void Vocabulary::clear()
|
||||
indexedDescriptors_ = cv::Mat();
|
||||
}
|
||||
|
||||
void Vocabulary::save(QDataStream & streamSessionPtr) const
|
||||
void Vocabulary::save(QDataStream & streamSessionPtr, bool saveVocabularyOnly) const
|
||||
{
|
||||
// save index
|
||||
if(saveVocabularyOnly)
|
||||
{
|
||||
QMultiMap<int, int> dummy;
|
||||
streamSessionPtr << dummy;
|
||||
}
|
||||
else
|
||||
{
|
||||
streamSessionPtr << wordToObjects_;
|
||||
}
|
||||
|
||||
// save words
|
||||
qint64 dataSize = indexedDescriptors_.elemSize()*indexedDescriptors_.cols*indexedDescriptors_.rows;
|
||||
@ -84,10 +92,20 @@ void Vocabulary::save(QDataStream & streamSessionPtr) const
|
||||
streamSessionPtr << QByteArray((char*)indexedDescriptors_.data, dataSize);
|
||||
}
|
||||
|
||||
void Vocabulary::load(QDataStream & streamSessionPtr)
|
||||
void Vocabulary::load(QDataStream & streamSessionPtr, bool loadVocabularyOnly)
|
||||
{
|
||||
// load index
|
||||
if(loadVocabularyOnly)
|
||||
{
|
||||
QMultiMap<int, int> dummy;
|
||||
streamSessionPtr >> dummy;
|
||||
// clear index
|
||||
wordToObjects_.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
streamSessionPtr >> wordToObjects_;
|
||||
}
|
||||
|
||||
// load words
|
||||
int rows,cols,type;
|
||||
|
||||
@ -49,8 +49,8 @@ public:
|
||||
const QMultiMap<int, int> & wordToObjects() const {return wordToObjects_;}
|
||||
const cv::Mat & indexedDescriptors() const {return indexedDescriptors_;}
|
||||
|
||||
void save(QDataStream & streamSessionPtr) const;
|
||||
void load(QDataStream & streamSessionPtr);
|
||||
void save(QDataStream & streamSessionPtr, bool saveVocabularyOnly = false) const;
|
||||
void load(QDataStream & streamSessionPtr, bool loadVocabularyOnly = false);
|
||||
bool save(const QString & filename) const;
|
||||
bool load(const QString & filename);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user