diff --git a/openbr/core/plot.cpp b/openbr/core/plot.cpp index c9a9c61..ad123b3 100644 --- a/openbr/core/plot.cpp +++ b/openbr/core/plot.cpp @@ -119,7 +119,7 @@ float Evaluate(const QString &simmat, const QString &mask, const QString &csv) maskFile.set("rows", scores.rows); maskFile.set("columns", scores.cols); const Mat masks = BEE::readMask(maskFile); - if (scores.size() != masks.size()) qFatal("Simmat/Mask size mismatch."); + if (scores.size() != masks.size()) qFatal("Simmat (%i,%i) / Mask (%i,%i) size mismatch.", scores.rows, scores.cols, masks.rows, masks.cols); return Evaluate(scores, masks, csv); } diff --git a/openbr/plugins/misc.cpp b/openbr/plugins/misc.cpp index b222b44..306e616 100644 --- a/openbr/plugins/misc.cpp +++ b/openbr/plugins/misc.cpp @@ -370,6 +370,40 @@ BR_REGISTER(Transform, AnonymizeTransform) /*! * \ingroup transforms + * \brief Name a point + * \author Scott Klum \cite sklum + */ +class ElicitMetadataTransform : public UntrainableMetaTransform +{ + Q_OBJECT + + Q_PROPERTY(QStringList metadata READ get_metadata WRITE set_metadata RESET reset_metadata STORED false) + BR_PROPERTY(QStringList, metadata, QStringList()) + + void init() + { + Globals->setProperty("parallelism", "0"); // Can only work in single threaded mode + } + + void project(const Template &src, Template &dst) const + { + dst = src; + + QTextStream stream(stdin); + + foreach (const QString &key, metadata) { + qDebug() << "Specify a value for key: " << key; + QStringList values = stream.readLine().split(","); + if (values.size() > 1) dst.file.set(key, values); // Used for lists (e.g. age range) + else dst.file.set(key,values[0]); + } + } +}; + +BR_REGISTER(Transform, ElicitMetadataTransform) + +/*! + * \ingroup transforms * \brief Change the br::Template::file extension * \author Josh Klontz \cite jklontz */ diff --git a/openbr/plugins/stasm.cpp b/openbr/plugins/stasm.cpp index 4a608f2..6a386cc 100644 --- a/openbr/plugins/stasm.cpp +++ b/openbr/plugins/stasm.cpp @@ -22,7 +22,7 @@ class StasmInitializer : public Initializer 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)"); + 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(26,68)"); } }; diff --git a/openbr/plugins/stream.cpp b/openbr/plugins/stream.cpp index ff37e34..eea38ca 100644 --- a/openbr/plugins/stream.cpp +++ b/openbr/plugins/stream.cpp @@ -192,9 +192,10 @@ public: aFrame->sequenceNumber = -1; bool res = getNext(*aFrame); + + // The datasource broke. if (!res) { allFrames.addItem(aFrame); - // Datasource broke? QMutexLocker lock(&last_frame_update); final_frame = last_issued; @@ -278,6 +279,7 @@ private: bool res = video.read(output.data.last().last()); if (!res) { + video.release(); return false; } output.data.last().file.set("FrameNumber", output.sequenceNumber); @@ -627,6 +629,9 @@ public: dataSource.returnFrame(input); input = NULL; + if (!dataSource.isOpen()) + return false; + QReadLocker lock(&statusLock); // Thread is already running, we should just return if (currentStatus == STARTING)