Commit 0be609a0397b786f1935f4a20238d2a981541456

Authored by Scott Klum
2 parents 91c585cf 538f8840

Documentation typo

CMakeLists.txt
... ... @@ -121,7 +121,7 @@ endif()
121 121  
122 122 # Install
123 123 install(FILES CHANGELOG.md LICENSE.txt README.md DESTINATION .)
124   -install(DIRECTORY data share DESTINATION .)
  124 +install(DIRECTORY share DESTINATION .)
125 125 install(DIRECTORY ${BR_THIRDPARTY_SHARE} DESTINATION share)
126 126  
127 127 # Package
... ...
app/br/br.cpp
... ... @@ -24,9 +24,9 @@
24 24  
25 25 /*!
26 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 30 * Commands are designed to mirror the \ref c_sdk and are evaluated in the order they are entered.
31 31 * To get started, try running:
32 32 * \code
... ...
openbr/openbr.h
... ... @@ -25,7 +25,7 @@ extern "C" {
25 25  
26 26 /*!
27 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 30 * In order to provide a high-level interface that is usable from the command line and callable from other programming languages,
31 31 * the API is designed to operate at the "file system" level.
... ... @@ -300,6 +300,7 @@ BR_EXPORT float br_progress();
300 300 *
301 301 * Used by the \ref cli to implement \c -daemon, generally not useful otherwise.
302 302 * Guaranteed to return at least one argument.
  303 + * \param pipe Pipe name
303 304 * \param[out] argc argument count
304 305 * \param[out] argv argument list
305 306 * \note \ref managed_return_value
... ...
openbr/openbr_export.cpp
... ... @@ -17,22 +17,27 @@
17 17 /*!
18 18 * \mainpage
19 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 29 * \section get_started Get Started
30 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 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 42 * \section installation_from_source From Source
38 43 * Installation from source is the recommended method for getting OpenBR on your machine.
... ... @@ -101,7 +106,7 @@ $ br -help
101 106 * $ nmake install
102 107 * $ nmake clean
103 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 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 111 * -# <a href="http://www.microsoft.com/en-us/download/confirmation.aspx?id=6812">Download Direct X Software Developement Kit</a> and install.
107 112 * -# From the VS2012 x64 Cross Tools Command Prompt:
... ...
openbr/openbr_plugin.cpp
... ... @@ -25,13 +25,12 @@
25 25 #include <QtConcurrentRun>
26 26 #include <algorithm>
27 27 #include <iostream>
28   -#include <openbr/openbr_plugin.h>
29   -#include <openbr/plugins/openbr_internal.h>
30 28  
31 29 #ifndef BR_EMBEDDED
32 30 #include <QApplication>
33 31 #endif
34 32  
  33 +#include "openbr_plugin.h"
35 34 #include "version.h"
36 35 #include "core/bee.h"
37 36 #include "core/common.h"
... ... @@ -634,62 +633,73 @@ void Object::load(QDataStream &amp;stream)
634 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 638 QString type;
640 639 int index = metaObject()->indexOfProperty(qPrintable(name));
641 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 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 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 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 687 } else {
670 688 qFatal("Unrecognized type: %s", qPrintable(type));
671 689 }
672 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 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 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 703 qFatal("Failed to set %s::%s to: %s",
694 704 metaObject()->className(), qPrintable(name), qPrintable(value.toString()));
695 705 }
... ... @@ -702,42 +712,27 @@ QStringList Object::parse(const QString &amp;string, char split)
702 712 /* Object - private methods */
703 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 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 733 setObjectName(name);
739 734  
740   - // Reset all properties
  735 + // Set properties to their default values
741 736 for (int i=0; i<metaObject()->propertyCount(); i++) {
742 737 QMetaProperty property = metaObject()->property(i);
743 738 if (property.isResettable())
... ... @@ -747,20 +742,16 @@ void Object::init(const File &amp;file_)
747 742  
748 743 foreach (QString key, file.localKeys()) {
749 744 const QVariant value = file.value(key);
750   - const QString valueString = value.toString();
751   -
752 745 if (key.startsWith(("_Arg"))) {
753 746 int argumentNumber = key.mid(4).toInt();
754 747 int targetIdx = argumentNumber + firstAvailablePropertyIdx;
755 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 750 continue;
758 751 }
759 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 757 init();
... ... @@ -1121,14 +1112,9 @@ Transform *Transform::make(QString str, QObject *parent)
1121 1112 Transform *transform = Factory<Transform>::make(f);
1122 1113  
1123 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 1120 transform->setParent(parent);
... ...
openbr/openbr_plugin.h
... ... @@ -44,7 +44,7 @@
44 44  
45 45 /*!
46 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 49 * \code
50 50 * #include <openbr/openbr_plugin.h>
... ... @@ -96,7 +96,7 @@ namespace br
96 96 *
97 97 * \b Example:<br>
98 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 101 #define BR_PROPERTY(TYPE,NAME,DEFAULT) \
102 102 TYPE NAME; \
... ... @@ -107,19 +107,28 @@ void reset_##NAME() { NAME = DEFAULT; }
107 107 /*!
108 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 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 118 * Files have a simple grammar that allow them to be converted to and from strings.
119 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 133 * The metadata keys \c Subject and \c Label have special significance in the system.
125 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 307 /*!
299 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 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 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 498 class BR_EXPORT Object : public QObject
490 499 {
491 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 503 public:
497 504 File file; /*!< \brief The file used to construct the plugin. */
... ... @@ -504,8 +511,7 @@ public:
504 511 QStringList arguments() const; /*!< \brief A string describing the values the object has. */
505 512 QString argument(int index) const; /*!< \brief A string value for the argument at the specified index. */
506 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 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 517 private:
... ... @@ -715,6 +721,7 @@ public:
715 721 * By default <tt>share/openbr/openbr.bib</tt> will be searched for relative to:
716 722 * -# The working directory
717 723 * -# The executable's location
  724 + * \param use_gui Create a QApplication instead of a QCoreApplication.
718 725 * \note Tiggers \em abort() on failure to locate <tt>share/openbr/openbr.bib</tt>.
719 726 * \note <a href="http://qt-project.org/">Qt</a> users should instead call this <i>after</i> initializing QApplication.
720 727 * \see finalize
... ... @@ -858,7 +865,7 @@ const FactoryInstance&lt;_Abstraction,_Implementation&gt; FactoryInstance&lt;_Abstraction
858 865 *
859 866 * \b Example:<br>
860 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 870 #define BR_REGISTER(ABSTRACTION,IMPLEMENTATION) \
864 871 template class \
... ...
openbr/plugins/gallery.cpp
... ... @@ -14,6 +14,7 @@
14 14 * limitations under the License. *
15 15 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
16 16  
  17 +#include <QRegularExpression>
17 18 #include <QtConcurrentRun>
18 19 #ifndef BR_EMBEDDED
19 20 #include <QNetworkAccessManager>
... ... @@ -128,10 +129,13 @@ BR_REGISTER(Gallery, galGallery)
128 129 * \ingroup galleries
129 130 * \brief Reads/writes templates to/from folders.
130 131 * \author Josh Klontz \cite jklontz
  132 + * \param regexp An optional regular expression to match against the files extension.
131 133 */
132 134 class EmptyGallery : public Gallery
133 135 {
134 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 140 void init()
137 141 {
... ... @@ -160,6 +164,13 @@ class EmptyGallery : public Gallery
160 164 foreach (const QString &fileName, QtUtils::getFiles(file.name, false))
161 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 174 return templates;
164 175 }
165 176  
... ...
openbr/plugins/quality.cpp
... ... @@ -181,8 +181,9 @@ class MatchProbabilityDistance : public Distance
181 181 float compare(const Template &target, const Template &query) const
182 182 {
183 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 189 void store(QDataStream &stream) const
... ...
share/openbr/Doxyfile.in
... ... @@ -130,7 +130,7 @@ FULL_PATH_NAMES = YES
130 130 # relative paths, which will be relative from the directory where doxygen is
131 131 # started.
132 132  
133   -STRIP_FROM_PATH = ${CMAKE_CURRENT_SOURCE_DIR}
  133 +STRIP_FROM_PATH = ${CMAKE_SOURCE_DIR}
134 134  
135 135 # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
136 136 # the path mentioned in the documentation of a class, which tells
... ... @@ -661,9 +661,8 @@ WARN_LOGFILE =
661 661 # directories like "/usr/src/myproject". Separate the files or directories
662 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 667 # This tag can be used to specify the character encoding of the source files
669 668 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
... ... @@ -681,8 +680,7 @@ INPUT_ENCODING = UTF-8
681 680 # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
682 681 # *.f90 *.f *.for *.vhd *.vhdl
683 682  
684   -FILE_PATTERNS = *.h \
685   - *.cpp
  683 +FILE_PATTERNS = *.h *.cpp
686 684  
687 685 # The RECURSIVE tag can be used to turn specify whether or not subdirectories
688 686 # should be searched for input files as well. Possible values are YES and NO.
... ... @@ -710,7 +708,9 @@ EXCLUDE_SYMLINKS = YES
710 708 # against the file with absolute path, so to exclude all test directories
711 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 715 # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
716 716 # (namespaces, classes, functions, etc.) that should be excluded from the
... ... @@ -733,7 +733,8 @@ EXCLUDE_SYMBOLS = br::FactoryInstance \
733 733 # directories that contain example code fragments that are included (see
734 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 739 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
739 740 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
... ... @@ -754,7 +755,7 @@ EXAMPLE_RECURSIVE = YES
754 755 # directories that contain image that are included in the documentation (see
755 756 # the \image command).
756 757  
757   -IMAGE_PATH =
  758 +IMAGE_PATH = ${CMAKE_SOURCE_DIR}
758 759  
759 760 # The INPUT_FILTER tag can be used to specify a program that doxygen should
760 761 # invoke to filter for each input file. Doxygen will invoke the filter program
... ... @@ -1245,13 +1246,13 @@ SERVER_BASED_SEARCH = NO
1245 1246 # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
1246 1247 # generate Latex output.
1247 1248  
1248   -GENERATE_LATEX = YES
  1249 +GENERATE_LATEX = NO
1249 1250  
1250 1251 # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
1251 1252 # If a relative path is entered the value of OUTPUT_DIRECTORY will be
1252 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 1257 # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
1257 1258 # invoked. If left blank `latex' will be used as the default command name.
... ... @@ -1538,7 +1539,7 @@ INCLUDE_FILE_PATTERNS =
1538 1539 # undefined via #undef or recursively expanded use the := operator
1539 1540 # instead of the = operator.
1540 1541  
1541   -PREDEFINED = BR_EXPORT=
  1542 +PREDEFINED = BR_EXPORT= __cplusplus
1542 1543  
1543 1544 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
1544 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 11 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12 12 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13 13 width="512"
14   - height="416"
  14 + height="400"
15 15 id="svg2"
16 16 version="1.1"
17 17 inkscape:version="0.48.2 r9819"
... ... @@ -40,12 +40,12 @@
40 40 inkscape:pageshadow="2"
41 41 inkscape:zoom="1.1446731"
42 42 inkscape:cx="160.23068"
43   - inkscape:cy="221.30937"
  43 + inkscape:cy="162.70186"
44 44 inkscape:document-units="px"
45 45 inkscape:current-layer="layer1"
46 46 showgrid="false"
47   - inkscape:window-width="1386"
48   - inkscape:window-height="856"
  47 + inkscape:window-width="1280"
  48 + inkscape:window-height="756"
49 49 inkscape:window-x="54"
50 50 inkscape:window-y="0"
51 51 inkscape:window-maximized="0" />
... ... @@ -65,30 +65,30 @@
65 65 inkscape:label="Layer 1"
66 66 inkscape:groupmode="layer"
67 67 id="layer1"
68   - transform="translate(0,-636.36218)">
  68 + transform="translate(0,-652.36218)">
69 69 <path
70 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 72 id="rect3169"
73 73 inkscape:connector-curvature="0"
74 74 sodipodi:nodetypes="ccccccccc" />
75 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 77 id="rect5563"
78 78 width="153"
79 79 height="62"
80 80 x="342"
81   - y="653.36218" />
  81 + y="667.36218" />
82 82 <rect
83 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 84 id="rect2985"
85 85 width="153"
86 86 height="62"
87 87 x="17"
88   - y="653.36218" />
  88 + y="667.36218" />
89 89 <path
90 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 92 id="rect2989"
93 93 inkscape:connector-curvature="0"
94 94 sodipodi:nodetypes="ccccccccc" />
... ... @@ -96,24 +96,24 @@
96 96 xml:space="preserve"
97 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 98 x="70.554688"
99   - y="699.79578"
  99 + y="713.79578"
100 100 id="text2995"
101 101 sodipodi:linespacing="125%"><tspan
102 102 sodipodi:role="line"
103 103 id="tspan2997"
104 104 x="70.554688"
105   - y="699.79578">br</tspan></text>
  105 + y="713.79578">br</tspan></text>
106 106 <text
107 107 xml:space="preserve"
108 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 109 x="122.3311"
110   - y="770.04187"
  110 + y="784.04187"
111 111 id="text3003"
112 112 sodipodi:linespacing="125%"><tspan
113 113 sodipodi:role="line"
114 114 id="tspan3005"
115 115 x="122.3311"
116   - y="770.04187">OpenBR</tspan></text>
  116 + y="784.04187">OpenBR</tspan></text>
117 117 <text
118 118 xml:space="preserve"
119 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 130 xml:space="preserve"
131 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 132 x="453.27899"
133   - y="750.23242"
  133 + y="764.23242"
134 134 id="text3019"
135 135 sodipodi:linespacing="125%"><tspan
136 136 sodipodi:role="line"
137 137 id="tspan3021"
138 138 x="453.27899"
139   - y="750.23242">Qt &amp;</tspan><tspan
  139 + y="764.23242">Qt &amp;</tspan><tspan
140 140 sodipodi:role="line"
141 141 x="453.27899"
142   - y="772.73242"
  142 + y="786.73242"
143 143 id="tspan3945">OpenCV</tspan></text>
144 144 <text
145 145 xml:space="preserve"
... ... @@ -154,116 +154,116 @@
154 154 x="367.25104"
155 155 y="257.92224" /></text>
156 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 158 id="rect3848"
159 159 width="126"
160 160 height="62.000004"
161 161 x="369"
162   - y="797.36218" />
  162 + y="811.36218" />
163 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 165 id="rect3854"
166 166 width="62"
167 167 height="62"
168 168 x="225"
169   - y="797.36212" />
  169 + y="811.36212" />
170 170 <rect
171 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 172 id="rect3856"
173 173 width="62"
174 174 height="62"
175 175 x="225"
176   - y="869.36218" />
  176 + y="883.36218" />
177 177 <rect
178 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 179 id="rect3858"
180 180 width="61.999996"
181 181 height="62"
182 182 x="297"
183   - y="797.36218" />
  183 + y="811.36218" />
184 184 <text
185 185 xml:space="preserve"
186 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 187 x="255.84473"
188   - y="836.36218"
  188 + y="850.36218"
189 189 id="text3816"
190 190 sodipodi:linespacing="125%"><tspan
191 191 sodipodi:role="line"
192 192 id="tspan3818"
193 193 x="255.84473"
194   - y="836.36218">LBP</tspan></text>
  194 + y="850.36218">LBP</tspan></text>
195 195 <text
196 196 xml:space="preserve"
197 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 198 x="255.64453"
199   - y="908.1073"
  199 + y="922.1073"
200 200 id="text3820"
201 201 sodipodi:linespacing="125%"><tspan
202 202 sodipodi:role="line"
203 203 id="tspan3822"
204 204 x="255.64453"
205   - y="908.1073">HOG</tspan></text>
  205 + y="922.1073">HOG</tspan></text>
206 206 <text
207 207 xml:space="preserve"
208 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 209 x="327.84473"
210   - y="836.1073"
  210 + y="850.1073"
211 211 id="text3824"
212 212 sodipodi:linespacing="125%"><tspan
213 213 sodipodi:role="line"
214 214 id="tspan3826"
215 215 x="327.84473"
216   - y="836.1073">SVM</tspan></text>
  216 + y="850.1073">SVM</tspan></text>
217 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 219 id="rect3860"
220 220 width="62.000004"
221 221 height="62.000004"
222 222 x="297"
223   - y="869.36218" />
  223 + y="883.36218" />
224 224 <text
225 225 xml:space="preserve"
226 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 227 x="328.6709"
228   - y="908.36218"
  228 + y="922.36218"
229 229 id="text3828"
230 230 sodipodi:linespacing="125%"><tspan
231 231 sodipodi:role="line"
232 232 id="tspan3830"
233 233 x="328.6709"
234   - y="908.36218">...</tspan></text>
  234 + y="922.36218">...</tspan></text>
235 235 <text
236 236 xml:space="preserve"
237 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 238 x="431.84863"
239   - y="823.69287"
  239 + y="837.69287"
240 240 id="text3840"
241 241 sodipodi:linespacing="125%"><tspan
242 242 sodipodi:role="line"
243 243 id="tspan3842"
244 244 x="431.84863"
245   - y="823.69287"
  245 + y="837.69287"
246 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 247 sodipodi:role="line"
248 248 x="431.84863"
249   - y="846.19287"
  249 + y="860.19287"
250 250 id="tspan5663"
251 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 252 <text
253 253 xml:space="preserve"
254 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 255 x="419.84863"
256   - y="678.81708"
  256 + y="692.81708"
257 257 id="text3832"
258 258 sodipodi:linespacing="125%"><tspan
259 259 sodipodi:role="line"
260 260 id="tspan3834"
261 261 x="419.84863"
262   - y="678.81708"
  262 + y="692.81708"
263 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 264 sodipodi:role="line"
265 265 x="419.84863"
266   - y="701.31708"
  266 + y="715.31708"
267 267 id="tspan5661"
268 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 269 <rect
... ... @@ -272,61 +272,61 @@
272 272 width="31.999998"
273 273 height="32"
274 274 x="288"
275   - y="945.36218" />
  275 + y="959.36218" />
276 276 <rect
277 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 278 id="rect5411"
279 279 width="30"
280 280 height="30"
281 281 x="289"
282   - y="994.36218" />
  282 + y="1008.3622" />
283 283 <text
284 284 xml:space="preserve"
285 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 286 x="326.41797"
287   - y="971.02234"
  287 + y="985.02234"
288 288 id="text5512"
289 289 sodipodi:linespacing="125%"><tspan
290 290 sodipodi:role="line"
291 291 id="tspan5514"
292 292 x="326.41797"
293   - y="971.02234">Source Code</tspan></text>
  293 + y="985.02234">Source Code</tspan></text>
294 294 <text
295 295 xml:space="preserve"
296 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 297 x="70.417969"
298   - y="1017.37"
  298 + y="1031.37"
299 299 id="text5516"
300 300 sodipodi:linespacing="125%"><tspan
301 301 sodipodi:role="line"
302 302 id="tspan5518"
303 303 x="70.417969"
304   - y="1017.37">Shared Library</tspan></text>
  304 + y="1031.37">Shared Library</tspan></text>
305 305 <text
306 306 xml:space="preserve"
307 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 308 x="71.8125"
309   - y="970.37"
  309 + y="984.37"
310 310 id="text5520"
311 311 sodipodi:linespacing="125%"><tspan
312 312 sodipodi:role="line"
313 313 id="tspan5522"
314 314 x="71.8125"
315   - y="970.37">Application</tspan></text>
  315 + y="984.37">Application</tspan></text>
316 316 <text
317 317 xml:space="preserve"
318 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 319 x="325.64453"
320   - y="1017.37"
  320 + y="1031.37"
321 321 id="text5524"
322 322 sodipodi:linespacing="125%"><tspan
323 323 sodipodi:role="line"
324 324 id="tspan5526"
325 325 x="325.64453"
326   - y="1017.37">Plugin</tspan><tspan
  326 + y="1031.37">Plugin</tspan><tspan
327 327 sodipodi:role="line"
328 328 x="325.64453"
329   - y="1047.37"
  329 + y="1061.37"
330 330 id="tspan5528" /></text>
331 331 <rect
332 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 334 width="32"
335 335 height="32"
336 336 x="32"
337   - y="993.36218" />
  337 + y="1007.3622" />
338 338 <rect
339 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 340 id="rect5641"
341 341 width="32"
342 342 height="32"
343 343 x="32"
344   - y="945.36218" />
  344 + y="959.36218" />
345 345 <rect
346   - y="869.36218"
  346 + y="883.36218"
347 347 x="369"
348 348 height="62.000004"
349 349 width="126"
350 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 352 <text
353 353 sodipodi:linespacing="125%"
354 354 id="text3925"
355   - y="895.08405"
  355 + y="909.08405"
356 356 x="431.84863"
357 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 358 xml:space="preserve"><tspan
359 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 361 x="431.84863"
362 362 id="tspan3927"
363 363 sodipodi:role="line">Commercial</tspan><tspan
364 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 365 id="tspan3929"
366   - y="917.58405"
  366 + y="931.58405"
367 367 x="431.84863"
368 368 sodipodi:role="line">Library</tspan></text>
369 369 <rect
370   - y="653.36218"
  370 + y="667.36218"
371 371 x="180"
372 372 height="62"
373 373 width="152"
374 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 376 <text
377 377 sodipodi:linespacing="125%"
378 378 id="text3939"
379   - y="678.81708"
  379 + y="692.81708"
380 380 x="256.83887"
381 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 382 xml:space="preserve"><tspan
383 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 385 x="256.83887"
386 386 id="tspan3941"
387 387 sodipodi:role="line">Open Source</tspan><tspan
388 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 389 id="tspan3943"
390   - y="701.31708"
  390 + y="715.31708"
391 391 x="256.83887"
392 392 sodipodi:role="line">Application</tspan></text>
393 393 <rect
394   - y="797.36218"
  394 + y="811.36218"
395 395 x="17"
396 396 height="134"
397 397 width="126"
... ... @@ -413,38 +413,27 @@
413 413 xml:space="preserve"
414 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 415 x="79.859375"
416   - y="859.6073"
  416 + y="873.6073"
417 417 id="text3993"
418 418 sodipodi:linespacing="125%"><tspan
419 419 sodipodi:role="line"
420 420 x="79.859375"
421   - y="859.6073"
  421 + y="873.6073"
422 422 id="tspan4025">Core</tspan><tspan
423 423 sodipodi:role="line"
424 424 x="79.859375"
425   - y="882.1073"
  425 + y="896.1073"
426 426 id="tspan3960">Framework</tspan><tspan
427 427 sodipodi:role="line"
428 428 x="79.859375"
429   - y="904.6073"
  429 + y="918.6073"
430 430 id="tspan4023" /><tspan
431 431 sodipodi:role="line"
432 432 x="79.859375"
433   - y="927.1073"
  433 + y="941.1073"
434 434 id="tspan4015" /></text>
435 435 <text
436 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 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 438 x="-44.054493"
450 439 y="241.09709"
... ... @@ -456,14 +445,14 @@
456 445 x="-44.054493"
457 446 y="241.09709" /></text>
458 447 <rect
459   - y="797.36212"
  448 + y="811.36212"
460 449 x="153"
461 450 height="62"
462 451 width="62"
463 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 454 <rect
466   - y="869.36218"
  455 + y="883.36218"
467 456 x="153"
468 457 height="62"
469 458 width="62"
... ... @@ -472,22 +461,22 @@
472 461 <text
473 462 sodipodi:linespacing="125%"
474 463 id="text3978"
475   - y="836.1073"
  464 + y="850.1073"
476 465 x="183.11035"
477 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 467 xml:space="preserve"><tspan
479   - y="836.1073"
  468 + y="850.1073"
480 469 x="183.11035"
481 470 id="tspan3980"
482 471 sodipodi:role="line">PCA</tspan></text>
483 472 <text
484 473 sodipodi:linespacing="125%"
485 474 id="text3982"
486   - y="908.36218"
  475 + y="922.36218"
487 476 x="183.64453"
488 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 478 xml:space="preserve"><tspan
490   - y="908.36218"
  479 + y="922.36218"
491 480 x="183.64453"
492 481 id="tspan3984"
493 482 sodipodi:role="line">LDA</tspan></text>
... ...
share/openbr/openbr.bib
... ... @@ -104,7 +104,6 @@
104 104 number={12},
105 105 pages={2037--2041},
106 106 year={2006},
107   - publisher={IEEE}
108 107 }
109 108  
110 109 @article{belhumeur1997eigenfaces,
... ... @@ -115,11 +114,10 @@
115 114 number={7},
116 115 pages={711--720},
117 116 year={1997},
118   - publisher={IEEE}
119 117 }
120 118  
121 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 121 author={Bolme, David S and Beveridge, J Ross and Teixeira, Marcio and Draper, Bruce A},
124 122 booktitle={Computer Vision Systems},
125 123 pages={304--313},
... ... @@ -132,8 +130,6 @@
132 130 author={Bolme, David S and Draper, Bruce A and Beveridge, J Ross},
133 131 booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2009},
134 132 pages={2105--2112},
135   - year={2009},
136   - organization={IEEE}
137 133 }
138 134  
139 135 @article{bradski2000opencv,
... ... @@ -150,10 +146,8 @@
150 146 @inproceedings{cao2010face,
151 147 title={Face recognition with learning-based descriptor},
152 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 150 pages={2707--2714},
155   - year={2010},
156   - organization={IEEE}
157 151 }
158 152  
159 153 @misc{founds2011nist,
... ... @@ -229,10 +223,8 @@
229 223 @inproceedings{klare2011aging,
230 224 title={Face recognition across time lapse: On learning feature subspaces},
231 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 227 pages={1--8},
234   - year={2011},
235   - organization={IEEE}
236 228 }
237 229  
238 230 @inproceedings{li2009hfb,
... ... @@ -240,17 +232,24 @@
240 232 author={Li, Stan Z and Lei, Zhen and Ao, Meng},
241 233 booktitle={IEEE Conf. on Computer Vision and Pattern Recognition Workshops, 2009},
242 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 248 @inproceedings{lui2012preliminary,
248 249 title={Preliminary studies on the Good, the Bad, and the Ugly face recognition challenge problem},
249 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 255 @article{meyers2008using,
... ... @@ -274,7 +273,7 @@
274 273 }
275 274  
276 275 @article{phillips2000feret,
277   - title={The FERET evaluation methodology for face-recognition algorithms},
  276 + title={The {FERET} evaluation methodology for face-recognition algorithms},
278 277 author={Phillips, P. Jonathon and Moon, Hyeonjoon and Rizvi, Syed A. and Rauss, Patrick J.},
279 278 journal={IEEE Trans. on Pattern Analysis and Machine Intelligence},
280 279 volume={22},
... ... @@ -287,10 +286,8 @@
287 286 @inproceedings{phillips2011introduction,
288 287 title={An introduction to the good, the bad, \& the ugly face recognition challenge problem},
289 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 290 pages={346--353},
292   - year={2011},
293   - organization={IEEE}
294 291 }
295 292  
296 293 @inproceedings{phillips2005overview,
... ... @@ -299,14 +296,12 @@
299 296 booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2005},
300 297 volume={1},
301 298 pages={947--954},
302   - year={2005},
303   - organization={IEEE}
304 299 }
305 300  
306 301 @article{tan2010enhanced,
307 302 title={Enhanced local texture feature sets for face recognition under difficult lighting conditions},
308 303 author={Tan, Xiaoyang and Triggs, Bill},
309   - journal={Image Processing, IEEE Transactions on},
  304 + journal={IEEE Trans. on Image Processing},
310 305 volume={19},
311 306 number={6},
312 307 pages={1635--1650},
... ... @@ -359,9 +354,7 @@
359 354 author={Wang, Xiaogang and Tang, Xiaoou},
360 355 booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2004},
361 356 volume={2},
362   - pages={II--259},
363   - year={2004},
364   - organization={IEEE}
  357 + pages={II--259}
365 358 }
366 359  
367 360 @article{wang2009face,
... ... @@ -378,10 +371,8 @@
378 371 @inproceedings{yang2011articulated,
379 372 title={Articulated pose estimation with flexible mixtures-of-parts},
380 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 375 pages={1385--1392},
383   - year={2011},
384   - organization={IEEE}
385 376 }
386 377  
387 378 @article{yu2001direct,
... ... @@ -399,7 +390,5 @@
399 390 title={Coupled information-theoretic encoding for face photo-sketch recognition},
400 391 author={Zhang, Wei and Wang, Xiaogang and Tang, Xiaoou},
401 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 }
... ...