From aa5961835a36c6a9c38dbf1a83ef67bb958ffd33 Mon Sep 17 00:00:00 2001 From: Scott Klum Date: Mon, 18 Mar 2013 14:56:51 -0400 Subject: [PATCH] Fixed file.flat() and file.init() to work with points and rects. other minor bug fixes --- openbr/openbr_plugin.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++++++------------------------- openbr/openbr_plugin.h | 2 ++ openbr/plugins/distance.cpp | 31 +++++++++++++++++++++++++++++++ openbr/plugins/gallery.cpp | 2 ++ openbr/plugins/misc.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ openbr/plugins/pp5.cpp | 2 +- openbr/plugins/regions.cpp | 6 +++--- openbr/plugins/stasm.cpp | 10 +++++----- 8 files changed, 139 insertions(+), 34 deletions(-) diff --git a/openbr/openbr_plugin.cpp b/openbr/openbr_plugin.cpp index 23361ea..3fb8798 100644 --- a/openbr/openbr_plugin.cpp +++ b/openbr/openbr_plugin.cpp @@ -43,6 +43,9 @@ using namespace br; using namespace cv; /* File - public methods */ +// Note that the convention for displaying metadata is as follows: +// [] for lists in which argument order does not matter (e.g. [FTO=false, Index=0]), +// () for lists in which argument order matters (e.g. First_Eye(100.0,100.0)). QString File::flat() const { QStringList values; @@ -51,18 +54,14 @@ QString File::flat() const const QVariant value = this->value(key); if (value.isNull()) values.append(key); else { - if (value.canConvert(QVariant::String)) { - values.append(key + "=" + value.toString()); - } - else { - if (value.canConvert(QVariant::PointF)) values.append(key + "=" + QString("(%1,%2)").arg(QString::number(qvariant_cast(value).x()), - QString::number(qvariant_cast(value).y()))); - else if (value.canConvert(QVariant::RectF)) values.append(key + "=" + QString("(%1,%2,%3,%4)").arg(QString::number(qvariant_cast(value).x()), - QString::number(qvariant_cast(value).y()), - QString::number(qvariant_cast(value).width()), - QString::number(qvariant_cast(value).height()))); - else values.append(key + "="); + if (QString(value.typeName()) == "QVariantList") { + QStringList landmarks; + foreach(const QVariant &landmark, qvariant_cast(value)) { + landmarks.append(toString(landmark)); + } + if (!landmarks.isEmpty()) values.append(key + "=[" + landmarks.join(", ") + "]"); } + else values.append(key + "=" + toString(value)); } } @@ -266,26 +265,49 @@ void File::init(const QString &file) if (unnamed) setParameter(i, words[0]); else set(words[0], QVariant()); } else { - if (words[1][0] == '(') { - QStringList values = words[1].split(','); - if (values.size() == 2) /* QPointF */ { - values[1].chop(1); - QPointF point(values[0].mid(1).toFloat(), values[1].remove(')').toFloat()); - set(words[0], point); - } - else /* QRectF */ { - values[3].chop(1); - QRectF rect(values[0].mid(1).toFloat(), values[1].toFloat(), values[2].toFloat(), values[3].remove(')').toFloat()); - set(words[0], rect); - } - } - else set(words[0], words[1]); + fromString(words[0],words[1]); } } name = name.left(index); } } +QString File::toString(const QVariant &variant) const +{ + if (variant.canConvert(QVariant::String)) return variant.toString(); + else if(variant.canConvert(QVariant::PointF)) return QString("(%1,%2)").arg(QString::number(qvariant_cast(variant).x()), + QString::number(qvariant_cast(variant).y())); + else if (variant.canConvert(QVariant::RectF)) return QString("(%1,%2,%3,%4)").arg(QString::number(qvariant_cast(variant).x()), + QString::number(qvariant_cast(variant).y()), + QString::number(qvariant_cast(variant).width()), + QString::number(qvariant_cast(variant).height())); + return QString(); +} + +void File::fromString(const QString &key, const QString &value) +{ + if (value[0] == '[') /* QVariantList */ { + QStringList values = value.mid(1, value.size()-2).split(", "); + foreach(const QString &word, values) fromString(key, word); + } + else if (value[0] == '(') { + QStringList values = value.split(','); + if (values.size() == 2) /* QPointF */ { + values[1].chop(1); + QPointF point(values[0].mid(1).toFloat(), values[1].toFloat()); + if (key != "Points") set(key, point); + else appendPoint(point); + } + else /* QRectF */ { + values[3].chop(1); + QRectF rect(values[0].mid(1).toFloat(), values[1].toFloat(), values[2].toFloat(), values[3].toFloat()); + if (key != "Rects") set(key, rect); + else appendRect(rect); + } + } + else set(key, value); +} + /* File - global methods */ QDebug br::operator<<(QDebug dbg, const File &file) { diff --git a/openbr/openbr_plugin.h b/openbr/openbr_plugin.h index 9b131c8..669965a 100644 --- a/openbr/openbr_plugin.h +++ b/openbr/openbr_plugin.h @@ -245,6 +245,8 @@ private: BR_EXPORT friend QDataStream &operator>>(QDataStream &stream, File &file); void init(const QString &file); + QString toString(const QVariant &variant) const; + void fromString(const QString &key, const QString &value); }; BR_EXPORT QDebug operator<<(QDebug dbg, const File &file); /*!< \brief Prints br::File::flat() to \c stderr. */ diff --git a/openbr/plugins/distance.cpp b/openbr/plugins/distance.cpp index 521726e..b928427 100644 --- a/openbr/plugins/distance.cpp +++ b/openbr/plugins/distance.cpp @@ -177,6 +177,37 @@ class PipeDistance : public Distance BR_REGISTER(Distance, PipeDistance) +class AverageDistance : public Distance +{ + Q_OBJECT + Q_PROPERTY(br::Distance* distance READ get_distance WRITE set_distance RESET reset_distance STORED false) + BR_PROPERTY(br::Distance*, distance, make("Dist(L2)")) + + void train(const TemplateList &src) + { + distance->train(src); + } + + float compare(const Template &a, const Template &b) const + { + if (a.size() != b.size()) + qDebug() << a.size() << " " << b.size(); + + float score = 0; + + for (int i = 0; i < a.size(); i++) { + //Template + score += distance->compare(a[i],b[i]); + } + + qDebug() << score; + + return score; + } +}; + +BR_REGISTER(Distance, AverageDistance) + /*! * \ingroup distances * \brief Fast 8-bit L1 distance diff --git a/openbr/plugins/gallery.cpp b/openbr/plugins/gallery.cpp index f07ecab..add1c6f 100644 --- a/openbr/plugins/gallery.cpp +++ b/openbr/plugins/gallery.cpp @@ -302,6 +302,8 @@ class memGallery : public Gallery static void align(TemplateList &templates) { + //if (templates[0].size() > 1) return; + bool uniform = true; QVector alignedData(templates.bytes()); size_t offset = 0; diff --git a/openbr/plugins/misc.cpp b/openbr/plugins/misc.cpp index 5ad0be0..b222b44 100644 --- a/openbr/plugins/misc.cpp +++ b/openbr/plugins/misc.cpp @@ -322,6 +322,54 @@ BR_REGISTER(Transform, RenameFirstTransform) /*! * \ingroup transforms + * \brief Name a point + * \author Scott Klum \cite sklum + */ +class LabelTransform : public UntrainableMetaTransform +{ + Q_OBJECT + Q_PROPERTY(QList points READ get_points WRITE set_points RESET reset_points STORED false) + Q_PROPERTY(QStringList names READ get_names WRITE set_names RESET reset_names STORED false) + BR_PROPERTY(QList, points, QList()) + BR_PROPERTY(QStringList, names, QStringList()) + + void project(const Template &src, Template &dst) const + { + if (points.size() != names.size()) qFatal("Point/name size mismatch"); + + dst = src; + + for (int i=0; i(name)); + } +}; + +BR_REGISTER(Transform, AnonymizeTransform) + +/*! + * \ingroup transforms * \brief Change the br::Template::file extension * \author Josh Klontz \cite jklontz */ diff --git a/openbr/plugins/pp5.cpp b/openbr/plugins/pp5.cpp index f557ac9..2579c55 100644 --- a/openbr/plugins/pp5.cpp +++ b/openbr/plugins/pp5.cpp @@ -13,7 +13,7 @@ #include #include -#include "core/resource.h" +#include "openbr/core/resource.h" #define TRY(CC) \ { \ diff --git a/openbr/plugins/regions.cpp b/openbr/plugins/regions.cpp index 634a407..6608e4c 100644 --- a/openbr/plugins/regions.cpp +++ b/openbr/plugins/regions.cpp @@ -157,7 +157,7 @@ BR_REGISTER(Transform, DupTransform) * \todo Padding should be a percent of total image size */ -class RectFromLandmarksTransform : public UntrainableTransform +class RectFromPointsTransform : public UntrainableTransform { Q_OBJECT Q_PROPERTY(QList indices READ get_indices WRITE set_indices RESET reset_indices STORED false) @@ -181,7 +181,7 @@ class RectFromLandmarksTransform : public UntrainableTransform maxX = maxY = -std::numeric_limits::max(); foreach(int index, indices) { - if (src.file.points().size() > index+1) { + if (src.file.points().size() > index) { if (src.file.points()[index].x() < minX) minX = src.file.points()[index].x(); if (src.file.points()[index].x() > maxX) maxX = src.file.points()[index].x(); if (src.file.points()[index].y() < minY) minY = src.file.points()[index].y(); @@ -203,7 +203,7 @@ class RectFromLandmarksTransform : public UntrainableTransform } }; -BR_REGISTER(Transform, RectFromLandmarksTransform) +BR_REGISTER(Transform, RectFromPointsTransform) } // namespace br diff --git a/openbr/plugins/stasm.cpp b/openbr/plugins/stasm.cpp index 25f6eed..48f4384 100644 --- a/openbr/plugins/stasm.cpp +++ b/openbr/plugins/stasm.cpp @@ -18,11 +18,11 @@ class StasmInitializer : public Initializer void initialize() const { - Globals->abbreviations.insert("RectFromStasmEyes","RectFromLandmarks([27, 28, 29, 30, 31, 32, 33, 34, 35, 36],0.125,6.0)+Resize(44,164)"); // - Globals->abbreviations.insert("RectFromStasmJaw","RectFromLandmarks([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],10)"); - Globals->abbreviations.insert("RectFromStasmBrow","RectFromLandmarks([15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],0.25,6.5)+Resize(44,230)"); - Globals->abbreviations.insert("RectFromStasmNose","RectFromLandmarks([38, 39, 40, 41, 42, 43, 44, 67],0.1,1.5)+Resize(44,44)"); - Globals->abbreviations.insert("RectFromStasmMouth","RectFromLandmarks([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66],0.3,3.0)+Resize(44,110)"); + Globals->abbreviations.insert("RectFromStasmEyes","RectFromPoints([27, 28, 29, 30, 31, 32, 33, 34, 35, 36],0.125,6.0)+Resize(44,164)"); // + Globals->abbreviations.insert("RectFromStasmJaw","RectFromPoints([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],10)"); + Globals->abbreviations.insert("RectFromStasmBrow","RectFromPoints([15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],0.25,6.5)+Resize(44,230)"); + Globals->abbreviations.insert("RectFromStasmNose","RectFromPoints([38, 39, 40, 41, 42, 43, 44, 67],0.1,1.5)+Resize(44,44)"); + Globals->abbreviations.insert("RectFromStasmMouth","RectFromPoints([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66],0.3,3.0)+Resize(44,110)"); } }; -- libgit2 0.21.4