diff --git a/sdk/plugins/reduce.cpp b/sdk/plugins/reduce.cpp index 8a1741a..5c0c82d 100644 --- a/sdk/plugins/reduce.cpp +++ b/sdk/plugins/reduce.cpp @@ -79,6 +79,46 @@ class AndTransform : public UntrainableMetaTransform BR_REGISTER(Transform, AndTransform) +/*! + * \ingroup transforms + * \brief Statistics + * \author Josh Klontz \cite jklontz + */ +class StatTransform : public UntrainableTransform +{ + Q_OBJECT + Q_ENUMS(Statistic) + Q_PROPERTY(Statistic statistic READ get_statistic WRITE set_statistic RESET reset_statistic STORED false) + +public: + /*! + * \brief Available statistics + */ + enum Statistic { Min, Max, Mean, StdDev }; + +private: + BR_PROPERTY(Statistic, statistic, Mean) + + void project(const Template &src, Template &dst) const + { + if (src.m().channels() != 1) + qFatal("Expected 1 channel matrix."); + Mat m(1, 1, CV_32FC1); + if ((statistic == Min) || (statistic == Max)) { + double min, max; + minMaxLoc(src, &min, &max); + m.at(1, 1) = (statistic == Min ? min : max); + } else { + Scalar mean, stddev; + meanStdDev(src, mean, stddev); + m.at(1,1) = (statistic == Mean ? mean[0] : stddev[0]); + } + dst = m; + } +}; + +BR_REGISTER(Transform, StatTransform) + } // namespace br #include "reduce.moc"