Commit 0be609a0397b786f1935f4a20238d2a981541456
Documentation typo
Showing
11 changed files
with
238 additions
and
248 deletions
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 &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 &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 &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<File> |
| 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<Template> |
| 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<_Abstraction,_Implementation> FactoryInstance<_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 &</tspan><tspan | |
| 139 | + y="764.23242">Qt &</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 | } | ... | ... |