Commit 0be609a0397b786f1935f4a20238d2a981541456

Authored by Scott Klum
2 parents 91c585cf 538f8840

Documentation typo

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 &amp;stream) @@ -634,62 +633,73 @@ void Object::load(QDataStream &amp;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 &amp;string, char split) @@ -702,42 +712,27 @@ QStringList Object::parse(const QString &amp;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 &amp;file_) @@ -747,20 +742,16 @@ void Object::init(const File &amp;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&lt;File&gt; @@ -298,7 +307,7 @@ struct BR_EXPORT FileList : public QList&lt;File&gt;
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&lt;Template&gt; @@ -489,9 +498,7 @@ struct TemplateList : public QList&lt;Template&gt;
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&lt;_Abstraction,_Implementation&gt; FactoryInstance&lt;_Abstraction @@ -858,7 +865,7 @@ const FactoryInstance&lt;_Abstraction,_Implementation&gt; FactoryInstance&lt;_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 &amp;</tspan><tspan 139 + y="764.23242">Qt &amp;</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 }