diff --git a/sdk/core/core.cpp b/sdk/core/core.cpp index 3db24ed..b3a1940 100644 --- a/sdk/core/core.cpp +++ b/sdk/core/core.cpp @@ -252,7 +252,7 @@ private: if (words.size() > 2) qFatal("AlgorithmCore::init invalid algorithm format."); transform = QSharedPointer(Transform::make(words[0], NULL)); - if (words.size() > 1) distance = QSharedPointer(Factory::make("." + words[1])); + if (words.size() > 1) distance = QSharedPointer(Distance::make(words[1], NULL)); } }; diff --git a/sdk/openbr_plugin.cpp b/sdk/openbr_plugin.cpp index 4c8d311..13b3f84 100644 --- a/sdk/openbr_plugin.cpp +++ b/sdk/openbr_plugin.cpp @@ -497,6 +497,8 @@ QString Object::argument(int index) const return "[" + strings.join(",") + "]"; } else if (type == "br::Transform*") { return variant.value()->description(); + } else if (type == "br::Distance*") { + return variant.value()->description(); } else if (type == "QStringList") { return "[" + variant.toStringList().join(",") + "]"; } @@ -524,6 +526,8 @@ void Object::store(QDataStream &stream) const transform->store(stream); } else if (type == "br::Transform*") { property.read(this).value()->store(stream); + } else if (type == "br::Distance*") { + property.read(this).value()->store(stream); } else if (type == "bool") { stream << property.read(this).toBool(); } else if (type == "int") { @@ -556,6 +560,8 @@ void Object::load(QDataStream &stream) transform->load(stream); } else if (type == "br::Transform*") { property.read(this).value()->load(stream); + } else if (type == "br::Distance*") { + property.read(this).value()->load(stream); } else if (type == "bool") { bool value; stream >> value; @@ -620,6 +626,8 @@ void Object::setProperty(const QString &name, const QString &value) } } else if (type == "br::Transform*") { variant.setValue(Transform::make(value, this)); + } else if (type == "br::Distance*") { + variant.setValue(Distance::make(value, this)); } else if (type == "QStringList") { variant.setValue(parse(value.mid(1, value.size()-2))); } else if (type == "bool") { @@ -630,6 +638,7 @@ void Object::setProperty(const QString &name, const QString &value) } else { variant = value; } + if (!QObject::setProperty(qPrintable(name), variant) && !type.isEmpty()) qFatal("Failed to set %s::%s to: %s %s", metaObject()->className(), qPrintable(name), qPrintable(value), qPrintable(type)); @@ -786,6 +795,7 @@ void br::Context::initializeQt(QString sdkPath) qRegisterMetaType< QList >(); qRegisterMetaType< br::Transform* >(); qRegisterMetaType< QList >(); + qRegisterMetaType< br::Distance* >(); qRegisterMetaType< cv::Mat >(); qInstallMsgHandler(messageHandler); @@ -1270,6 +1280,19 @@ void Transform::backProject(const TemplateList &dst, TemplateList &src) const } /* Distance - public methods */ +Distance *Distance::make(QString str, QObject *parent) +{ + // Check for custom transforms + if (Globals->abbreviations.contains(str)) + return make(Globals->abbreviations[str], parent); + + File f = "." + str; + Distance *distance = Factory::make(f); + + distance->setParent(parent); + return distance; +} + void Distance::compare(const TemplateList &target, const TemplateList &query, Output *output) const { const bool stepTarget = target.size() > query.size(); diff --git a/sdk/openbr_plugin.h b/sdk/openbr_plugin.h index f4964eb..548288f 100644 --- a/sdk/openbr_plugin.h +++ b/sdk/openbr_plugin.h @@ -1066,6 +1066,9 @@ class BR_EXPORT Distance : public Object Q_OBJECT public: + virtual ~Distance() {} + static Distance *make(QString str, QObject *parent); /*!< \brief Make a distance from a string. */ + static QSharedPointer fromAlgorithm(const QString &algorithm); /*!< \brief Retrieve an algorithm's distance. */ virtual void train(const TemplateList &src) { (void) src; } /*!< \brief Train the distance. */ virtual void compare(const TemplateList &target, const TemplateList &query, Output *output) const; /*!< \brief Compare two template lists. */ @@ -1126,6 +1129,7 @@ Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(br::Transform*) Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(br::Distance*) Q_DECLARE_METATYPE(cv::Mat) #endif // __OPENBR_PLUGIN_H