From 228020c44e5beb7d66db9f167fe7646a57b0c0bc Mon Sep 17 00:00:00 2001 From: Josh Klontz Date: Tue, 15 Sep 2015 13:09:25 -0400 Subject: [PATCH] Implemented LoadStoreDistance --- openbr/openbr_plugin.cpp | 8 +++++--- openbr/plugins/core/loadstore.cpp | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) diff --git a/openbr/openbr_plugin.cpp b/openbr/openbr_plugin.cpp index 175bc3f..2b9990d 100644 --- a/openbr/openbr_plugin.cpp +++ b/openbr/openbr_plugin.cpp @@ -1686,15 +1686,17 @@ Distance *Distance::make(QString str, QObject *parent) if (Globals->abbreviations.contains(str)) return make(Globals->abbreviations[str], parent); + // Check for use of '<...>' as shorthand for LoadStore(...) + if (str.startsWith('<') && str.endsWith('>')) + return make("LoadStore(" + str.mid(1, str.size()-2) + ")", parent); + { // Check for use of '+' as shorthand for Pipe(...) QStringList words = parse(str, '+'); if (words.size() > 1) return make("Pipe([" + words.join(",") + "])", parent); } - File f = "." + str; - Distance *distance = Factory::make(f); - + Distance *const distance = Factory::make("." + str); distance->setParent(parent); return distance; } diff --git a/openbr/plugins/core/loadstore.cpp b/openbr/plugins/core/loadstore.cpp index 4a7e341..6c9e639 100644 --- a/openbr/plugins/core/loadstore.cpp +++ b/openbr/plugins/core/loadstore.cpp @@ -163,6 +163,82 @@ private: BR_REGISTER(Transform, LoadStoreTransform) +/*! + * \ingroup distances + * \brief Caches Distance training. + * \author Josh Klontz \cite jklontz + */ +class LoadStoreDistance : public Distance +{ + Q_OBJECT + Q_PROPERTY(QString distanceString READ get_distanceString WRITE set_distanceString RESET reset_distanceString STORED false) + Q_PROPERTY(QString fileName READ get_fileName WRITE set_fileName RESET reset_fileName STORED false) + BR_PROPERTY(QString, distanceString, QString()) + BR_PROPERTY(QString, fileName, QString()) + + QSharedPointer distance; + +private: + void init() + { + const QString resolvedFileName = getFileName(); + if (resolvedFileName.isEmpty()) { + distance.reset(Distance::make(distanceString)); + return; + } + + qDebug("Loading %s", qPrintable(resolvedFileName)); + QFile file(resolvedFileName); + if (!file.open(QFile::ReadOnly)) + qFatal("Failed to open %s for reading.", qPrintable(resolvedFileName)); + + QDataStream stream(&file); + stream >> distanceString; + + distance.reset(Distance::make(distanceString)); + distance->load(stream); + } + + QString getFileName() const + { + foreach (const QString &file, QStringList() << fileName + << Globals->sdkPath + "/share/openbr/models/distances/" + fileName) + if (QFileInfo(file).exists()) + return file; + return QString(); + } + + void train(const TemplateList &src) + { + if (QFileInfo(getFileName()).exists()) + return; + + qDebug("Training %s", qPrintable(fileName)); + distance->train(src); + + qDebug("Storing %s", qPrintable(fileName)); + QFile file(fileName); + if (!file.open(QFile::WriteOnly)) + qFatal("Failed to open %s for writing.", qPrintable(fileName)); + + QDataStream stream(&file); + stream << distanceString; + distance->store(stream); + } + + float compare(const Template &a, const Template &b) const + { + return distance->compare(a, b); + } + + float compare(const uchar *a, const uchar *b, size_t size) const + { + return distance->compare(a, b, size); + } +}; + +BR_REGISTER(Distance, LoadStoreDistance) + } // namespace br #include "core/loadstore.moc" -- libgit2 0.21.4