/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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 #include "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.insert("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) BR_PROPERTY(bool, error, true) BR_PROPERTY(bool, data, 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(); if (error) qDebug("%s\n%s", qPrintable(nameString), qPrintable(dataString)); else printf("%s\n%s", qPrintable(nameString), qPrintable(dataString)); } }; 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