diff --git a/CMakeLists.txt b/CMakeLists.txt
index 64e45fe..62899a6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -121,7 +121,7 @@ endif()
# Install
install(FILES CHANGELOG.md LICENSE.txt README.md DESTINATION .)
-install(DIRECTORY data share DESTINATION .)
+install(DIRECTORY share DESTINATION .)
install(DIRECTORY ${BR_THIRDPARTY_SHARE} DESTINATION share)
# Package
diff --git a/app/br/br.cpp b/app/br/br.cpp
index 58b49dc..50204a8 100644
--- a/app/br/br.cpp
+++ b/app/br/br.cpp
@@ -24,9 +24,9 @@
/*!
* \defgroup cli Command Line Interface
- * \brief Command line application for running algorithms and evaluating results.
+ * \brief Command line wrapper of the \ref c_sdk.
*
- * The easiest and fastest way to leverage the project, we use it all the time!
+ * The easiest and fastest way to run algorithms and evaluating results, we use it all the time!
* Commands are designed to mirror the \ref c_sdk and are evaluated in the order they are entered.
* To get started, try running:
* \code
diff --git a/openbr/openbr.h b/openbr/openbr.h
index 0ba39bd..d4add7d 100644
--- a/openbr/openbr.h
+++ b/openbr/openbr.h
@@ -25,7 +25,7 @@ extern "C" {
/*!
* \defgroup c_sdk C SDK
- * \brief High-level API for running algorithms and evaluating results with wrappers available for other programming languages.
+ * \brief High-level API for running algorithms and evaluating results.
*
* In order to provide a high-level interface that is usable from the command line and callable from other programming languages,
* the API is designed to operate at the "file system" level.
@@ -300,6 +300,7 @@ BR_EXPORT float br_progress();
*
* Used by the \ref cli to implement \c -daemon, generally not useful otherwise.
* Guaranteed to return at least one argument.
+ * \param pipe Pipe name
* \param[out] argc argument count
* \param[out] argv argument list
* \note \ref managed_return_value
diff --git a/openbr/openbr_export.cpp b/openbr/openbr_export.cpp
index 3f3a9cc..0696346 100644
--- a/openbr/openbr_export.cpp
+++ b/openbr/openbr_export.cpp
@@ -17,22 +17,27 @@
/*!
* \mainpage
* \section overview Overview
- * OpenBR \cite openbr is a toolkit for biometric recognition and evaluation.
- * Supported use cases include training new recognition algorithms, interfacing with commercial systems, and measuring algorithm performance.
- * Free algorithms are also available for specific modalities including \ref cpp_face_recognition, \ref cpp_age_estimation, and \ref cpp_gender_estimation.
+ * 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.
+ * 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.
+ * Off-the-shelf algorithms are also available for specific modalities including \ref cpp_face_recognition, \ref cpp_age_estimation, and \ref cpp_gender_estimation.
*
- * There are three modules users may interact with:
- * - \ref cli - \copybrief cli
- * - \ref c_sdk - \copybrief c_sdk
- * - \ref cpp_plugin_sdk - \copybrief cpp_plugin_sdk
+ * OpenBR originated within The MITRE Corporation from a need to streamline the process of prototyping new algorithms.
+ * The project was later published as open source software under the Apache 2 license and is free for academic and commercial use.
+ *
+ * \image html "share/openbr/abstraction.svg" "The two principal software artifacts are the shared library 'openbr' and command line application 'br'."
*
* \section get_started Get Started
* - \ref installation - \copybrief installation
+ *
+ * \section learn_more Learn More
+ * - \ref cli - \copybrief cli
+ * - \ref c_sdk - \copybrief c_sdk
+ * - \ref cpp_plugin_sdk - \copybrief cpp_plugin_sdk
*/
/*!
* \page installation Installation
- * \brief A hacker's guide to building, editing, and running the project.
+ * \brief A hacker's guide to building, editing, and running OpenBR.
*
* \section installation_from_source From Source
* Installation from source is the recommended method for getting OpenBR on your machine.
@@ -101,7 +106,7 @@ $ br -help
* $ nmake install
* $ nmake clean
* \endcode
-* -# Download Qt 5.0.1 and unzip.
+ * -# Download Qt 5.0.1 and unzip.
* -# 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.
* -# Download Direct X Software Developement Kit and install.
* -# From the VS2012 x64 Cross Tools Command Prompt:
diff --git a/openbr/openbr_plugin.cpp b/openbr/openbr_plugin.cpp
index 284b0be..8e5a725 100644
--- a/openbr/openbr_plugin.cpp
+++ b/openbr/openbr_plugin.cpp
@@ -25,13 +25,12 @@
#include
#include
#include
-#include
-#include
#ifndef BR_EMBEDDED
#include
#endif
+#include "openbr_plugin.h"
#include "version.h"
#include "core/bee.h"
#include "core/common.h"
@@ -634,62 +633,73 @@ void Object::load(QDataStream &stream)
init();
}
-void Object::setProperty(const QString &name, const QString &value)
+void Object::setProperty(const QString &name, QVariant value)
{
QString type;
int index = metaObject()->indexOfProperty(qPrintable(name));
if (index != -1) type = metaObject()->property(index).typeName();
- else type = "";
- QVariant variant;
- if (type.startsWith("QList<") && type.endsWith(">")) {
- if (!value.startsWith('[')) qFatal("Expected a list.");
- const QStringList strings = parse(value.mid(1, value.size()-2));
+ if ((type.startsWith("QList<") && type.endsWith(">")) || (type == "QStringList")) {
+ QVariantList elements;
+ if (value.canConvert()) {
+ elements = value.value();
+ } else if (value.canConvert()) {
+ QString string = value.value();
+ if (!string.startsWith('[') || !string.endsWith(']'))
+ qFatal("Expected a list to start with '[' and end with 'brackets']'.");
+ foreach (const QString &element, parse(string.mid(1, string.size()-2)))
+ elements.append(element);
+ } else {
+ qFatal("Expected a list.");
+ }
- if (type == "QList") {
- QList values;
- foreach (const QString &string, strings)
- values.append(string.toFloat());
- variant.setValue(values);
+ if ((type == "QList") || (type == "QStringList")) {
+ QStringList parsedValues;
+ foreach (const QVariant &element, elements)
+ parsedValues.append(element.toString());
+ value.setValue(parsedValues);
+ } else if (type == "QList") {
+ QList parsedValues; bool ok;
+ foreach (const QVariant &element, elements) {
+ parsedValues.append(element.toFloat(&ok));
+ if (!ok) qFatal("Failed to convert element to floating point format.");
+ }
+ value.setValue(parsedValues);
} else if (type == "QList") {
- QList values;
- foreach (const QString &string, strings)
- values.append(string.toInt());
- variant.setValue(values);
+ QList parsedValues; bool ok;
+ foreach (const QVariant &element, elements) {
+ parsedValues.append(element.toInt(&ok));
+ if (!ok) qFatal("Failed to convert element to integer format.");
+ }
+ value.setValue(parsedValues);
} else if (type == "QList") {
- QList values;
- foreach (const QString &string, strings)
- values.append(Transform::make(string, this));
- variant.setValue(values);
+ QList parsedValues;
+ foreach (const QVariant &element, elements)
+ if (element.canConvert()) parsedValues.append(Transform::make(element.toString(), this));
+ else parsedValues.append(element.value());
+ value.setValue(parsedValues);
} else if (type == "QList") {
- QList values;
- foreach (const QString &string, strings)
- values.append(Distance::make(string, this));
- variant.setValue(values);
+ QList parsedValues;
+ foreach (const QVariant &element, elements)
+ if (element.canConvert()) parsedValues.append(Distance::make(element.toString(), this));
+ else parsedValues.append(element.value());
+ value.setValue(parsedValues);
} else {
qFatal("Unrecognized type: %s", qPrintable(type));
}
} else if (type == "br::Transform*") {
- variant.setValue(Transform::make(value, this));
+ if (value.canConvert())
+ value.setValue(Transform::make(value.toString(), this));
} else if (type == "br::Distance*") {
- variant.setValue(Distance::make(value, this));
- } else if (type == "QStringList") {
- variant.setValue(parse(value.mid(1, value.size()-2)));
+ if (value.canConvert())
+ value.setValue(Distance::make(value.toString(), this));
} else if (type == "bool") {
- if (value.isEmpty()) variant = true;
- else if (value == "false") variant = false;
- else if (value == "true") variant = true;
- else variant = value;
- } else {
- variant = value;
+ if (value.isNull()) value = true;
+ else if (value == "false") value = false;
+ else if (value == "true") value = true;
}
- setProperty(name, variant, !type.isEmpty());
-}
-
-void Object::setProperty(const QString &name, const QVariant &value, bool failOnError)
-{
- if (!QObject::setProperty(qPrintable(name), value) && failOnError)
+ if (!QObject::setProperty(qPrintable(name), value) && !type.isEmpty())
qFatal("Failed to set %s::%s to: %s",
metaObject()->className(), qPrintable(name), qPrintable(value.toString()));
}
@@ -702,42 +712,27 @@ QStringList Object::parse(const QString &string, char split)
/* Object - private methods */
void Object::init(const File &file_)
{
- this->file = file_;
-
- // Set name
- QString name = metaObject()->className();
- if (name.startsWith("br::")) name = name.right(name.size()-4);
+ file = file_;
- firstAvailablePropertyIdx = metaObject()->propertyCount();
-
- const QMetaObject * baseClass = metaObject();
- const QMetaObject * superClass = metaObject()->superClass();
-
- while (superClass != NULL) {
- const QMetaObject * nextClass = superClass->superClass();
-
- // baseClass <- something <- br::Object
- // baseClass is the highest class whose properties we can set via positional arguments
- if (nextClass && !strcmp(nextClass->className(),"br::Object")) {
+ // Determine interfaceName and firstAvailablePropertyIdx
+ QString interfaceName;
+ const QMetaObject *baseClass = metaObject();
+ while (true) {
+ if (!strcmp(baseClass->superClass()->className(), "br::Object") /* Special case for classes that inherit directly from br::Object */ ||
+ !strcmp(baseClass->superClass()->superClass()->className(), "br::Object") /* General case for plugins that inherit indirectly from br::Object */) {
firstAvailablePropertyIdx = baseClass->propertyOffset();
+ interfaceName = QString(baseClass->superClass()->className()).remove("br::");
+ break;
}
-
- QString superClassName = superClass->className();
-
- // strip br:: prefix from superclass name
- if (superClassName.startsWith("br::"))
- superClassName = superClassName.right(superClassName.size()-4);
-
- // Strip superclass name from base class name (e.g. PipeTransform -> Pipe)
- if (name.endsWith(superClassName))
- name = name.left(name.size() - superClassName.size());
- baseClass = superClass;
- superClass = superClass->superClass();
-
+ baseClass = baseClass->superClass();
}
+
+ // Strip interface name from object name (e.g. PipeTransform -> Pipe)
+ QString name = QString(metaObject()->className()).remove("br::");
+ if (name.endsWith(interfaceName)) name = name.left(name.size() - interfaceName.size());
setObjectName(name);
- // Reset all properties
+ // Set properties to their default values
for (int i=0; ipropertyCount(); i++) {
QMetaProperty property = metaObject()->property(i);
if (property.isResettable())
@@ -747,20 +742,16 @@ void Object::init(const File &file_)
foreach (QString key, file.localKeys()) {
const QVariant value = file.value(key);
- const QString valueString = value.toString();
-
if (key.startsWith(("_Arg"))) {
int argumentNumber = key.mid(4).toInt();
int targetIdx = argumentNumber + firstAvailablePropertyIdx;
if (targetIdx >= metaObject()->propertyCount()) {
- qWarning("too many arguments for transform %s, ignoring %s", qPrintable(objectName()), qPrintable(valueString));
+ qWarning("Too many arguments for object: %s, ignoring: %s", qPrintable(objectName()), qPrintable(value.toString()));
continue;
}
key = metaObject()->property(targetIdx).name();
}
-
- if (valueString.isEmpty()) setProperty(key, value); // Set the property directly
- else setProperty(key, valueString); // Parse the value first
+ setProperty(key, value);
}
init();
@@ -1121,14 +1112,9 @@ Transform *Transform::make(QString str, QObject *parent)
Transform *transform = Factory::make(f);
if (transform->independent) {
-// Transform *independentTransform = Factory::make(".Independent");
-// static_cast(independentTransform)->setProperty("transform", qVariantFromValue(transform));
-// independentTransform->init();
-// transform = independentTransform;
-
- File independent(".Independent");
- independent.set("transform", qVariantFromValue(transform));
- transform = Factory::make(independent);
+ File independent(".Independent");
+ independent.set("transform", qVariantFromValue(transform));
+ transform = Factory::make(independent);
}
transform->setParent(parent);
diff --git a/openbr/openbr_plugin.h b/openbr/openbr_plugin.h
index 9164e4c..430e7ab 100644
--- a/openbr/openbr_plugin.h
+++ b/openbr/openbr_plugin.h
@@ -44,7 +44,7 @@
/*!
* \defgroup cpp_plugin_sdk C++ Plugin SDK
- * \brief Plugin API for developing new algorithms.
+ * \brief Plugin API for extending OpenBR functionality.
*
* \code
* #include
@@ -96,7 +96,7 @@ namespace br
*
* \b Example:
* Note the symmetry between \c BR_PROPERTY and \c Q_PROPERTY.
- * \snippet sdk/plugins/misc.cpp example_transform
+ * \snippet openbr/plugins/misc.cpp example_transform
*/
#define BR_PROPERTY(TYPE,NAME,DEFAULT) \
TYPE NAME; \
@@ -107,19 +107,28 @@ void reset_##NAME() { NAME = DEFAULT; }
/*!
* \brief A file path with associated metadata.
*
- * The br::File is one of the workhorse classes in OpenBR.
+ * The File is one of two important data structures in OpenBR (the Template is the other).
* It is typically used to store the path to a file on disk with associated metadata.
- * The ability to associate a metadata map with the file helps keep the API simple and stable while providing customizable behavior when appropriate.
+ * The ability to associate a key/value metadata table with the file helps keep the API simple while providing customizable behavior.
*
- * When querying the value of a metadata key, the value will first try to be resolved using the file's private metadata.
- * If the key does not exist in the local map then it will be resolved using the properities in the global br::Context.
- * This has the desirable effect that file metadata may optionally be set globally using br::Context::set to operate on all files.
+ * When querying the value of a metadata key, the value will first try to be resolved against the file's private metadata table.
+ * If the key does not exist in its local table then it will be resolved against the properities in the global Context.
+ * By design file metadata may be set globally using Context::setProperty to operate on all files.
*
* Files have a simple grammar that allow them to be converted to and from strings.
* 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.
- * Fields within \c [] are expected to have the format [key1=value1, key2=value2, ..., keyN=valueN].
- * Fields within \c () are expected to have the format (value1, value2, ..., valueN) with the keys determined from the order of \c Q_PROPERTY.
- * The rest of the string is assigned to #name.
+ * By convention, fields within \c [] are expected to have the format [key1=value1, key2=value2, ..., keyN=valueN] where order is irrelevant.
+ * Fields within \c () are expected to have the format (value1, value2, ..., valueN) where order matters and the key context dependent.
+ * The left hand side of the string not parsed in a manner described above is assigned to #name.
+ *
+ * Values are not necessarily stored as strings in the metadata table.
+ * The system will attempt to infer and convert them to their "native" type.
+ * The conversion logic is as follows:
+ * -# 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.
+ * -# 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.
+ * -# 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.
+ * -# If the value is convertable to a floating point number then it is represented with \c float.
+ * -# Otherwise, it is represented with \c QString.
*
* The metadata keys \c Subject and \c Label have special significance in the system.
* \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
/*!
* \brief A list of matrices associated with a file.
*
- * The br::Template is one of the workhorse classes in OpenBR.
+ * The Template is one of two important data structures in OpenBR (the File is the other).
* 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.
*
* 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
class BR_EXPORT Object : public QObject
{
Q_OBJECT
-
- // Index of the first property that can be set via command line arguments
- int firstAvailablePropertyIdx;
+ int firstAvailablePropertyIdx; /*!< \brief Index of the first property that can be set via command line arguments. */
public:
File file; /*!< \brief The file used to construct the plugin. */
@@ -504,8 +511,7 @@ public:
QStringList arguments() const; /*!< \brief A string describing the values the object has. */
QString argument(int index) const; /*!< \brief A string value for the argument at the specified index. */
QString description() const; /*!< \brief Returns a string description of the object. */
- void setProperty(const QString &name, const QString &value); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */
- void setProperty(const QString &name, const QVariant &value, bool failOnError = false); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */
+ void setProperty(const QString &name, QVariant value); /*!< \brief Overload of QObject::setProperty to handle OpenBR data types. */
static QStringList parse(const QString &string, char split = ','); /*!< \brief Splits the string while respecting lexical scoping of (), [], \<\>, and {}. */
private:
@@ -715,6 +721,7 @@ public:
* By default share/openbr/openbr.bib will be searched for relative to:
* -# The working directory
* -# The executable's location
+ * \param use_gui Create a QApplication instead of a QCoreApplication.
* \note Tiggers \em abort() on failure to locate share/openbr/openbr.bib.
* \note Qt users should instead call this after initializing QApplication.
* \see finalize
@@ -858,7 +865,7 @@ const FactoryInstance<_Abstraction,_Implementation> FactoryInstance<_Abstraction
*
* \b Example:
* Note the use of \c Q_OBJECT at the beginning of the class declaration and \c BR_REGISTER after the class declaration.
- * \snippet sdk/plugins/misc.cpp example_transform
+ * \snippet openbr/plugins/misc.cpp example_transform
*/
#define BR_REGISTER(ABSTRACTION,IMPLEMENTATION) \
template class \
diff --git a/openbr/plugins/gallery.cpp b/openbr/plugins/gallery.cpp
index 30852f9..f21523a 100644
--- a/openbr/plugins/gallery.cpp
+++ b/openbr/plugins/gallery.cpp
@@ -14,6 +14,7 @@
* limitations under the License. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include
#include
#ifndef BR_EMBEDDED
#include
@@ -128,10 +129,13 @@ BR_REGISTER(Gallery, galGallery)
* \ingroup galleries
* \brief Reads/writes templates to/from folders.
* \author Josh Klontz \cite jklontz
+ * \param regexp An optional regular expression to match against the files extension.
*/
class EmptyGallery : public Gallery
{
Q_OBJECT
+ Q_PROPERTY(QString regexp READ get_regexp WRITE set_regexp RESET reset_regexp STORED false)
+ BR_PROPERTY(QString, regexp, "")
void init()
{
@@ -160,6 +164,13 @@ class EmptyGallery : public Gallery
foreach (const QString &fileName, QtUtils::getFiles(file.name, false))
templates.append(File(fileName, dir.dirName()));
+ if (!regexp.isEmpty()) {
+ const QRegularExpression re(regexp);
+ for (int i=templates.size()-1; i>=0; i--)
+ if (!re.match(templates[i].file.suffix()).hasMatch())
+ templates.removeAt(i);
+ }
+
return templates;
}
diff --git a/openbr/plugins/quality.cpp b/openbr/plugins/quality.cpp
index 6d34ff4..5ebb34e 100644
--- a/openbr/plugins/quality.cpp
+++ b/openbr/plugins/quality.cpp
@@ -181,8 +181,9 @@ class MatchProbabilityDistance : public Distance
float compare(const Template &target, const Template &query) const
{
float rawScore = distance->compare(target, query);
- if (rawScore == -std::numeric_limits::max()) return rawScore;
- return mp(rawScore, gaussian);
+ return -log(rawScore+1);
+ //if (rawScore == -std::numeric_limits::max()) return rawScore;
+ //return mp(rawScore, gaussian);
}
void store(QDataStream &stream) const
diff --git a/share/openbr/Doxyfile.in b/share/openbr/Doxyfile.in
index b371487..22c56b8 100644
--- a/share/openbr/Doxyfile.in
+++ b/share/openbr/Doxyfile.in
@@ -130,7 +130,7 @@ FULL_PATH_NAMES = YES
# relative paths, which will be relative from the directory where doxygen is
# started.
-STRIP_FROM_PATH = ${CMAKE_CURRENT_SOURCE_DIR}
+STRIP_FROM_PATH = ${CMAKE_SOURCE_DIR}
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
# the path mentioned in the documentation of a class, which tells
@@ -661,9 +661,8 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
-INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/sdk \
- ${CMAKE_CURRENT_SOURCE_DIR}/app/br \
- ${CMAKE_CURRENT_SOURCE_DIR}/app/examples
+INPUT = ${CMAKE_SOURCE_DIR}/app \
+ ${CMAKE_SOURCE_DIR}/openbr
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -681,8 +680,7 @@ INPUT_ENCODING = UTF-8
# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
# *.f90 *.f *.for *.vhd *.vhdl
-FILE_PATTERNS = *.h \
- *.cpp
+FILE_PATTERNS = *.h *.cpp
# The RECURSIVE tag can be used to turn specify whether or not subdirectories
# should be searched for input files as well. Possible values are YES and NO.
@@ -710,7 +708,9 @@ EXCLUDE_SYMLINKS = YES
# against the file with absolute path, so to exclude all test directories
# for example use the pattern */test/*
-EXCLUDE_PATTERNS = */core/*
+EXCLUDE_PATTERNS = */core/*.cpp \
+ */gui/*.cpp \
+ */icons/*
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
@@ -733,7 +733,8 @@ EXCLUDE_SYMBOLS = br::FactoryInstance \
# directories that contain example code fragments that are included (see
# the \include command).
-EXAMPLE_PATH = ${CMAKE_CURRENT_SOURCE_DIR}/
+EXAMPLE_PATH = ${CMAKE_SOURCE_DIR}/app \
+ ${CMAKE_SOURCE_DIR}/openbr
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
@@ -754,7 +755,7 @@ EXAMPLE_RECURSIVE = YES
# directories that contain image that are included in the documentation (see
# the \image command).
-IMAGE_PATH =
+IMAGE_PATH = ${CMAKE_SOURCE_DIR}
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -1245,13 +1246,13 @@ SERVER_BASED_SEARCH = NO
# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
-GENERATE_LATEX = YES
+GENERATE_LATEX = NO
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
-LATEX_OUTPUT = latex
+LATEX_OUTPUT =
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked. If left blank `latex' will be used as the default command name.
@@ -1538,7 +1539,7 @@ INCLUDE_FILE_PATTERNS =
# undefined via #undef or recursively expanded use the := operator
# instead of the = operator.
-PREDEFINED = BR_EXPORT=
+PREDEFINED = BR_EXPORT= __cplusplus
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
diff --git a/share/openbr/abstraction.svg b/share/openbr/abstraction.svg
index 36cecfe..49dae6c 100644
--- a/share/openbr/abstraction.svg
+++ b/share/openbr/abstraction.svg
@@ -11,7 +11,7 @@
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
- height="416"
+ height="400"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
@@ -40,12 +40,12 @@
inkscape:pageshadow="2"
inkscape:zoom="1.1446731"
inkscape:cx="160.23068"
- inkscape:cy="221.30937"
+ inkscape:cy="162.70186"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
- inkscape:window-width="1386"
- inkscape:window-height="856"
+ inkscape:window-width="1280"
+ inkscape:window-height="756"
inkscape:window-x="54"
inkscape:window-y="0"
inkscape:window-maximized="0" />
@@ -65,30 +65,30 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
- transform="translate(0,-636.36218)">
+ transform="translate(0,-652.36218)">
+ y="667.36218" />
+ y="667.36218" />
@@ -96,24 +96,24 @@
xml:space="preserve"
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"
x="70.554688"
- y="699.79578"
+ y="713.79578"
id="text2995"
sodipodi:linespacing="125%">br
+ y="713.79578">br
OpenBR
+ y="784.04187">OpenBR
Qt &Qt &OpenCV
+ y="811.36218" />
+ y="811.36212" />
+ y="883.36218" />
+ y="811.36218" />
LBP
+ y="850.36218">LBP
HOG
+ y="922.1073">HOG
SVM
+ y="850.1073">SVM
+ y="883.36218" />
...
+ y="922.36218">...
CommercialWrapper
CommercialApplication
+ y="959.36218" />
+ y="1008.3622" />
Source Code
+ y="985.02234">Source Code
Shared Library
+ y="1031.37">Shared Library
Application
+ y="984.37">Application
PluginPlugin
+ y="1007.3622" />
+ y="959.36218" />
+ 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" />
CommercialLibrary
+ 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" />
Open SourceApplication
CoreFramework
www.openbiometrics.org
-
+ 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" />
PCA
LDA
diff --git a/share/openbr/openbr.bib b/share/openbr/openbr.bib
index 5c425eb..ea27eb9 100644
--- a/share/openbr/openbr.bib
+++ b/share/openbr/openbr.bib
@@ -104,7 +104,6 @@
number={12},
pages={2037--2041},
year={2006},
- publisher={IEEE}
}
@article{belhumeur1997eigenfaces,
@@ -115,11 +114,10 @@
number={7},
pages={711--720},
year={1997},
- publisher={IEEE}
}
@incollection{bolme2003csu,
- title={The CSU face identification evaluation system: its purpose, features, and structure},
+ title={The {CSU} face identification evaluation system: its purpose, features, and structure},
author={Bolme, David S and Beveridge, J Ross and Teixeira, Marcio and Draper, Bruce A},
booktitle={Computer Vision Systems},
pages={304--313},
@@ -132,8 +130,6 @@
author={Bolme, David S and Draper, Bruce A and Beveridge, J Ross},
booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2009},
pages={2105--2112},
- year={2009},
- organization={IEEE}
}
@article{bradski2000opencv,
@@ -150,10 +146,8 @@
@inproceedings{cao2010face,
title={Face recognition with learning-based descriptor},
author={Cao, Zhimin and Yin, Qi and Tang, Xiaoou and Sun, Jian},
- booktitle={Computer Vision and Pattern Recognition (CVPR), 2010 IEEE Conference on},
+ booktitle={IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), 2010},
pages={2707--2714},
- year={2010},
- organization={IEEE}
}
@misc{founds2011nist,
@@ -229,10 +223,8 @@
@inproceedings{klare2011aging,
title={Face recognition across time lapse: On learning feature subspaces},
author={Klare, Brendan and Jain, Anil K},
- booktitle={Biometrics (IJCB), 2011 International Joint Conference on},
+ booktitle={IEEE International Joint Conf. on Biometrics (IJCB), 2011},
pages={1--8},
- year={2011},
- organization={IEEE}
}
@inproceedings{li2009hfb,
@@ -240,17 +232,24 @@
author={Li, Stan Z and Lei, Zhen and Ao, Meng},
booktitle={IEEE Conf. on Computer Vision and Pattern Recognition Workshops, 2009},
pages={1--8},
- year={2009},
- organization={IEEE}
+}
+
+@article{lowe2004distinctive,
+ title={Distinctive image features from scale-invariant keypoints},
+ author={Lowe, David G},
+ journal={International journal of computer vision},
+ volume={60},
+ number={2},
+ pages={91--110},
+ year={2004},
+ publisher={Springer}
}
@inproceedings{lui2012preliminary,
title={Preliminary studies on the Good, the Bad, and the Ugly face recognition challenge problem},
author={Lui, Yui Man and Bolme, D and Phillips, PJ and Beveridge, JR and Draper, BA},
- booktitle={Computer Vision and Pattern Recognition Workshops (CVPRW), 2012 IEEE Computer Society Conference on},
- pages={9--16},
- year={2012},
- organization={IEEE}
+ booktitle={IEEE Computer Society Conf. on Computer Vision and Pattern Recognition Workshops (CVPRW), 2012 },
+ pages={9--16}
}
@article{meyers2008using,
@@ -274,7 +273,7 @@
}
@article{phillips2000feret,
- title={The FERET evaluation methodology for face-recognition algorithms},
+ title={The {FERET} evaluation methodology for face-recognition algorithms},
author={Phillips, P. Jonathon and Moon, Hyeonjoon and Rizvi, Syed A. and Rauss, Patrick J.},
journal={IEEE Trans. on Pattern Analysis and Machine Intelligence},
volume={22},
@@ -287,10 +286,8 @@
@inproceedings{phillips2011introduction,
title={An introduction to the good, the bad, \& the ugly face recognition challenge problem},
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},
- booktitle={Automatic Face \& Gesture Recognition and Workshops (FG 2011), 2011 IEEE International Conference on},
+ booktitle={IEEE International Conf. on Automatic Face \& Gesture Recognition (FG) Workshops, 2011},
pages={346--353},
- year={2011},
- organization={IEEE}
}
@inproceedings{phillips2005overview,
@@ -299,14 +296,12 @@
booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2005},
volume={1},
pages={947--954},
- year={2005},
- organization={IEEE}
}
@article{tan2010enhanced,
title={Enhanced local texture feature sets for face recognition under difficult lighting conditions},
author={Tan, Xiaoyang and Triggs, Bill},
- journal={Image Processing, IEEE Transactions on},
+ journal={IEEE Trans. on Image Processing},
volume={19},
number={6},
pages={1635--1650},
@@ -359,9 +354,7 @@
author={Wang, Xiaogang and Tang, Xiaoou},
booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2004},
volume={2},
- pages={II--259},
- year={2004},
- organization={IEEE}
+ pages={II--259}
}
@article{wang2009face,
@@ -378,10 +371,8 @@
@inproceedings{yang2011articulated,
title={Articulated pose estimation with flexible mixtures-of-parts},
author={Yang, Yi and Ramanan, Deva},
- booktitle={Computer Vision and Pattern Recognition (CVPR), 2011 IEEE Conference on},
+ booktitle={IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), 2011},
pages={1385--1392},
- year={2011},
- organization={IEEE}
}
@article{yu2001direct,
@@ -399,7 +390,5 @@
title={Coupled information-theoretic encoding for face photo-sketch recognition},
author={Zhang, Wei and Wang, Xiaogang and Tang, Xiaoou},
booktitle={IEEE Conf. on Computer Vision and Pattern Recognition, 2011},
- pages={513--520},
- year={2011},
- organization={IEEE}
+ pages={513--520}
}