/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2012 The MITRE Corporation * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include "openbr_internal.h" #include "openbr/core/opencvutils.h" using namespace cv; namespace br { /*! * \ingroup transforms * \brief Applies br::Format to br::Template::file::name and appends results. * \author Josh Klontz \cite jklontz */ class OpenTransform : public UntrainableMetaTransform { Q_OBJECT void project(const Template &src, Template &dst) const { if (Globals->verbose) qDebug("Opening %s", qPrintable(src.file.flat())); dst.file = src.file; foreach (const File &file, src.file.split()) { QScopedPointer format(Factory::make(file)); Template t = format->read(); if (t.isEmpty()) qWarning("Can't open %s from %s", qPrintable(file.flat()), qPrintable(QDir::currentPath())); dst.append(t); dst.file.append(t.file.localMetadata()); } dst.file.set("FTO", dst.isEmpty()); } }; BR_REGISTER(Transform, OpenTransform) /*! * \ingroup transforms * \brief Displays templates in a GUI pop-up window. * \author Josh Klontz \cite jklontz */ class ShowTransform : public UntrainableMetaTransform { Q_OBJECT Q_PROPERTY(bool waitKey READ get_waitKey WRITE set_waitKey RESET reset_waitKey STORED false) BR_PROPERTY(bool, waitKey, true) static int counter; int uid; void init() { uid = counter++; Globals->setProperty("parallelism", "0"); // Can only work in single threaded mode } void project(const Template &src, Template &dst) const { dst = src; if (Globals->parallelism) { qWarning("Show::project() only works in single threaded mode."); return; } for (int i=0; i 1 ? "-" + QString::number(uid*src.size()+i) : QString()), false); if (waitKey && !src.isEmpty()) cv::waitKey(-1); } }; int ShowTransform::counter = 0; BR_REGISTER(Transform, ShowTransform) /*! * \ingroup transforms * \brief Prints the template's file to stdout or stderr. * \author Josh Klontz \cite jklontz */ class PrintTransform : public UntrainableMetaTransform { Q_OBJECT Q_PROPERTY(bool error READ get_error WRITE set_error RESET reset_error) Q_PROPERTY(bool data READ get_data WRITE set_data RESET reset_data) Q_PROPERTY(bool nTemplates READ get_data WRITE set_data RESET reset_data) BR_PROPERTY(bool, error, true) BR_PROPERTY(bool, data, false) BR_PROPERTY(bool, size, false) void project(const Template &src, Template &dst) const { dst = src; const QString nameString = src.file.flat(); const QString dataString = data ? OpenCVUtils::matrixToString(src)+"\n" : QString(); const QString nTemplates = size ? QString::number(src.size()) : QString(); if (error) qDebug("%s\n%s\n%s", qPrintable(nameString), qPrintable(dataString), qPrintable(nTemplates)); else printf("%s\n%s\n%s", qPrintable(nameString), qPrintable(dataString), qPrintable(nTemplates)); } }; BR_REGISTER(Transform, PrintTransform) /*! * \ingroup transforms * \brief Checks the template for NaN values. * \author Josh Klontz \cite jklontz */ class CheckTransform : public UntrainableMetaTransform { Q_OBJECT static int count; int index; public: CheckTransform() : index(count++) {} void project(const Template &src, Template &dst) const { dst = src; foreach (const Mat &m, src) { Mat fm; m.convertTo(fm, CV_32F); const int elements = fm.rows * fm.cols * fm.channels(); const float *data = (const float*)fm.data; for (int i=0; i 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 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; QString value = stream.readLine(); 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") dst.file.set(key, point); else dst.file.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") dst.file.set(key, rect); else dst.file.appendRect(rect); } } else dst.file.set(key, value); } } }; BR_REGISTER(Transform, ElicitMetadataTransform) /*! * \ingroup transforms * \brief Change the br::Template::file extension * \author Josh Klontz \cite jklontz */ class AsTransform : public UntrainableMetaTransform { Q_OBJECT Q_PROPERTY(QString extension READ get_extension WRITE set_extension RESET reset_extension STORED false) BR_PROPERTY(QString, extension, "") void project(const Template &src, Template &dst) const { dst = src; dst.file.name = dst.file.name.left(dst.file.name.lastIndexOf('.')+1) + extension; } }; BR_REGISTER(Transform, AsTransform) } #include "misc.moc"