/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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/common.h" #include "core/opencvutils.h" using namespace cv; namespace br { /*! * \ingroup transforms * \brief Histograms the matrix * \author Josh Klontz \cite jklontz */ class HistTransform : public UntrainableTransform { Q_OBJECT Q_PROPERTY(float max READ get_max WRITE set_max RESET reset_max STORED false) Q_PROPERTY(float min READ get_min WRITE set_min RESET reset_min STORED false) Q_PROPERTY(int dims READ get_dims WRITE set_dims RESET reset_dims STORED false) BR_PROPERTY(float, max, 256) BR_PROPERTY(float, min, 0) BR_PROPERTY(int, dims, -1) void project(const Template &src, Template &dst) const { const int dims = this->dims == -1 ? max - min : this->dims; std::vector mv; split(src, mv); Mat m(mv.size(), dims, CV_32FC1); for (size_t i=0; i 256 ? CV_16U : CV_8U, bins/(max-min), -0.5 /* floor */); if (!split) return; Mat input = dst; QList outputs; outputs.reserve(bins); for (int i=0; i Tuple; QList tuples = Common::Sort(OpenCVUtils::matrixToVector(m)); float prevValue = 0; int prevRank = 0; for (int i=0; i(tuples[i].second / m.cols, tuples[i].second % m.cols) = rank; prevValue = tuples[i].first; prevRank = rank; } } }; BR_REGISTER(Transform, RankTransform) /*! * \ingroup transforms * \brief An integral histogram * \author Josh Klontz \cite jklontz */ class IntegralHistTransform : public UntrainableTransform { Q_OBJECT Q_PROPERTY(int bins READ get_bins WRITE set_bins RESET reset_bins STORED false) Q_PROPERTY(int radius READ get_radius WRITE set_radius RESET reset_radius STORED false) BR_PROPERTY(int, bins, 256) BR_PROPERTY(int, radius, 16) void project(const Template &src, Template &dst) const { const Mat &m = src.m(); if (m.type() != CV_8UC1) qFatal("IntegralHist requires 8UC1 matrices."); Mat integral(m.rows/radius+1, (m.cols/radius+1)*bins, CV_32SC1); integral.setTo(0); for (int i=1; i(i, j+k) += integral.at(i-1, j +k); for (int k=0; k(i, j+k) += integral.at(i , j-bins+k); for (int k=0; k(i, j+k) -= integral.at(i-1, j-bins+k); for (int k=0; k(i, j+m.at((i-1)*radius+k,(j/bins-1)*radius+l))++; } } dst = integral; } }; BR_REGISTER(Transform, IntegralHistTransform) } // namespace br #include "hist.moc"