Commit 0be609a0397b786f1935f4a20238d2a981541456
Documentation typo
Showing
11 changed files
with
238 additions
and
248 deletions
CMakeLists.txt
| @@ -121,7 +121,7 @@ endif() | @@ -121,7 +121,7 @@ endif() | ||
| 121 | 121 | ||
| 122 | # Install | 122 | # Install |
| 123 | install(FILES CHANGELOG.md LICENSE.txt README.md DESTINATION .) | 123 | install(FILES CHANGELOG.md LICENSE.txt README.md DESTINATION .) |
| 124 | -install(DIRECTORY data share DESTINATION .) | 124 | +install(DIRECTORY share DESTINATION .) |
| 125 | install(DIRECTORY ${BR_THIRDPARTY_SHARE} DESTINATION share) | 125 | install(DIRECTORY ${BR_THIRDPARTY_SHARE} DESTINATION share) |
| 126 | 126 | ||
| 127 | # Package | 127 | # Package |
app/br/br.cpp
| @@ -24,9 +24,9 @@ | @@ -24,9 +24,9 @@ | ||
| 24 | 24 | ||
| 25 | /*! | 25 | /*! |
| 26 | * \defgroup cli Command Line Interface | 26 | * \defgroup cli Command Line Interface |
| 27 | - * \brief Command line application for running algorithms and evaluating results. | 27 | + * \brief Command line wrapper of the \ref c_sdk. |
| 28 | * | 28 | * |
| 29 | - * The easiest and fastest way to leverage the project, we use it all the time! | 29 | + * The easiest and fastest way to run algorithms and evaluating results, we use it all the time! |
| 30 | * Commands are designed to mirror the \ref c_sdk and are evaluated in the order they are entered. | 30 | * Commands are designed to mirror the \ref c_sdk and are evaluated in the order they are entered. |
| 31 | * To get started, try running: | 31 | * To get started, try running: |
| 32 | * \code | 32 | * \code |
openbr/openbr.h
| @@ -25,7 +25,7 @@ extern "C" { | @@ -25,7 +25,7 @@ extern "C" { | ||
| 25 | 25 | ||
| 26 | /*! | 26 | /*! |
| 27 | * \defgroup c_sdk C SDK | 27 | * \defgroup c_sdk C SDK |
| 28 | - * \brief High-level API for running algorithms and evaluating results with wrappers available for other programming languages. | 28 | + * \brief High-level API for running algorithms and evaluating results. |
| 29 | * | 29 | * |
| 30 | * In order to provide a high-level interface that is usable from the command line and callable from other programming languages, | 30 | * In order to provide a high-level interface that is usable from the command line and callable from other programming languages, |
| 31 | * the API is designed to operate at the "file system" level. | 31 | * the API is designed to operate at the "file system" level. |
| @@ -300,6 +300,7 @@ BR_EXPORT float br_progress(); | @@ -300,6 +300,7 @@ BR_EXPORT float br_progress(); | ||
| 300 | * | 300 | * |
| 301 | * Used by the \ref cli to implement \c -daemon, generally not useful otherwise. | 301 | * Used by the \ref cli to implement \c -daemon, generally not useful otherwise. |
| 302 | * Guaranteed to return at least one argument. | 302 | * Guaranteed to return at least one argument. |
| 303 | + * \param pipe Pipe name | ||
| 303 | * \param[out] argc argument count | 304 | * \param[out] argc argument count |
| 304 | * \param[out] argv argument list | 305 | * \param[out] argv argument list |
| 305 | * \note \ref managed_return_value | 306 | * \note \ref managed_return_value |
openbr/openbr_export.cpp
| @@ -17,22 +17,27 @@ | @@ -17,22 +17,27 @@ | ||
| 17 | /*! | 17 | /*! |
| 18 | * \mainpage | 18 | * \mainpage |
| 19 | * \section overview Overview | 19 | * \section overview Overview |
| 20 | - * OpenBR \cite openbr is a toolkit for biometric recognition and evaluation. | ||
| 21 | - * Supported use cases include training new recognition algorithms, interfacing with commercial systems, and measuring algorithm performance. | ||
| 22 | - * Free algorithms are also available for specific modalities including \ref cpp_face_recognition, \ref cpp_age_estimation, and \ref cpp_gender_estimation. | 20 | + * OpenBR \cite openbr is a framework for investigating new modalities, improving existing algorithms, interfacing with commercial systems, measuring recognition performance, and deploying automated biometric systems. |
| 21 | + * The project is designed to facilitate rapid algorithm prototyping, and features a mature core framework, flexible plugin system, and support for open and closed source development. | ||
| 22 | + * Off-the-shelf algorithms are also available for specific modalities including \ref cpp_face_recognition, \ref cpp_age_estimation, and \ref cpp_gender_estimation. | ||
| 23 | * | 23 | * |
| 24 | - * There are three modules users may interact with: | ||
| 25 | - * - \ref cli - \copybrief cli | ||
| 26 | - * - \ref c_sdk - \copybrief c_sdk | ||
| 27 | - * - \ref cpp_plugin_sdk - \copybrief cpp_plugin_sdk | 24 | + * OpenBR originated within The MITRE Corporation from a need to streamline the process of prototyping new algorithms. |
| 25 | + * The project was later published as open source software under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache 2</a> license and is <i>free for academic and commercial use</i>. | ||
| 26 | + * | ||
| 27 | + * \image html "share/openbr/abstraction.svg" "The two principal software artifacts are the shared library 'openbr' and command line application 'br'." | ||
| 28 | * | 28 | * |
| 29 | * \section get_started Get Started | 29 | * \section get_started Get Started |
| 30 | * - \ref installation - \copybrief installation | 30 | * - \ref installation - \copybrief installation |
| 31 | + * | ||
| 32 | + * \section learn_more Learn More | ||
| 33 | + * - \ref cli - \copybrief cli | ||
| 34 | + * - \ref c_sdk - \copybrief c_sdk | ||
| 35 | + * - \ref cpp_plugin_sdk - \copybrief cpp_plugin_sdk | ||
| 31 | */ | 36 | */ |
| 32 | 37 | ||
| 33 | /*! | 38 | /*! |
| 34 | * \page installation Installation | 39 | * \page installation Installation |
| 35 | - * \brief A hacker's guide to building, editing, and running the project. | 40 | + * \brief A hacker's guide to building, editing, and running OpenBR. |
| 36 | * | 41 | * |
| 37 | * \section installation_from_source From Source | 42 | * \section installation_from_source From Source |
| 38 | * Installation from source is the recommended method for getting OpenBR on your machine. | 43 | * Installation from source is the recommended method for getting OpenBR on your machine. |
| @@ -101,7 +106,7 @@ $ br -help | @@ -101,7 +106,7 @@ $ br -help | ||
| 101 | * $ nmake install | 106 | * $ nmake install |
| 102 | * $ nmake clean | 107 | * $ nmake clean |
| 103 | * \endcode | 108 | * \endcode |
| 104 | -* -# <a href="http://releases.qt-project.org/qt5/5.0.1/single/qt-everywhere-opensource-src-5.0.1.zip">Download Qt 5.0.1</a> and unzip. | 109 | + * -# <a href="http://releases.qt-project.org/qt5/5.0.1/single/qt-everywhere-opensource-src-5.0.1.zip">Download Qt 5.0.1</a> and unzip. |
| 105 | * -# Install Perl/Python/Ruby dependencies as explained in the "Windows" section of "README". Make sure they are added to "path" when given the option during installation. | 110 | * -# Install Perl/Python/Ruby dependencies as explained in the "Windows" section of "README". Make sure they are added to "path" when given the option during installation. |
| 106 | * -# <a href="http://www.microsoft.com/en-us/download/confirmation.aspx?id=6812">Download Direct X Software Developement Kit</a> and install. | 111 | * -# <a href="http://www.microsoft.com/en-us/download/confirmation.aspx?id=6812">Download Direct X Software Developement Kit</a> and install. |
| 107 | * -# From the VS2012 x64 Cross Tools Command Prompt: | 112 | * -# From the VS2012 x64 Cross Tools Command Prompt: |
openbr/openbr_plugin.cpp
| @@ -25,13 +25,12 @@ | @@ -25,13 +25,12 @@ | ||
| 25 | #include <QtConcurrentRun> | 25 | #include <QtConcurrentRun> |
| 26 | #include <algorithm> | 26 | #include <algorithm> |
| 27 | #include <iostream> | 27 | #include <iostream> |
| 28 | -#include <openbr/openbr_plugin.h> | ||
| 29 | -#include <openbr/plugins/openbr_internal.h> | ||
| 30 | 28 | ||
| 31 | #ifndef BR_EMBEDDED | 29 | #ifndef BR_EMBEDDED |
| 32 | #include <QApplication> | 30 | #include <QApplication> |
| 33 | #endif | 31 | #endif |
| 34 | 32 | ||
| 33 | +#include "openbr_plugin.h" | ||
| 35 | #include "version.h" | 34 | #include "version.h" |
| 36 | #include "core/bee.h" | 35 | #include "core/bee.h" |
| 37 | #include "core/common.h" | 36 | #include "core/common.h" |
| @@ -634,62 +633,73 @@ void Object::load(QDataStream &stream) | @@ -634,62 +633,73 @@ void Object::load(QDataStream &stream) | ||
| 634 | init(); | 633 | init(); |
| 635 | } | 634 | } |
| 636 | 635 | ||
| 637 | -void Object::setProperty(const QString &name, const QString &value) | 636 | +void Object::setProperty(const QString &name, QVariant value) |
| 638 | { | 637 | { |
| 639 | QString type; | 638 | QString type; |
| 640 | int index = metaObject()->indexOfProperty(qPrintable(name)); | 639 | int index = metaObject()->indexOfProperty(qPrintable(name)); |
| 641 | if (index != -1) type = metaObject()->property(index).typeName(); | 640 | if (index != -1) type = metaObject()->property(index).typeName(); |
| 642 | - else type = ""; | ||
| 643 | 641 | ||
| 644 | - QVariant variant; | ||
| 645 | - if (type.startsWith("QList<") && type.endsWith(">")) { | ||
| 646 | - if (!value.startsWith('[')) qFatal("Expected a list."); | ||
| 647 | - const QStringList strings = parse(value.mid(1, value.size()-2)); | 642 | + if ((type.startsWith("QList<") && type.endsWith(">")) || (type == "QStringList")) { |
| 643 | + QVariantList elements; | ||
| 644 | + if (value.canConvert<QVariantList>()) { | ||
| 645 | + elements = value.value<QVariantList>(); | ||
| 646 | + } else if (value.canConvert<QString>()) { | ||
| 647 | + QString string = value.value<QString>(); | ||
| 648 | + if (!string.startsWith('[') || !string.endsWith(']')) | ||
| 649 | + qFatal("Expected a list to start with '[' and end with 'brackets']'."); | ||
| 650 | + foreach (const QString &element, parse(string.mid(1, string.size()-2))) | ||
| 651 | + elements.append(element); | ||
| 652 | + } else { | ||
| 653 | + qFatal("Expected a list."); | ||
| 654 | + } | ||
| 648 | 655 | ||
| 649 | - if (type == "QList<float>") { | ||
| 650 | - QList<float> values; | ||
| 651 | - foreach (const QString &string, strings) | ||
| 652 | - values.append(string.toFloat()); | ||
| 653 | - variant.setValue(values); | 656 | + if ((type == "QList<QString>") || (type == "QStringList")) { |
| 657 | + QStringList parsedValues; | ||
| 658 | + foreach (const QVariant &element, elements) | ||
| 659 | + parsedValues.append(element.toString()); | ||
| 660 | + value.setValue(parsedValues); | ||
| 661 | + } else if (type == "QList<float>") { | ||
| 662 | + QList<float> parsedValues; bool ok; | ||
| 663 | + foreach (const QVariant &element, elements) { | ||
| 664 | + parsedValues.append(element.toFloat(&ok)); | ||
| 665 | + if (!ok) qFatal("Failed to convert element to floating point format."); | ||
| 666 | + } | ||
| 667 | + value.setValue(parsedValues); | ||
| 654 | } else if (type == "QList<int>") { | 668 | } else if (type == "QList<int>") { |
| 655 | - QList<int> values; | ||
| 656 | - foreach (const QString &string, strings) | ||
| 657 | - values.append(string.toInt()); | ||
| 658 | - variant.setValue(values); | 669 | + QList<int> parsedValues; bool ok; |
| 670 | + foreach (const QVariant &element, elements) { | ||
| 671 | + parsedValues.append(element.toInt(&ok)); | ||
| 672 | + if (!ok) qFatal("Failed to convert element to integer format."); | ||
| 673 | + } | ||
| 674 | + value.setValue(parsedValues); | ||
| 659 | } else if (type == "QList<br::Transform*>") { | 675 | } else if (type == "QList<br::Transform*>") { |
| 660 | - QList<Transform*> values; | ||
| 661 | - foreach (const QString &string, strings) | ||
| 662 | - values.append(Transform::make(string, this)); | ||
| 663 | - variant.setValue(values); | 676 | + QList<Transform*> parsedValues; |
| 677 | + foreach (const QVariant &element, elements) | ||
| 678 | + if (element.canConvert<QString>()) parsedValues.append(Transform::make(element.toString(), this)); | ||
| 679 | + else parsedValues.append(element.value<Transform*>()); | ||
| 680 | + value.setValue(parsedValues); | ||
| 664 | } else if (type == "QList<br::Distance*>") { | 681 | } else if (type == "QList<br::Distance*>") { |
| 665 | - QList<Distance*> values; | ||
| 666 | - foreach (const QString &string, strings) | ||
| 667 | - values.append(Distance::make(string, this)); | ||
| 668 | - variant.setValue(values); | 682 | + QList<Distance*> parsedValues; |
| 683 | + foreach (const QVariant &element, elements) | ||
| 684 | + if (element.canConvert<QString>()) parsedValues.append(Distance::make(element.toString(), this)); | ||
| 685 | + else parsedValues.append(element.value<Distance*>()); | ||
| 686 | + value.setValue(parsedValues); | ||
| 669 | } else { | 687 | } else { |
| 670 | qFatal("Unrecognized type: %s", qPrintable(type)); | 688 | qFatal("Unrecognized type: %s", qPrintable(type)); |
| 671 | } | 689 | } |
| 672 | } else if (type == "br::Transform*") { | 690 | } else if (type == "br::Transform*") { |
| 673 | - variant.setValue(Transform::make(value, this)); | 691 | + if (value.canConvert<QString>()) |
| 692 | + value.setValue(Transform::make(value.toString(), this)); | ||
| 674 | } else if (type == "br::Distance*") { | 693 | } else if (type == "br::Distance*") { |
| 675 | - variant.setValue(Distance::make(value, this)); | ||
| 676 | - } else if (type == "QStringList") { | ||
| 677 | - variant.setValue(parse(value.mid(1, value.size()-2))); | 694 | + if (value.canConvert<QString>()) |
| 695 | + value.setValue(Distance::make(value.toString(), this)); | ||
| 678 | } else if (type == "bool") { | 696 | } else if (type == "bool") { |
| 679 | - if (value.isEmpty()) variant = true; | ||
| 680 | - else if (value == "false") variant = false; | ||
| 681 | - else if (value == "true") variant = true; | ||
| 682 | - else variant = value; | ||
| 683 | - } else { | ||
| 684 | - variant = value; | 697 | + if (value.isNull()) value = true; |
| 698 | + else if (value == "false") value = false; | ||
| 699 | + else if (value == "true") value = true; | ||
| 685 | } | 700 | } |
| 686 | 701 | ||
| 687 | - setProperty(name, variant, !type.isEmpty()); | ||
| 688 | -} | ||
| 689 | - | ||
| 690 | -void Object::setProperty(const QString &name, const QVariant &value, bool failOnError) | ||
| 691 | -{ | ||
| 692 | - if (!QObject::setProperty(qPrintable(name), value) && failOnError) | 702 | + if (!QObject::setProperty(qPrintable(name), value) && !type.isEmpty()) |
| 693 | qFatal("Failed to set %s::%s to: %s", | 703 | qFatal("Failed to set %s::%s to: %s", |
| 694 | metaObject()->className(), qPrintable(name), qPrintable(value.toString())); | 704 | metaObject()->className(), qPrintable(name), qPrintable(value.toString())); |
| 695 | } | 705 | } |
| @@ -702,42 +712,27 @@ QStringList Object::parse(const QString &string, char split) | @@ -702,42 +712,27 @@ QStringList Object::parse(const QString &string, char split) | ||
| 702 | /* Object - private methods */ | 712 | /* Object - private methods */ |
| 703 | void Object::init(const File &file_) | 713 | void Object::init(const File &file_) |
| 704 | { | 714 | { |
| 705 | - this->file = file_; | ||
| 706 | - | ||
| 707 | - // Set name | ||
| 708 | - QString name = metaObject()->className(); | ||
| 709 | - if (name.startsWith("br::")) name = name.right(name.size()-4); | 715 | + file = file_; |
| 710 | 716 | ||
| 711 | - firstAvailablePropertyIdx = metaObject()->propertyCount(); | ||
| 712 | - | ||
| 713 | - const QMetaObject * baseClass = metaObject(); | ||
| 714 | - const QMetaObject * superClass = metaObject()->superClass(); | ||
| 715 | - | ||
| 716 | - while (superClass != NULL) { | ||
| 717 | - const QMetaObject * nextClass = superClass->superClass(); | ||
| 718 | - | ||
| 719 | - // baseClass <- something <- br::Object | ||
| 720 | - // baseClass is the highest class whose properties we can set via positional arguments | ||
| 721 | - if (nextClass && !strcmp(nextClass->className(),"br::Object")) { | 717 | + // Determine interfaceName and firstAvailablePropertyIdx |
| 718 | + QString interfaceName; | ||
| 719 | + const QMetaObject *baseClass = metaObject(); | ||
| 720 | + while (true) { | ||
| 721 | + if (!strcmp(baseClass->superClass()->className(), "br::Object") /* Special case for classes that inherit directly from br::Object */ || | ||
| 722 | + !strcmp(baseClass->superClass()->superClass()->className(), "br::Object") /* General case for plugins that inherit indirectly from br::Object */) { | ||
| 722 | firstAvailablePropertyIdx = baseClass->propertyOffset(); | 723 | firstAvailablePropertyIdx = baseClass->propertyOffset(); |
| 724 | + interfaceName = QString(baseClass->superClass()->className()).remove("br::"); | ||
| 725 | + break; | ||
| 723 | } | 726 | } |
| 724 | - | ||
| 725 | - QString superClassName = superClass->className(); | ||
| 726 | - | ||
| 727 | - // strip br:: prefix from superclass name | ||
| 728 | - if (superClassName.startsWith("br::")) | ||
| 729 | - superClassName = superClassName.right(superClassName.size()-4); | ||
| 730 | - | ||
| 731 | - // Strip superclass name from base class name (e.g. PipeTransform -> Pipe) | ||
| 732 | - if (name.endsWith(superClassName)) | ||
| 733 | - name = name.left(name.size() - superClassName.size()); | ||
| 734 | - baseClass = superClass; | ||
| 735 | - superClass = superClass->superClass(); | ||
| 736 | - | 727 | + baseClass = baseClass->superClass(); |
| 737 | } | 728 | } |
| 729 | + | ||
| 730 | + // Strip interface name from object name (e.g. PipeTransform -> Pipe) | ||
| 731 | + QString name = QString(metaObject()->className()).remove("br::"); | ||
| 732 | + if (name.endsWith(interfaceName)) name = name.left(name.size() - interfaceName.size()); | ||
| 738 | setObjectName(name); | 733 | setObjectName(name); |
| 739 | 734 | ||
| 740 | - // Reset all properties | 735 | + // Set properties to their default values |
| 741 | for (int i=0; i<metaObject()->propertyCount(); i++) { | 736 | for (int i=0; i<metaObject()->propertyCount(); i++) { |
| 742 | QMetaProperty property = metaObject()->property(i); | 737 | QMetaProperty property = metaObject()->property(i); |
| 743 | if (property.isResettable()) | 738 | if (property.isResettable()) |
| @@ -747,20 +742,16 @@ void Object::init(const File &file_) | @@ -747,20 +742,16 @@ void Object::init(const File &file_) | ||
| 747 | 742 | ||
| 748 | foreach (QString key, file.localKeys()) { | 743 | foreach (QString key, file.localKeys()) { |
| 749 | const QVariant value = file.value(key); | 744 | const QVariant value = file.value(key); |
| 750 | - const QString valueString = value.toString(); | ||
| 751 | - | ||
| 752 | if (key.startsWith(("_Arg"))) { | 745 | if (key.startsWith(("_Arg"))) { |
| 753 | int argumentNumber = key.mid(4).toInt(); | 746 | int argumentNumber = key.mid(4).toInt(); |
| 754 | int targetIdx = argumentNumber + firstAvailablePropertyIdx; | 747 | int targetIdx = argumentNumber + firstAvailablePropertyIdx; |
| 755 | if (targetIdx >= metaObject()->propertyCount()) { | 748 | if (targetIdx >= metaObject()->propertyCount()) { |
| 756 | - qWarning("too many arguments for transform %s, ignoring %s", qPrintable(objectName()), qPrintable(valueString)); | 749 | + qWarning("Too many arguments for object: %s, ignoring: %s", qPrintable(objectName()), qPrintable(value.toString())); |
| 757 | continue; | 750 | continue; |
| 758 | } | 751 | } |
| 759 | key = metaObject()->property(targetIdx).name(); | 752 | key = metaObject()->property(targetIdx).name(); |
| 760 | } | 753 | } |
| 761 | - | ||
| 762 | - if (valueString.isEmpty()) setProperty(key, value); // Set the property directly | ||
| 763 | - else setProperty(key, valueString); // Parse the value first | 754 | + setProperty(key, value); |
| 764 | } | 755 | } |
| 765 | 756 | ||
| 766 | init(); | 757 | init(); |
| @@ -1121,14 +1112,9 @@ Transform *Transform::make(QString str, QObject *parent) | @@ -1121,14 +1112,9 @@ Transform *Transform::make(QString str, QObject *parent) | ||
| 1121 | Transform *transform = Factory<Transform>::make(f); | 1112 | Transform *transform = Factory<Transform>::make(f); |
| 1122 | 1113 | ||
| 1123 | if (transform->independent) { | 1114 | if (transform->independent) { |
| 1124 | -// Transform *independentTransform = Factory<Transform>::make(".Independent"); | ||
| 1125 | -// static_cast<QObject*>(independentTransform)->setProperty("transform", qVariantFromValue<void*>(transform)); | ||
| 1126 | -// independentTransform->init(); | ||
| 1127 | -// transform = independentTransform; | ||
| 1128 | - | ||
| 1129 | - File independent(".Independent"); | ||
| 1130 | - independent.set("transform", qVariantFromValue<void*>(transform)); | ||
| 1131 | - transform = Factory<Transform>::make(independent); | 1115 | + File independent(".Independent"); |
| 1116 | + independent.set("transform", qVariantFromValue<void*>(transform)); | ||
| 1117 | + transform = Factory<Transform>::make(independent); | ||
| 1132 | } | 1118 | } |
| 1133 | 1119 | ||
| 1134 | transform->setParent(parent); | 1120 | transform->setParent(parent); |
openbr/openbr_plugin.h
| @@ -44,7 +44,7 @@ | @@ -44,7 +44,7 @@ | ||
| 44 | 44 | ||
| 45 | /*! | 45 | /*! |
| 46 | * \defgroup cpp_plugin_sdk C++ Plugin SDK | 46 | * \defgroup cpp_plugin_sdk C++ Plugin SDK |
| 47 | - * \brief Plugin API for developing new algorithms. | 47 | + * \brief Plugin API for extending OpenBR functionality. |
| 48 | * | 48 | * |
| 49 | * \code | 49 | * \code |
| 50 | * #include <openbr/openbr_plugin.h> | 50 | * #include <openbr/openbr_plugin.h> |
| @@ -96,7 +96,7 @@ namespace br | @@ -96,7 +96,7 @@ namespace br | ||
| 96 | * | 96 | * |
| 97 | * \b Example:<br> | 97 | * \b Example:<br> |
| 98 | * Note the symmetry between \c BR_PROPERTY and \c Q_PROPERTY. | 98 | * Note the symmetry between \c BR_PROPERTY and \c Q_PROPERTY. |
| 99 | - * \snippet sdk/plugins/misc.cpp example_transform | 99 | + * \snippet openbr/plugins/misc.cpp example_transform |
| 100 | */ | 100 | */ |
| 101 | #define BR_PROPERTY(TYPE,NAME,DEFAULT) \ | 101 | #define BR_PROPERTY(TYPE,NAME,DEFAULT) \ |
| 102 | TYPE NAME; \ | 102 | TYPE NAME; \ |
| @@ -107,19 +107,28 @@ void reset_##NAME() { NAME = DEFAULT; } | @@ -107,19 +107,28 @@ void reset_##NAME() { NAME = DEFAULT; } | ||
| 107 | /*! | 107 | /*! |
| 108 | * \brief A file path with associated metadata. | 108 | * \brief A file path with associated metadata. |
| 109 | * | 109 | * |
| 110 | - * The br::File is one of the workhorse classes in OpenBR. | 110 | + * The File is one of two important data structures in OpenBR (the Template is the other). |
| 111 | * It is typically used to store the path to a file on disk with associated metadata. | 111 | * It is typically used to store the path to a file on disk with associated metadata. |
| 112 | - * The ability to associate a metadata map with the file helps keep the API simple and stable while providing customizable behavior when appropriate. | 112 | + * The ability to associate a key/value metadata table with the file helps keep the API simple while providing customizable behavior. |
| 113 | * | 113 | * |
| 114 | - * When querying the value of a metadata key, the value will first try to be resolved using the file's private metadata. | ||
| 115 | - * If the key does not exist in the local map then it will be resolved using the properities in the global br::Context. | ||
| 116 | - * This has the desirable effect that file metadata may optionally be set globally using br::Context::set to operate on all files. | 114 | + * When querying the value of a metadata key, the value will first try to be resolved against the file's private metadata table. |
| 115 | + * If the key does not exist in its local table then it will be resolved against the properities in the global Context. | ||
| 116 | + * By design file metadata may be set globally using Context::setProperty to operate on all files. | ||
| 117 | * | 117 | * |
| 118 | * Files have a simple grammar that allow them to be converted to and from strings. | 118 | * Files have a simple grammar that allow them to be converted to and from strings. |
| 119 | * If a string ends with a \c ] or \c ) then the text within the final \c [] or \c () are parsed as comma sperated metadata fields. | 119 | * If a string ends with a \c ] or \c ) then the text within the final \c [] or \c () are parsed as comma sperated metadata fields. |
| 120 | - * Fields within \c [] are expected to have the format <tt>[key1=value1, key2=value2, ..., keyN=valueN]</tt>. | ||
| 121 | - * Fields within \c () are expected to have the format <tt>(value1, value2, ..., valueN)</tt> with the keys determined from the order of \c Q_PROPERTY. | ||
| 122 | - * The rest of the string is assigned to #name. | 120 | + * By convention, fields within \c [] are expected to have the format <tt>[key1=value1, key2=value2, ..., keyN=valueN]</tt> where order is irrelevant. |
| 121 | + * Fields within \c () are expected to have the format <tt>(value1, value2, ..., valueN)</tt> where order matters and the key context dependent. | ||
| 122 | + * The left hand side of the string not parsed in a manner described above is assigned to #name. | ||
| 123 | + * | ||
| 124 | + * Values are not necessarily stored as strings in the metadata table. | ||
| 125 | + * The system will attempt to infer and convert them to their "native" type. | ||
| 126 | + * The conversion logic is as follows: | ||
| 127 | + * -# If the value starts with \c [ and ends with \c ] then it is treated as a comma separated list and represented with \c QVariantList. Each value in the list is parsed recursively. | ||
| 128 | + * -# If the value starts with \c ( and ends with \c ) and contains four comma separated elements, each convertable to a floating point number, then it is represented with \c QRectF. | ||
| 129 | + * -# If the value starts with \c ( and ends with \c ) and contains two comma separated elements, each convertable to a floating point number, then it is represented with \c QPointF. | ||
| 130 | + * -# If the value is convertable to a floating point number then it is represented with \c float. | ||
| 131 | + * -# Otherwise, it is represented with \c QString. | ||
| 123 | * | 132 | * |
| 124 | * The metadata keys \c Subject and \c Label have special significance in the system. | 133 | * The metadata keys \c Subject and \c Label have special significance in the system. |
| 125 | * \c Subject is a string specifying a unique identifier used to determine ground truth match/non-match. | 134 | * \c Subject is a string specifying a unique identifier used to determine ground truth match/non-match. |
| @@ -298,7 +307,7 @@ struct BR_EXPORT FileList : public QList<File> | @@ -298,7 +307,7 @@ struct BR_EXPORT FileList : public QList<File> | ||
| 298 | /*! | 307 | /*! |
| 299 | * \brief A list of matrices associated with a file. | 308 | * \brief A list of matrices associated with a file. |
| 300 | * | 309 | * |
| 301 | - * The br::Template is one of the workhorse classes in OpenBR. | 310 | + * The Template is one of two important data structures in OpenBR (the File is the other). |
| 302 | * A template represents a biometric at various stages of enrollment and can be modified by br::Transform and compared to other templates with br::Distance. | 311 | * A template represents a biometric at various stages of enrollment and can be modified by br::Transform and compared to other templates with br::Distance. |
| 303 | * | 312 | * |
| 304 | * While there exist many cases (ex. video enrollment, multiple face detects, per-patch subspace learning, ...) where the template will contain more than one matrix, | 313 | * While there exist many cases (ex. video enrollment, multiple face detects, per-patch subspace learning, ...) where the template will contain more than one matrix, |
| @@ -489,9 +498,7 @@ struct TemplateList : public QList<Template> | @@ -489,9 +498,7 @@ struct TemplateList : public QList<Template> | ||
| 489 | class BR_EXPORT Object : public QObject | 498 | class BR_EXPORT Object : public QObject |
| 490 | { | 499 | { |
| 491 | Q_OBJECT | 500 | Q_OBJECT |
| 492 | - | ||
| 493 | - // Index of the first property that can be set via command line arguments | ||
| 494 | - int firstAvailablePropertyIdx; | 501 | + int firstAvailablePropertyIdx; /*!< \brief Index of the first property that can be set via command line arguments. */ |
| 495 | 502 | ||
| 496 | public: | 503 | public: |
| 497 | File file; /*!< \brief The file used to construct the plugin. */ | 504 | File file; /*!< \brief The file used to construct the plugin. */ |
| @@ -504,8 +511,7 @@ public: | @@ -504,8 +511,7 @@ public: | ||
| 504 | QStringList arguments() const; /*!< \brief A string describing the values the object has. */ | 511 | QStringList arguments() const; /*!< \brief A string describing the values the object has. */ |
| 505 | QString argument(int index) const; /*!< \brief A string value for the argument at the specified index. */ | 512 | QString argument(int index) const; /*!< \brief A string value for the argument at the specified index. */ |
| 506 | QString description() const; /*!< \brief Returns a string description of the object. */ | 513 | QString description() const; /*!< \brief Returns a string description of the object. */ |
| 507 | - void setProperty(const QString &name, const QString &value); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */ | ||
| 508 | - void setProperty(const QString &name, const QVariant &value, bool failOnError = false); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */ | 514 | + void setProperty(const QString &name, QVariant value); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */ |
| 509 | static QStringList parse(const QString &string, char split = ','); /*!< \brief Splits the string while respecting lexical scoping of <tt>()</tt>, <tt>[]</tt>, <tt>\<\></tt>, and <tt>{}</tt>. */ | 515 | static QStringList parse(const QString &string, char split = ','); /*!< \brief Splits the string while respecting lexical scoping of <tt>()</tt>, <tt>[]</tt>, <tt>\<\></tt>, and <tt>{}</tt>. */ |
| 510 | 516 | ||
| 511 | private: | 517 | private: |
| @@ -715,6 +721,7 @@ public: | @@ -715,6 +721,7 @@ public: | ||
| 715 | * By default <tt>share/openbr/openbr.bib</tt> will be searched for relative to: | 721 | * By default <tt>share/openbr/openbr.bib</tt> will be searched for relative to: |
| 716 | * -# The working directory | 722 | * -# The working directory |
| 717 | * -# The executable's location | 723 | * -# The executable's location |
| 724 | + * \param use_gui Create a QApplication instead of a QCoreApplication. | ||
| 718 | * \note Tiggers \em abort() on failure to locate <tt>share/openbr/openbr.bib</tt>. | 725 | * \note Tiggers \em abort() on failure to locate <tt>share/openbr/openbr.bib</tt>. |
| 719 | * \note <a href="http://qt-project.org/">Qt</a> users should instead call this <i>after</i> initializing QApplication. | 726 | * \note <a href="http://qt-project.org/">Qt</a> users should instead call this <i>after</i> initializing QApplication. |
| 720 | * \see finalize | 727 | * \see finalize |
| @@ -858,7 +865,7 @@ const FactoryInstance<_Abstraction,_Implementation> FactoryInstance<_Abstraction | @@ -858,7 +865,7 @@ const FactoryInstance<_Abstraction,_Implementation> FactoryInstance<_Abstraction | ||
| 858 | * | 865 | * |
| 859 | * \b Example:<br> | 866 | * \b Example:<br> |
| 860 | * Note the use of \c Q_OBJECT at the beginning of the class declaration and \c BR_REGISTER after the class declaration. | 867 | * Note the use of \c Q_OBJECT at the beginning of the class declaration and \c BR_REGISTER after the class declaration. |
| 861 | - * \snippet sdk/plugins/misc.cpp example_transform | 868 | + * \snippet openbr/plugins/misc.cpp example_transform |
| 862 | */ | 869 | */ |
| 863 | #define BR_REGISTER(ABSTRACTION,IMPLEMENTATION) \ | 870 | #define BR_REGISTER(ABSTRACTION,IMPLEMENTATION) \ |
| 864 | template class \ | 871 | template class \ |
openbr/plugins/gallery.cpp
| @@ -14,6 +14,7 @@ | @@ -14,6 +14,7 @@ | ||
| 14 | * limitations under the License. * | 14 | * limitations under the License. * |
| 15 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ | 15 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
| 16 | 16 | ||
| 17 | +#include <QRegularExpression> | ||
| 17 | #include <QtConcurrentRun> | 18 | #include <QtConcurrentRun> |
| 18 | #ifndef BR_EMBEDDED | 19 | #ifndef BR_EMBEDDED |
| 19 | #include <QNetworkAccessManager> | 20 | #include <QNetworkAccessManager> |
| @@ -128,10 +129,13 @@ BR_REGISTER(Gallery, galGallery) | @@ -128,10 +129,13 @@ BR_REGISTER(Gallery, galGallery) | ||
| 128 | * \ingroup galleries | 129 | * \ingroup galleries |
| 129 | * \brief Reads/writes templates to/from folders. | 130 | * \brief Reads/writes templates to/from folders. |
| 130 | * \author Josh Klontz \cite jklontz | 131 | * \author Josh Klontz \cite jklontz |
| 132 | + * \param regexp An optional regular expression to match against the files extension. | ||
| 131 | */ | 133 | */ |
| 132 | class EmptyGallery : public Gallery | 134 | class EmptyGallery : public Gallery |
| 133 | { | 135 | { |
| 134 | Q_OBJECT | 136 | Q_OBJECT |
| 137 | + Q_PROPERTY(QString regexp READ get_regexp WRITE set_regexp RESET reset_regexp STORED false) | ||
| 138 | + BR_PROPERTY(QString, regexp, "") | ||
| 135 | 139 | ||
| 136 | void init() | 140 | void init() |
| 137 | { | 141 | { |
| @@ -160,6 +164,13 @@ class EmptyGallery : public Gallery | @@ -160,6 +164,13 @@ class EmptyGallery : public Gallery | ||
| 160 | foreach (const QString &fileName, QtUtils::getFiles(file.name, false)) | 164 | foreach (const QString &fileName, QtUtils::getFiles(file.name, false)) |
| 161 | templates.append(File(fileName, dir.dirName())); | 165 | templates.append(File(fileName, dir.dirName())); |
| 162 | 166 | ||
| 167 | + if (!regexp.isEmpty()) { | ||
| 168 | + const QRegularExpression re(regexp); | ||
| 169 | + for (int i=templates.size()-1; i>=0; i--) | ||
| 170 | + if (!re.match(templates[i].file.suffix()).hasMatch()) | ||
| 171 | + templates.removeAt(i); | ||
| 172 | + } | ||
| 173 | + | ||
| 163 | return templates; | 174 | return templates; |
| 164 | } | 175 | } |
| 165 | 176 |
openbr/plugins/quality.cpp
| @@ -181,8 +181,9 @@ class MatchProbabilityDistance : public Distance | @@ -181,8 +181,9 @@ class MatchProbabilityDistance : public Distance | ||
| 181 | float compare(const Template &target, const Template &query) const | 181 | float compare(const Template &target, const Template &query) const |
| 182 | { | 182 | { |
| 183 | float rawScore = distance->compare(target, query); | 183 | float rawScore = distance->compare(target, query); |
| 184 | - if (rawScore == -std::numeric_limits<float>::max()) return rawScore; | ||
| 185 | - return mp(rawScore, gaussian); | 184 | + return -log(rawScore+1); |
| 185 | + //if (rawScore == -std::numeric_limits<float>::max()) return rawScore; | ||
| 186 | + //return mp(rawScore, gaussian); | ||
| 186 | } | 187 | } |
| 187 | 188 | ||
| 188 | void store(QDataStream &stream) const | 189 | void store(QDataStream &stream) const |
share/openbr/Doxyfile.in
| @@ -130,7 +130,7 @@ FULL_PATH_NAMES = YES | @@ -130,7 +130,7 @@ FULL_PATH_NAMES = YES | ||
| 130 | # relative paths, which will be relative from the directory where doxygen is | 130 | # relative paths, which will be relative from the directory where doxygen is |
| 131 | # started. | 131 | # started. |
| 132 | 132 | ||
| 133 | -STRIP_FROM_PATH = ${CMAKE_CURRENT_SOURCE_DIR} | 133 | +STRIP_FROM_PATH = ${CMAKE_SOURCE_DIR} |
| 134 | 134 | ||
| 135 | # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of | 135 | # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of |
| 136 | # the path mentioned in the documentation of a class, which tells | 136 | # the path mentioned in the documentation of a class, which tells |
| @@ -661,9 +661,8 @@ WARN_LOGFILE = | @@ -661,9 +661,8 @@ WARN_LOGFILE = | ||
| 661 | # directories like "/usr/src/myproject". Separate the files or directories | 661 | # directories like "/usr/src/myproject". Separate the files or directories |
| 662 | # with spaces. | 662 | # with spaces. |
| 663 | 663 | ||
| 664 | -INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/sdk \ | ||
| 665 | - ${CMAKE_CURRENT_SOURCE_DIR}/app/br \ | ||
| 666 | - ${CMAKE_CURRENT_SOURCE_DIR}/app/examples | 664 | +INPUT = ${CMAKE_SOURCE_DIR}/app \ |
| 665 | + ${CMAKE_SOURCE_DIR}/openbr | ||
| 667 | 666 | ||
| 668 | # This tag can be used to specify the character encoding of the source files | 667 | # This tag can be used to specify the character encoding of the source files |
| 669 | # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is | 668 | # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is |
| @@ -681,8 +680,7 @@ INPUT_ENCODING = UTF-8 | @@ -681,8 +680,7 @@ INPUT_ENCODING = UTF-8 | ||
| 681 | # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py | 680 | # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py |
| 682 | # *.f90 *.f *.for *.vhd *.vhdl | 681 | # *.f90 *.f *.for *.vhd *.vhdl |
| 683 | 682 | ||
| 684 | -FILE_PATTERNS = *.h \ | ||
| 685 | - *.cpp | 683 | +FILE_PATTERNS = *.h *.cpp |
| 686 | 684 | ||
| 687 | # The RECURSIVE tag can be used to turn specify whether or not subdirectories | 685 | # The RECURSIVE tag can be used to turn specify whether or not subdirectories |
| 688 | # should be searched for input files as well. Possible values are YES and NO. | 686 | # should be searched for input files as well. Possible values are YES and NO. |
| @@ -710,7 +708,9 @@ EXCLUDE_SYMLINKS = YES | @@ -710,7 +708,9 @@ EXCLUDE_SYMLINKS = YES | ||
| 710 | # against the file with absolute path, so to exclude all test directories | 708 | # against the file with absolute path, so to exclude all test directories |
| 711 | # for example use the pattern */test/* | 709 | # for example use the pattern */test/* |
| 712 | 710 | ||
| 713 | -EXCLUDE_PATTERNS = */core/* | 711 | +EXCLUDE_PATTERNS = */core/*.cpp \ |
| 712 | + */gui/*.cpp \ | ||
| 713 | + */icons/* | ||
| 714 | 714 | ||
| 715 | # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names | 715 | # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names |
| 716 | # (namespaces, classes, functions, etc.) that should be excluded from the | 716 | # (namespaces, classes, functions, etc.) that should be excluded from the |
| @@ -733,7 +733,8 @@ EXCLUDE_SYMBOLS = br::FactoryInstance \ | @@ -733,7 +733,8 @@ EXCLUDE_SYMBOLS = br::FactoryInstance \ | ||
| 733 | # directories that contain example code fragments that are included (see | 733 | # directories that contain example code fragments that are included (see |
| 734 | # the \include command). | 734 | # the \include command). |
| 735 | 735 | ||
| 736 | -EXAMPLE_PATH = ${CMAKE_CURRENT_SOURCE_DIR}/ | 736 | +EXAMPLE_PATH = ${CMAKE_SOURCE_DIR}/app \ |
| 737 | + ${CMAKE_SOURCE_DIR}/openbr | ||
| 737 | 738 | ||
| 738 | # If the value of the EXAMPLE_PATH tag contains directories, you can use the | 739 | # If the value of the EXAMPLE_PATH tag contains directories, you can use the |
| 739 | # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp | 740 | # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp |
| @@ -754,7 +755,7 @@ EXAMPLE_RECURSIVE = YES | @@ -754,7 +755,7 @@ EXAMPLE_RECURSIVE = YES | ||
| 754 | # directories that contain image that are included in the documentation (see | 755 | # directories that contain image that are included in the documentation (see |
| 755 | # the \image command). | 756 | # the \image command). |
| 756 | 757 | ||
| 757 | -IMAGE_PATH = | 758 | +IMAGE_PATH = ${CMAKE_SOURCE_DIR} |
| 758 | 759 | ||
| 759 | # The INPUT_FILTER tag can be used to specify a program that doxygen should | 760 | # The INPUT_FILTER tag can be used to specify a program that doxygen should |
| 760 | # invoke to filter for each input file. Doxygen will invoke the filter program | 761 | # invoke to filter for each input file. Doxygen will invoke the filter program |
| @@ -1245,13 +1246,13 @@ SERVER_BASED_SEARCH = NO | @@ -1245,13 +1246,13 @@ SERVER_BASED_SEARCH = NO | ||
| 1245 | # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will | 1246 | # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will |
| 1246 | # generate Latex output. | 1247 | # generate Latex output. |
| 1247 | 1248 | ||
| 1248 | -GENERATE_LATEX = YES | 1249 | +GENERATE_LATEX = NO |
| 1249 | 1250 | ||
| 1250 | # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. | 1251 | # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. |
| 1251 | # If a relative path is entered the value of OUTPUT_DIRECTORY will be | 1252 | # If a relative path is entered the value of OUTPUT_DIRECTORY will be |
| 1252 | # put in front of it. If left blank `latex' will be used as the default path. | 1253 | # put in front of it. If left blank `latex' will be used as the default path. |
| 1253 | 1254 | ||
| 1254 | -LATEX_OUTPUT = latex | 1255 | +LATEX_OUTPUT = |
| 1255 | 1256 | ||
| 1256 | # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be | 1257 | # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be |
| 1257 | # invoked. If left blank `latex' will be used as the default command name. | 1258 | # invoked. If left blank `latex' will be used as the default command name. |
| @@ -1538,7 +1539,7 @@ INCLUDE_FILE_PATTERNS = | @@ -1538,7 +1539,7 @@ INCLUDE_FILE_PATTERNS = | ||
| 1538 | # undefined via #undef or recursively expanded use the := operator | 1539 | # undefined via #undef or recursively expanded use the := operator |
| 1539 | # instead of the = operator. | 1540 | # instead of the = operator. |
| 1540 | 1541 | ||
| 1541 | -PREDEFINED = BR_EXPORT= | 1542 | +PREDEFINED = BR_EXPORT= __cplusplus |
| 1542 | 1543 | ||
| 1543 | # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then | 1544 | # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then |
| 1544 | # this tag can be used to specify a list of macro names that should be expanded. | 1545 | # this tag can be used to specify a list of macro names that should be expanded. |
share/openbr/abstraction.svg
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | 11 | xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" |
| 12 | xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | 12 | xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" |
| 13 | width="512" | 13 | width="512" |
| 14 | - height="416" | 14 | + height="400" |
| 15 | id="svg2" | 15 | id="svg2" |
| 16 | version="1.1" | 16 | version="1.1" |
| 17 | inkscape:version="0.48.2 r9819" | 17 | inkscape:version="0.48.2 r9819" |
| @@ -40,12 +40,12 @@ | @@ -40,12 +40,12 @@ | ||
| 40 | inkscape:pageshadow="2" | 40 | inkscape:pageshadow="2" |
| 41 | inkscape:zoom="1.1446731" | 41 | inkscape:zoom="1.1446731" |
| 42 | inkscape:cx="160.23068" | 42 | inkscape:cx="160.23068" |
| 43 | - inkscape:cy="221.30937" | 43 | + inkscape:cy="162.70186" |
| 44 | inkscape:document-units="px" | 44 | inkscape:document-units="px" |
| 45 | inkscape:current-layer="layer1" | 45 | inkscape:current-layer="layer1" |
| 46 | showgrid="false" | 46 | showgrid="false" |
| 47 | - inkscape:window-width="1386" | ||
| 48 | - inkscape:window-height="856" | 47 | + inkscape:window-width="1280" |
| 48 | + inkscape:window-height="756" | ||
| 49 | inkscape:window-x="54" | 49 | inkscape:window-x="54" |
| 50 | inkscape:window-y="0" | 50 | inkscape:window-y="0" |
| 51 | inkscape:window-maximized="0" /> | 51 | inkscape:window-maximized="0" /> |
| @@ -65,30 +65,30 @@ | @@ -65,30 +65,30 @@ | ||
| 65 | inkscape:label="Layer 1" | 65 | inkscape:label="Layer 1" |
| 66 | inkscape:groupmode="layer" | 66 | inkscape:groupmode="layer" |
| 67 | id="layer1" | 67 | id="layer1" |
| 68 | - transform="translate(0,-636.36218)"> | 68 | + transform="translate(0,-652.36218)"> |
| 69 | <path | 69 | <path |
| 70 | style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" | 70 | style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" |
| 71 | - d="m 385,725.36218 110.00001,0 0,62 -110.00001,0 0,-14 26.32194,0 -0.26587,-34 -26.05607,0 z" | 71 | + d="m 385,739.36218 110.00001,0 0,62 -110.00001,0 0,-14 26.32194,0 -0.26587,-34 -26.05607,0 z" |
| 72 | id="rect3169" | 72 | id="rect3169" |
| 73 | inkscape:connector-curvature="0" | 73 | inkscape:connector-curvature="0" |
| 74 | sodipodi:nodetypes="ccccccccc" /> | 74 | sodipodi:nodetypes="ccccccccc" /> |
| 75 | <rect | 75 | <rect |
| 76 | - style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:1.99999988000000006;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" | 76 | + style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:1.99999988;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" |
| 77 | id="rect5563" | 77 | id="rect5563" |
| 78 | width="153" | 78 | width="153" |
| 79 | height="62" | 79 | height="62" |
| 80 | x="342" | 80 | x="342" |
| 81 | - y="653.36218" /> | 81 | + y="667.36218" /> |
| 82 | <rect | 82 | <rect |
| 83 | style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" | 83 | style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" |
| 84 | id="rect2985" | 84 | id="rect2985" |
| 85 | width="153" | 85 | width="153" |
| 86 | height="62" | 86 | height="62" |
| 87 | x="17" | 87 | x="17" |
| 88 | - y="653.36218" /> | 88 | + y="667.36218" /> |
| 89 | <path | 89 | <path |
| 90 | style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" | 90 | style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" |
| 91 | - d="m 17,725.36218 360,0 0,21 26,0 0,20 -26,0 0,21 -360,0 z" | 91 | + d="m 17,739.36218 360,0 0,21 26,0 0,20 -26,0 0,21 -360,0 z" |
| 92 | id="rect2989" | 92 | id="rect2989" |
| 93 | inkscape:connector-curvature="0" | 93 | inkscape:connector-curvature="0" |
| 94 | sodipodi:nodetypes="ccccccccc" /> | 94 | sodipodi:nodetypes="ccccccccc" /> |
| @@ -96,24 +96,24 @@ | @@ -96,24 +96,24 @@ | ||
| 96 | xml:space="preserve" | 96 | xml:space="preserve" |
| 97 | style="font-size:40px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic" | 97 | style="font-size:40px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic" |
| 98 | x="70.554688" | 98 | x="70.554688" |
| 99 | - y="699.79578" | 99 | + y="713.79578" |
| 100 | id="text2995" | 100 | id="text2995" |
| 101 | sodipodi:linespacing="125%"><tspan | 101 | sodipodi:linespacing="125%"><tspan |
| 102 | sodipodi:role="line" | 102 | sodipodi:role="line" |
| 103 | id="tspan2997" | 103 | id="tspan2997" |
| 104 | x="70.554688" | 104 | x="70.554688" |
| 105 | - y="699.79578">br</tspan></text> | 105 | + y="713.79578">br</tspan></text> |
| 106 | <text | 106 | <text |
| 107 | xml:space="preserve" | 107 | xml:space="preserve" |
| 108 | style="font-size:40px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic" | 108 | style="font-size:40px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic" |
| 109 | x="122.3311" | 109 | x="122.3311" |
| 110 | - y="770.04187" | 110 | + y="784.04187" |
| 111 | id="text3003" | 111 | id="text3003" |
| 112 | sodipodi:linespacing="125%"><tspan | 112 | sodipodi:linespacing="125%"><tspan |
| 113 | sodipodi:role="line" | 113 | sodipodi:role="line" |
| 114 | id="tspan3005" | 114 | id="tspan3005" |
| 115 | x="122.3311" | 115 | x="122.3311" |
| 116 | - y="770.04187">OpenBR</tspan></text> | 116 | + y="784.04187">OpenBR</tspan></text> |
| 117 | <text | 117 | <text |
| 118 | xml:space="preserve" | 118 | xml:space="preserve" |
| 119 | style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" | 119 | style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" |
| @@ -130,16 +130,16 @@ | @@ -130,16 +130,16 @@ | ||
| 130 | xml:space="preserve" | 130 | xml:space="preserve" |
| 131 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 131 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 132 | x="453.27899" | 132 | x="453.27899" |
| 133 | - y="750.23242" | 133 | + y="764.23242" |
| 134 | id="text3019" | 134 | id="text3019" |
| 135 | sodipodi:linespacing="125%"><tspan | 135 | sodipodi:linespacing="125%"><tspan |
| 136 | sodipodi:role="line" | 136 | sodipodi:role="line" |
| 137 | id="tspan3021" | 137 | id="tspan3021" |
| 138 | x="453.27899" | 138 | x="453.27899" |
| 139 | - y="750.23242">Qt &</tspan><tspan | 139 | + y="764.23242">Qt &</tspan><tspan |
| 140 | sodipodi:role="line" | 140 | sodipodi:role="line" |
| 141 | x="453.27899" | 141 | x="453.27899" |
| 142 | - y="772.73242" | 142 | + y="786.73242" |
| 143 | id="tspan3945">OpenCV</tspan></text> | 143 | id="tspan3945">OpenCV</tspan></text> |
| 144 | <text | 144 | <text |
| 145 | xml:space="preserve" | 145 | xml:space="preserve" |
| @@ -154,116 +154,116 @@ | @@ -154,116 +154,116 @@ | ||
| 154 | x="367.25104" | 154 | x="367.25104" |
| 155 | y="257.92224" /></text> | 155 | y="257.92224" /></text> |
| 156 | <rect | 156 | <rect |
| 157 | - style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:1.99999988000000006;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997000000018, 7.99999995000000030;stroke-dashoffset:0" | 157 | + style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:1.99999988;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997, 7.99999995;stroke-dashoffset:0" |
| 158 | id="rect3848" | 158 | id="rect3848" |
| 159 | width="126" | 159 | width="126" |
| 160 | height="62.000004" | 160 | height="62.000004" |
| 161 | x="369" | 161 | x="369" |
| 162 | - y="797.36218" /> | 162 | + y="811.36218" /> |
| 163 | <rect | 163 | <rect |
| 164 | - style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999987999999984, 7.99999977999999867;stroke-dashoffset:0" | 164 | + style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999988, 7.99999978;stroke-dashoffset:0" |
| 165 | id="rect3854" | 165 | id="rect3854" |
| 166 | width="62" | 166 | width="62" |
| 167 | height="62" | 167 | height="62" |
| 168 | x="225" | 168 | x="225" |
| 169 | - y="797.36212" /> | 169 | + y="811.36212" /> |
| 170 | <rect | 170 | <rect |
| 171 | style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 8;stroke-dashoffset:0" | 171 | style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 8;stroke-dashoffset:0" |
| 172 | id="rect3856" | 172 | id="rect3856" |
| 173 | width="62" | 173 | width="62" |
| 174 | height="62" | 174 | height="62" |
| 175 | x="225" | 175 | x="225" |
| 176 | - y="869.36218" /> | 176 | + y="883.36218" /> |
| 177 | <rect | 177 | <rect |
| 178 | style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 8;stroke-dashoffset:0" | 178 | style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 8;stroke-dashoffset:0" |
| 179 | id="rect3858" | 179 | id="rect3858" |
| 180 | width="61.999996" | 180 | width="61.999996" |
| 181 | height="62" | 181 | height="62" |
| 182 | x="297" | 182 | x="297" |
| 183 | - y="797.36218" /> | 183 | + y="811.36218" /> |
| 184 | <text | 184 | <text |
| 185 | xml:space="preserve" | 185 | xml:space="preserve" |
| 186 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 186 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 187 | x="255.84473" | 187 | x="255.84473" |
| 188 | - y="836.36218" | 188 | + y="850.36218" |
| 189 | id="text3816" | 189 | id="text3816" |
| 190 | sodipodi:linespacing="125%"><tspan | 190 | sodipodi:linespacing="125%"><tspan |
| 191 | sodipodi:role="line" | 191 | sodipodi:role="line" |
| 192 | id="tspan3818" | 192 | id="tspan3818" |
| 193 | x="255.84473" | 193 | x="255.84473" |
| 194 | - y="836.36218">LBP</tspan></text> | 194 | + y="850.36218">LBP</tspan></text> |
| 195 | <text | 195 | <text |
| 196 | xml:space="preserve" | 196 | xml:space="preserve" |
| 197 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 197 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 198 | x="255.64453" | 198 | x="255.64453" |
| 199 | - y="908.1073" | 199 | + y="922.1073" |
| 200 | id="text3820" | 200 | id="text3820" |
| 201 | sodipodi:linespacing="125%"><tspan | 201 | sodipodi:linespacing="125%"><tspan |
| 202 | sodipodi:role="line" | 202 | sodipodi:role="line" |
| 203 | id="tspan3822" | 203 | id="tspan3822" |
| 204 | x="255.64453" | 204 | x="255.64453" |
| 205 | - y="908.1073">HOG</tspan></text> | 205 | + y="922.1073">HOG</tspan></text> |
| 206 | <text | 206 | <text |
| 207 | xml:space="preserve" | 207 | xml:space="preserve" |
| 208 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 208 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 209 | x="327.84473" | 209 | x="327.84473" |
| 210 | - y="836.1073" | 210 | + y="850.1073" |
| 211 | id="text3824" | 211 | id="text3824" |
| 212 | sodipodi:linespacing="125%"><tspan | 212 | sodipodi:linespacing="125%"><tspan |
| 213 | sodipodi:role="line" | 213 | sodipodi:role="line" |
| 214 | id="tspan3826" | 214 | id="tspan3826" |
| 215 | x="327.84473" | 215 | x="327.84473" |
| 216 | - y="836.1073">SVM</tspan></text> | 216 | + y="850.1073">SVM</tspan></text> |
| 217 | <rect | 217 | <rect |
| 218 | - style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.00000014000000004, 8.00000028000000007;stroke-dashoffset:0" | 218 | + style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4.00000014, 8.00000028;stroke-dashoffset:0" |
| 219 | id="rect3860" | 219 | id="rect3860" |
| 220 | width="62.000004" | 220 | width="62.000004" |
| 221 | height="62.000004" | 221 | height="62.000004" |
| 222 | x="297" | 222 | x="297" |
| 223 | - y="869.36218" /> | 223 | + y="883.36218" /> |
| 224 | <text | 224 | <text |
| 225 | xml:space="preserve" | 225 | xml:space="preserve" |
| 226 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 226 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 227 | x="328.6709" | 227 | x="328.6709" |
| 228 | - y="908.36218" | 228 | + y="922.36218" |
| 229 | id="text3828" | 229 | id="text3828" |
| 230 | sodipodi:linespacing="125%"><tspan | 230 | sodipodi:linespacing="125%"><tspan |
| 231 | sodipodi:role="line" | 231 | sodipodi:role="line" |
| 232 | id="tspan3830" | 232 | id="tspan3830" |
| 233 | x="328.6709" | 233 | x="328.6709" |
| 234 | - y="908.36218">...</tspan></text> | 234 | + y="922.36218">...</tspan></text> |
| 235 | <text | 235 | <text |
| 236 | xml:space="preserve" | 236 | xml:space="preserve" |
| 237 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 237 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 238 | x="431.84863" | 238 | x="431.84863" |
| 239 | - y="823.69287" | 239 | + y="837.69287" |
| 240 | id="text3840" | 240 | id="text3840" |
| 241 | sodipodi:linespacing="125%"><tspan | 241 | sodipodi:linespacing="125%"><tspan |
| 242 | sodipodi:role="line" | 242 | sodipodi:role="line" |
| 243 | id="tspan3842" | 243 | id="tspan3842" |
| 244 | x="431.84863" | 244 | x="431.84863" |
| 245 | - y="823.69287" | 245 | + y="837.69287" |
| 246 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Commercial</tspan><tspan | 246 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Commercial</tspan><tspan |
| 247 | sodipodi:role="line" | 247 | sodipodi:role="line" |
| 248 | x="431.84863" | 248 | x="431.84863" |
| 249 | - y="846.19287" | 249 | + y="860.19287" |
| 250 | id="tspan5663" | 250 | id="tspan5663" |
| 251 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Wrapper</tspan></text> | 251 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Wrapper</tspan></text> |
| 252 | <text | 252 | <text |
| 253 | xml:space="preserve" | 253 | xml:space="preserve" |
| 254 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 254 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 255 | x="419.84863" | 255 | x="419.84863" |
| 256 | - y="678.81708" | 256 | + y="692.81708" |
| 257 | id="text3832" | 257 | id="text3832" |
| 258 | sodipodi:linespacing="125%"><tspan | 258 | sodipodi:linespacing="125%"><tspan |
| 259 | sodipodi:role="line" | 259 | sodipodi:role="line" |
| 260 | id="tspan3834" | 260 | id="tspan3834" |
| 261 | x="419.84863" | 261 | x="419.84863" |
| 262 | - y="678.81708" | 262 | + y="692.81708" |
| 263 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Commercial</tspan><tspan | 263 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Commercial</tspan><tspan |
| 264 | sodipodi:role="line" | 264 | sodipodi:role="line" |
| 265 | x="419.84863" | 265 | x="419.84863" |
| 266 | - y="701.31708" | 266 | + y="715.31708" |
| 267 | id="tspan5661" | 267 | id="tspan5661" |
| 268 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Application</tspan></text> | 268 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">Application</tspan></text> |
| 269 | <rect | 269 | <rect |
| @@ -272,61 +272,61 @@ | @@ -272,61 +272,61 @@ | ||
| 272 | width="31.999998" | 272 | width="31.999998" |
| 273 | height="32" | 273 | height="32" |
| 274 | x="288" | 274 | x="288" |
| 275 | - y="945.36218" /> | 275 | + y="959.36218" /> |
| 276 | <rect | 276 | <rect |
| 277 | style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 8;stroke-dashoffset:0" | 277 | style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 8;stroke-dashoffset:0" |
| 278 | id="rect5411" | 278 | id="rect5411" |
| 279 | width="30" | 279 | width="30" |
| 280 | height="30" | 280 | height="30" |
| 281 | x="289" | 281 | x="289" |
| 282 | - y="994.36218" /> | 282 | + y="1008.3622" /> |
| 283 | <text | 283 | <text |
| 284 | xml:space="preserve" | 284 | xml:space="preserve" |
| 285 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 285 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 286 | x="326.41797" | 286 | x="326.41797" |
| 287 | - y="971.02234" | 287 | + y="985.02234" |
| 288 | id="text5512" | 288 | id="text5512" |
| 289 | sodipodi:linespacing="125%"><tspan | 289 | sodipodi:linespacing="125%"><tspan |
| 290 | sodipodi:role="line" | 290 | sodipodi:role="line" |
| 291 | id="tspan5514" | 291 | id="tspan5514" |
| 292 | x="326.41797" | 292 | x="326.41797" |
| 293 | - y="971.02234">Source Code</tspan></text> | 293 | + y="985.02234">Source Code</tspan></text> |
| 294 | <text | 294 | <text |
| 295 | xml:space="preserve" | 295 | xml:space="preserve" |
| 296 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 296 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 297 | x="70.417969" | 297 | x="70.417969" |
| 298 | - y="1017.37" | 298 | + y="1031.37" |
| 299 | id="text5516" | 299 | id="text5516" |
| 300 | sodipodi:linespacing="125%"><tspan | 300 | sodipodi:linespacing="125%"><tspan |
| 301 | sodipodi:role="line" | 301 | sodipodi:role="line" |
| 302 | id="tspan5518" | 302 | id="tspan5518" |
| 303 | x="70.417969" | 303 | x="70.417969" |
| 304 | - y="1017.37">Shared Library</tspan></text> | 304 | + y="1031.37">Shared Library</tspan></text> |
| 305 | <text | 305 | <text |
| 306 | xml:space="preserve" | 306 | xml:space="preserve" |
| 307 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 307 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 308 | x="71.8125" | 308 | x="71.8125" |
| 309 | - y="970.37" | 309 | + y="984.37" |
| 310 | id="text5520" | 310 | id="text5520" |
| 311 | sodipodi:linespacing="125%"><tspan | 311 | sodipodi:linespacing="125%"><tspan |
| 312 | sodipodi:role="line" | 312 | sodipodi:role="line" |
| 313 | id="tspan5522" | 313 | id="tspan5522" |
| 314 | x="71.8125" | 314 | x="71.8125" |
| 315 | - y="970.37">Application</tspan></text> | 315 | + y="984.37">Application</tspan></text> |
| 316 | <text | 316 | <text |
| 317 | xml:space="preserve" | 317 | xml:space="preserve" |
| 318 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 318 | style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 319 | x="325.64453" | 319 | x="325.64453" |
| 320 | - y="1017.37" | 320 | + y="1031.37" |
| 321 | id="text5524" | 321 | id="text5524" |
| 322 | sodipodi:linespacing="125%"><tspan | 322 | sodipodi:linespacing="125%"><tspan |
| 323 | sodipodi:role="line" | 323 | sodipodi:role="line" |
| 324 | id="tspan5526" | 324 | id="tspan5526" |
| 325 | x="325.64453" | 325 | x="325.64453" |
| 326 | - y="1017.37">Plugin</tspan><tspan | 326 | + y="1031.37">Plugin</tspan><tspan |
| 327 | sodipodi:role="line" | 327 | sodipodi:role="line" |
| 328 | x="325.64453" | 328 | x="325.64453" |
| 329 | - y="1047.37" | 329 | + y="1061.37" |
| 330 | id="tspan5528" /></text> | 330 | id="tspan5528" /></text> |
| 331 | <rect | 331 | <rect |
| 332 | style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" | 332 | style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" |
| @@ -334,64 +334,64 @@ | @@ -334,64 +334,64 @@ | ||
| 334 | width="32" | 334 | width="32" |
| 335 | height="32" | 335 | height="32" |
| 336 | x="32" | 336 | x="32" |
| 337 | - y="993.36218" /> | 337 | + y="1007.3622" /> |
| 338 | <rect | 338 | <rect |
| 339 | style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" | 339 | style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" |
| 340 | id="rect5641" | 340 | id="rect5641" |
| 341 | width="32" | 341 | width="32" |
| 342 | height="32" | 342 | height="32" |
| 343 | x="32" | 343 | x="32" |
| 344 | - y="945.36218" /> | 344 | + y="959.36218" /> |
| 345 | <rect | 345 | <rect |
| 346 | - y="869.36218" | 346 | + y="883.36218" |
| 347 | x="369" | 347 | x="369" |
| 348 | height="62.000004" | 348 | height="62.000004" |
| 349 | width="126" | 349 | width="126" |
| 350 | id="rect3923" | 350 | id="rect3923" |
| 351 | - style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:1.99999988000000006;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997000000018, 7.99999995000000030;stroke-dashoffset:0" /> | 351 | + style="fill:#ffffbf;fill-opacity:1;stroke:#000000;stroke-width:1.99999988;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999997, 7.99999995;stroke-dashoffset:0" /> |
| 352 | <text | 352 | <text |
| 353 | sodipodi:linespacing="125%" | 353 | sodipodi:linespacing="125%" |
| 354 | id="text3925" | 354 | id="text3925" |
| 355 | - y="895.08405" | 355 | + y="909.08405" |
| 356 | x="431.84863" | 356 | x="431.84863" |
| 357 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 357 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 358 | xml:space="preserve"><tspan | 358 | xml:space="preserve"><tspan |
| 359 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" | 359 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" |
| 360 | - y="895.08405" | 360 | + y="909.08405" |
| 361 | x="431.84863" | 361 | x="431.84863" |
| 362 | id="tspan3927" | 362 | id="tspan3927" |
| 363 | sodipodi:role="line">Commercial</tspan><tspan | 363 | sodipodi:role="line">Commercial</tspan><tspan |
| 364 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" | 364 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" |
| 365 | id="tspan3929" | 365 | id="tspan3929" |
| 366 | - y="917.58405" | 366 | + y="931.58405" |
| 367 | x="431.84863" | 367 | x="431.84863" |
| 368 | sodipodi:role="line">Library</tspan></text> | 368 | sodipodi:role="line">Library</tspan></text> |
| 369 | <rect | 369 | <rect |
| 370 | - y="653.36218" | 370 | + y="667.36218" |
| 371 | x="180" | 371 | x="180" |
| 372 | height="62" | 372 | height="62" |
| 373 | width="152" | 373 | width="152" |
| 374 | id="rect3937" | 374 | id="rect3937" |
| 375 | - style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:1.99999988000000006;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> | 375 | + style="fill:#fc8d59;fill-opacity:1;stroke:#000000;stroke-width:1.99999988;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> |
| 376 | <text | 376 | <text |
| 377 | sodipodi:linespacing="125%" | 377 | sodipodi:linespacing="125%" |
| 378 | id="text3939" | 378 | id="text3939" |
| 379 | - y="678.81708" | 379 | + y="692.81708" |
| 380 | x="256.83887" | 380 | x="256.83887" |
| 381 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 381 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 382 | xml:space="preserve"><tspan | 382 | xml:space="preserve"><tspan |
| 383 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" | 383 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" |
| 384 | - y="678.81708" | 384 | + y="692.81708" |
| 385 | x="256.83887" | 385 | x="256.83887" |
| 386 | id="tspan3941" | 386 | id="tspan3941" |
| 387 | sodipodi:role="line">Open Source</tspan><tspan | 387 | sodipodi:role="line">Open Source</tspan><tspan |
| 388 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" | 388 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans" |
| 389 | id="tspan3943" | 389 | id="tspan3943" |
| 390 | - y="701.31708" | 390 | + y="715.31708" |
| 391 | x="256.83887" | 391 | x="256.83887" |
| 392 | sodipodi:role="line">Application</tspan></text> | 392 | sodipodi:role="line">Application</tspan></text> |
| 393 | <rect | 393 | <rect |
| 394 | - y="797.36218" | 394 | + y="811.36218" |
| 395 | x="17" | 395 | x="17" |
| 396 | height="134" | 396 | height="134" |
| 397 | width="126" | 397 | width="126" |
| @@ -413,38 +413,27 @@ | @@ -413,38 +413,27 @@ | ||
| 413 | xml:space="preserve" | 413 | xml:space="preserve" |
| 414 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 414 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 415 | x="79.859375" | 415 | x="79.859375" |
| 416 | - y="859.6073" | 416 | + y="873.6073" |
| 417 | id="text3993" | 417 | id="text3993" |
| 418 | sodipodi:linespacing="125%"><tspan | 418 | sodipodi:linespacing="125%"><tspan |
| 419 | sodipodi:role="line" | 419 | sodipodi:role="line" |
| 420 | x="79.859375" | 420 | x="79.859375" |
| 421 | - y="859.6073" | 421 | + y="873.6073" |
| 422 | id="tspan4025">Core</tspan><tspan | 422 | id="tspan4025">Core</tspan><tspan |
| 423 | sodipodi:role="line" | 423 | sodipodi:role="line" |
| 424 | x="79.859375" | 424 | x="79.859375" |
| 425 | - y="882.1073" | 425 | + y="896.1073" |
| 426 | id="tspan3960">Framework</tspan><tspan | 426 | id="tspan3960">Framework</tspan><tspan |
| 427 | sodipodi:role="line" | 427 | sodipodi:role="line" |
| 428 | x="79.859375" | 428 | x="79.859375" |
| 429 | - y="904.6073" | 429 | + y="918.6073" |
| 430 | id="tspan4023" /><tspan | 430 | id="tspan4023" /><tspan |
| 431 | sodipodi:role="line" | 431 | sodipodi:role="line" |
| 432 | x="79.859375" | 432 | x="79.859375" |
| 433 | - y="927.1073" | 433 | + y="941.1073" |
| 434 | id="tspan4015" /></text> | 434 | id="tspan4015" /></text> |
| 435 | <text | 435 | <text |
| 436 | xml:space="preserve" | 436 | xml:space="preserve" |
| 437 | - style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:0.50196078;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | ||
| 438 | - x="158.38187" | ||
| 439 | - y="1047.0341" | ||
| 440 | - id="text4017" | ||
| 441 | - sodipodi:linespacing="125%"><tspan | ||
| 442 | - sodipodi:role="line" | ||
| 443 | - id="tspan4019" | ||
| 444 | - x="158.38187" | ||
| 445 | - y="1047.0341">www.openbiometrics.org</tspan></text> | ||
| 446 | - <text | ||
| 447 | - xml:space="preserve" | ||
| 448 | style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" | 437 | style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" |
| 449 | x="-44.054493" | 438 | x="-44.054493" |
| 450 | y="241.09709" | 439 | y="241.09709" |
| @@ -456,14 +445,14 @@ | @@ -456,14 +445,14 @@ | ||
| 456 | x="-44.054493" | 445 | x="-44.054493" |
| 457 | y="241.09709" /></text> | 446 | y="241.09709" /></text> |
| 458 | <rect | 447 | <rect |
| 459 | - y="797.36212" | 448 | + y="811.36212" |
| 460 | x="153" | 449 | x="153" |
| 461 | height="62" | 450 | height="62" |
| 462 | width="62" | 451 | width="62" |
| 463 | id="rect3974" | 452 | id="rect3974" |
| 464 | - style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999987999999984, 7.99999977999999867;stroke-dashoffset:0" /> | 453 | + style="fill:#99d59e;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.99999988, 7.99999978;stroke-dashoffset:0" /> |
| 465 | <rect | 454 | <rect |
| 466 | - y="869.36218" | 455 | + y="883.36218" |
| 467 | x="153" | 456 | x="153" |
| 468 | height="62" | 457 | height="62" |
| 469 | width="62" | 458 | width="62" |
| @@ -472,22 +461,22 @@ | @@ -472,22 +461,22 @@ | ||
| 472 | <text | 461 | <text |
| 473 | sodipodi:linespacing="125%" | 462 | sodipodi:linespacing="125%" |
| 474 | id="text3978" | 463 | id="text3978" |
| 475 | - y="836.1073" | 464 | + y="850.1073" |
| 476 | x="183.11035" | 465 | x="183.11035" |
| 477 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 466 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 478 | xml:space="preserve"><tspan | 467 | xml:space="preserve"><tspan |
| 479 | - y="836.1073" | 468 | + y="850.1073" |
| 480 | x="183.11035" | 469 | x="183.11035" |
| 481 | id="tspan3980" | 470 | id="tspan3980" |
| 482 | sodipodi:role="line">PCA</tspan></text> | 471 | sodipodi:role="line">PCA</tspan></text> |
| 483 | <text | 472 | <text |
| 484 | sodipodi:linespacing="125%" | 473 | sodipodi:linespacing="125%" |
| 485 | id="text3982" | 474 | id="text3982" |
| 486 | - y="908.36218" | 475 | + y="922.36218" |
| 487 | x="183.64453" | 476 | x="183.64453" |
| 488 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" | 477 | style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" |
| 489 | xml:space="preserve"><tspan | 478 | xml:space="preserve"><tspan |
| 490 | - y="908.36218" | 479 | + y="922.36218" |
| 491 | x="183.64453" | 480 | x="183.64453" |
| 492 | id="tspan3984" | 481 | id="tspan3984" |
| 493 | sodipodi:role="line">LDA</tspan></text> | 482 | sodipodi:role="line">LDA</tspan></text> |
share/openbr/openbr.bib
| @@ -104,7 +104,6 @@ | @@ -104,7 +104,6 @@ | ||
| 104 | number={12}, | 104 | number={12}, |
| 105 | pages={2037--2041}, | 105 | pages={2037--2041}, |
| 106 | year={2006}, | 106 | year={2006}, |
| 107 | - publisher={IEEE} | ||
| 108 | } | 107 | } |
| 109 | 108 | ||
| 110 | @article{belhumeur1997eigenfaces, | 109 | @article{belhumeur1997eigenfaces, |
| @@ -115,11 +114,10 @@ | @@ -115,11 +114,10 @@ | ||
| 115 | number={7}, | 114 | number={7}, |
| 116 | pages={711--720}, | 115 | pages={711--720}, |
| 117 | year={1997}, | 116 | year={1997}, |
| 118 | - publisher={IEEE} | ||
| 119 | } | 117 | } |
| 120 | 118 | ||
| 121 | @incollection{bolme2003csu, | 119 | @incollection{bolme2003csu, |
| 122 | - title={The CSU face identification evaluation system: its purpose, features, and structure}, | 120 | + title={The {CSU} face identification evaluation system: its purpose, features, and structure}, |
| 123 | author={Bolme, David S and Beveridge, J Ross and Teixeira, Marcio and Draper, Bruce A}, | 121 | author={Bolme, David S and Beveridge, J Ross and Teixeira, Marcio and Draper, Bruce A}, |
| 124 | booktitle={Computer Vision Systems}, | 122 | booktitle={Computer Vision Systems}, |
| 125 | pages={304--313}, | 123 | pages={304--313}, |
| @@ -132,8 +130,6 @@ | @@ -132,8 +130,6 @@ | ||
| 132 | author={Bolme, David S and Draper, Bruce A and Beveridge, J Ross}, | 130 | author={Bolme, David S and Draper, Bruce A and Beveridge, J Ross}, |
| 133 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2009}, | 131 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2009}, |
| 134 | pages={2105--2112}, | 132 | pages={2105--2112}, |
| 135 | - year={2009}, | ||
| 136 | - organization={IEEE} | ||
| 137 | } | 133 | } |
| 138 | 134 | ||
| 139 | @article{bradski2000opencv, | 135 | @article{bradski2000opencv, |
| @@ -150,10 +146,8 @@ | @@ -150,10 +146,8 @@ | ||
| 150 | @inproceedings{cao2010face, | 146 | @inproceedings{cao2010face, |
| 151 | title={Face recognition with learning-based descriptor}, | 147 | title={Face recognition with learning-based descriptor}, |
| 152 | author={Cao, Zhimin and Yin, Qi and Tang, Xiaoou and Sun, Jian}, | 148 | author={Cao, Zhimin and Yin, Qi and Tang, Xiaoou and Sun, Jian}, |
| 153 | - booktitle={Computer Vision and Pattern Recognition (CVPR), 2010 IEEE Conference on}, | 149 | + booktitle={IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), 2010}, |
| 154 | pages={2707--2714}, | 150 | pages={2707--2714}, |
| 155 | - year={2010}, | ||
| 156 | - organization={IEEE} | ||
| 157 | } | 151 | } |
| 158 | 152 | ||
| 159 | @misc{founds2011nist, | 153 | @misc{founds2011nist, |
| @@ -229,10 +223,8 @@ | @@ -229,10 +223,8 @@ | ||
| 229 | @inproceedings{klare2011aging, | 223 | @inproceedings{klare2011aging, |
| 230 | title={Face recognition across time lapse: On learning feature subspaces}, | 224 | title={Face recognition across time lapse: On learning feature subspaces}, |
| 231 | author={Klare, Brendan and Jain, Anil K}, | 225 | author={Klare, Brendan and Jain, Anil K}, |
| 232 | - booktitle={Biometrics (IJCB), 2011 International Joint Conference on}, | 226 | + booktitle={IEEE International Joint Conf. on Biometrics (IJCB), 2011}, |
| 233 | pages={1--8}, | 227 | pages={1--8}, |
| 234 | - year={2011}, | ||
| 235 | - organization={IEEE} | ||
| 236 | } | 228 | } |
| 237 | 229 | ||
| 238 | @inproceedings{li2009hfb, | 230 | @inproceedings{li2009hfb, |
| @@ -240,17 +232,24 @@ | @@ -240,17 +232,24 @@ | ||
| 240 | author={Li, Stan Z and Lei, Zhen and Ao, Meng}, | 232 | author={Li, Stan Z and Lei, Zhen and Ao, Meng}, |
| 241 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition Workshops, 2009}, | 233 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition Workshops, 2009}, |
| 242 | pages={1--8}, | 234 | pages={1--8}, |
| 243 | - year={2009}, | ||
| 244 | - organization={IEEE} | 235 | +} |
| 236 | + | ||
| 237 | +@article{lowe2004distinctive, | ||
| 238 | + title={Distinctive image features from scale-invariant keypoints}, | ||
| 239 | + author={Lowe, David G}, | ||
| 240 | + journal={International journal of computer vision}, | ||
| 241 | + volume={60}, | ||
| 242 | + number={2}, | ||
| 243 | + pages={91--110}, | ||
| 244 | + year={2004}, | ||
| 245 | + publisher={Springer} | ||
| 245 | } | 246 | } |
| 246 | 247 | ||
| 247 | @inproceedings{lui2012preliminary, | 248 | @inproceedings{lui2012preliminary, |
| 248 | title={Preliminary studies on the Good, the Bad, and the Ugly face recognition challenge problem}, | 249 | title={Preliminary studies on the Good, the Bad, and the Ugly face recognition challenge problem}, |
| 249 | author={Lui, Yui Man and Bolme, D and Phillips, PJ and Beveridge, JR and Draper, BA}, | 250 | author={Lui, Yui Man and Bolme, D and Phillips, PJ and Beveridge, JR and Draper, BA}, |
| 250 | - booktitle={Computer Vision and Pattern Recognition Workshops (CVPRW), 2012 IEEE Computer Society Conference on}, | ||
| 251 | - pages={9--16}, | ||
| 252 | - year={2012}, | ||
| 253 | - organization={IEEE} | 251 | + booktitle={IEEE Computer Society Conf. on Computer Vision and Pattern Recognition Workshops (CVPRW), 2012 }, |
| 252 | + pages={9--16} | ||
| 254 | } | 253 | } |
| 255 | 254 | ||
| 256 | @article{meyers2008using, | 255 | @article{meyers2008using, |
| @@ -274,7 +273,7 @@ | @@ -274,7 +273,7 @@ | ||
| 274 | } | 273 | } |
| 275 | 274 | ||
| 276 | @article{phillips2000feret, | 275 | @article{phillips2000feret, |
| 277 | - title={The FERET evaluation methodology for face-recognition algorithms}, | 276 | + title={The {FERET} evaluation methodology for face-recognition algorithms}, |
| 278 | author={Phillips, P. Jonathon and Moon, Hyeonjoon and Rizvi, Syed A. and Rauss, Patrick J.}, | 277 | author={Phillips, P. Jonathon and Moon, Hyeonjoon and Rizvi, Syed A. and Rauss, Patrick J.}, |
| 279 | journal={IEEE Trans. on Pattern Analysis and Machine Intelligence}, | 278 | journal={IEEE Trans. on Pattern Analysis and Machine Intelligence}, |
| 280 | volume={22}, | 279 | volume={22}, |
| @@ -287,10 +286,8 @@ | @@ -287,10 +286,8 @@ | ||
| 287 | @inproceedings{phillips2011introduction, | 286 | @inproceedings{phillips2011introduction, |
| 288 | title={An introduction to the good, the bad, \& the ugly face recognition challenge problem}, | 287 | title={An introduction to the good, the bad, \& the ugly face recognition challenge problem}, |
| 289 | author={Phillips, P Jonathon and Beveridge, J Ross and Draper, Bruce A and Givens, Geof and O'Toole, Alice J and Bolme, David S and Dunlop, Joseph and Lui, Yui Man and Sahibzada, Hassan and Weimer, Samuel}, | 288 | author={Phillips, P Jonathon and Beveridge, J Ross and Draper, Bruce A and Givens, Geof and O'Toole, Alice J and Bolme, David S and Dunlop, Joseph and Lui, Yui Man and Sahibzada, Hassan and Weimer, Samuel}, |
| 290 | - booktitle={Automatic Face \& Gesture Recognition and Workshops (FG 2011), 2011 IEEE International Conference on}, | 289 | + booktitle={IEEE International Conf. on Automatic Face \& Gesture Recognition (FG) Workshops, 2011}, |
| 291 | pages={346--353}, | 290 | pages={346--353}, |
| 292 | - year={2011}, | ||
| 293 | - organization={IEEE} | ||
| 294 | } | 291 | } |
| 295 | 292 | ||
| 296 | @inproceedings{phillips2005overview, | 293 | @inproceedings{phillips2005overview, |
| @@ -299,14 +296,12 @@ | @@ -299,14 +296,12 @@ | ||
| 299 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2005}, | 296 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2005}, |
| 300 | volume={1}, | 297 | volume={1}, |
| 301 | pages={947--954}, | 298 | pages={947--954}, |
| 302 | - year={2005}, | ||
| 303 | - organization={IEEE} | ||
| 304 | } | 299 | } |
| 305 | 300 | ||
| 306 | @article{tan2010enhanced, | 301 | @article{tan2010enhanced, |
| 307 | title={Enhanced local texture feature sets for face recognition under difficult lighting conditions}, | 302 | title={Enhanced local texture feature sets for face recognition under difficult lighting conditions}, |
| 308 | author={Tan, Xiaoyang and Triggs, Bill}, | 303 | author={Tan, Xiaoyang and Triggs, Bill}, |
| 309 | - journal={Image Processing, IEEE Transactions on}, | 304 | + journal={IEEE Trans. on Image Processing}, |
| 310 | volume={19}, | 305 | volume={19}, |
| 311 | number={6}, | 306 | number={6}, |
| 312 | pages={1635--1650}, | 307 | pages={1635--1650}, |
| @@ -359,9 +354,7 @@ | @@ -359,9 +354,7 @@ | ||
| 359 | author={Wang, Xiaogang and Tang, Xiaoou}, | 354 | author={Wang, Xiaogang and Tang, Xiaoou}, |
| 360 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2004}, | 355 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2004}, |
| 361 | volume={2}, | 356 | volume={2}, |
| 362 | - pages={II--259}, | ||
| 363 | - year={2004}, | ||
| 364 | - organization={IEEE} | 357 | + pages={II--259} |
| 365 | } | 358 | } |
| 366 | 359 | ||
| 367 | @article{wang2009face, | 360 | @article{wang2009face, |
| @@ -378,10 +371,8 @@ | @@ -378,10 +371,8 @@ | ||
| 378 | @inproceedings{yang2011articulated, | 371 | @inproceedings{yang2011articulated, |
| 379 | title={Articulated pose estimation with flexible mixtures-of-parts}, | 372 | title={Articulated pose estimation with flexible mixtures-of-parts}, |
| 380 | author={Yang, Yi and Ramanan, Deva}, | 373 | author={Yang, Yi and Ramanan, Deva}, |
| 381 | - booktitle={Computer Vision and Pattern Recognition (CVPR), 2011 IEEE Conference on}, | 374 | + booktitle={IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), 2011}, |
| 382 | pages={1385--1392}, | 375 | pages={1385--1392}, |
| 383 | - year={2011}, | ||
| 384 | - organization={IEEE} | ||
| 385 | } | 376 | } |
| 386 | 377 | ||
| 387 | @article{yu2001direct, | 378 | @article{yu2001direct, |
| @@ -399,7 +390,5 @@ | @@ -399,7 +390,5 @@ | ||
| 399 | title={Coupled information-theoretic encoding for face photo-sketch recognition}, | 390 | title={Coupled information-theoretic encoding for face photo-sketch recognition}, |
| 400 | author={Zhang, Wei and Wang, Xiaogang and Tang, Xiaoou}, | 391 | author={Zhang, Wei and Wang, Xiaogang and Tang, Xiaoou}, |
| 401 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2011}, | 392 | booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2011}, |
| 402 | - pages={513--520}, | ||
| 403 | - year={2011}, | ||
| 404 | - organization={IEEE} | 393 | + pages={513--520} |
| 405 | } | 394 | } |