diff --git a/sdk/plugins/algorithms.cpp b/sdk/plugins/algorithms.cpp index 232201d..28efccc 100644 --- a/sdk/plugins/algorithms.cpp +++ b/sdk/plugins/algorithms.cpp @@ -50,6 +50,7 @@ class AlgorithmsInitializer : public Initializer Globals->abbreviations.insert("SmallSIFT", "Open+LimitSize(512)+KeyPointDetector(SIFT)+KeyPointDescriptor(SIFT):KeyPointMatcher(BruteForce)"); Globals->abbreviations.insert("SmallSURF", "Open+LimitSize(512)+KeyPointDetector(SURF)+KeyPointDescriptor(SURF):KeyPointMatcher(BruteForce)"); Globals->abbreviations.insert("ColorHist", "Open+LimitSize(512)!EnsureChannels(3)+SplitChannels+Hist(256,0,8)+Cat+Normalize(L1):L2"); + Globals->abbreviations.insert("IHH", "Open+SplitChannels/(Cvt(Gray)+Gradient+Bin(0,6.283,8,true))+Integral+Merge+IntegralSampler"); // Hash Globals->abbreviations.insert("FileName", "Name+Identity:Identical"); diff --git a/sdk/plugins/hist.cpp b/sdk/plugins/hist.cpp index 0a87290..1a94431 100644 --- a/sdk/plugins/hist.cpp +++ b/sdk/plugins/hist.cpp @@ -164,91 +164,6 @@ class IntegralHistTransform : public UntrainableTransform BR_REGISTER(Transform, IntegralHistTransform) -/*! - * \ingroup transforms - * \brief Detects regions of low variance - * \author Josh Klontz \cite jklontz - */ -class VarianceChangeDetectorTransform : 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) - - float stddev(const Mat &integral, int i, int j, int scale, int *buffer) const - { - const float count = scale*scale*radius*radius; - - float mean = 0; - for (int k=0; k(i+scale,(j+scale)*bins+k) - - integral.at(i+scale, j *bins+k) - - integral.at(i ,(j+scale)*bins+k) - + integral.at(i , j *bins+k); - mean += k*buffer[k]; - } - mean /= count; - - float variance = 0; - for (int k=0; k::max(); - QRectF bestRect; - - const int rows = m.rows; - const int cols = m.cols/bins; - const int maxSize = min(m.rows, m.cols/bins); - int scale = 2; - while (scale < maxSize) { - const int step = std::max(1, scale/6); - for (int i=0; i+scale < rows; i+=step) { - for (int j=0; j+scale < cols; j+=step) { - float internalStdDev = stddev(m, i, j, scale, buffer); - float externalStdDev = std::numeric_limits::max(); - externalStdDev = std::min(externalStdDev, ((i-2*scale >= 0) && (j-2*scale >= 0)) ? stddev(m, i-2*scale, j-2*scale, scale, buffer) : 0); - externalStdDev = std::min(externalStdDev, (i-2*scale >= 0) ? stddev(m, i-2*scale, j , scale, buffer) : 0); - externalStdDev = std::min(externalStdDev, ((i-2*scale >= 0) && (j+3*scale < cols)) ? stddev(m, i-2*scale, j+2*scale, scale, buffer) : 0); - externalStdDev = std::min(externalStdDev, (j+3*scale < cols) ? stddev(m, i , j+2*scale, scale, buffer) : 0); - externalStdDev = std::min(externalStdDev, ((i+3*scale < rows) && (j+3*scale < cols)) ? stddev(m, i+2*scale, j+2*scale, scale, buffer) : 0); - externalStdDev = std::min(externalStdDev, (i+3*scale < rows) ? stddev(m, i+2*scale, j , scale, buffer) : 0); - externalStdDev = std::min(externalStdDev, ((i+3*scale < rows) && (j-2*scale >= 0)) ? stddev(m, i+2*scale, j-2*scale, scale, buffer) : 0); - externalStdDev = std::min(externalStdDev, (j-2*scale >= 0) ? stddev(m, i , j-2*scale, scale, buffer) : 0); - - float ratio; - if (externalStdDev == 0) ratio = 0; - else if (internalStdDev == 0) ratio = std::numeric_limits::max() * (float(scale)/float(maxSize)); - else ratio = scale*scale * pow(externalStdDev,2) / pow(internalStdDev, 2); - - if (ratio > bestRatio) { - bestRatio = ratio; - bestRect = QRect(j*radius, i*radius, scale*radius, scale*radius); - } - } - } - scale = std::max(scale+1, int(scale*1.25)); - } - - delete[] buffer; - dst.file.appendRect(bestRect); - dst.file.setLabel(bestRatio); - } -}; - -BR_REGISTER(Transform, VarianceChangeDetectorTransform) - } // namespace br #include "hist.moc" diff --git a/sdk/plugins/integral.cpp b/sdk/plugins/integral.cpp index 152cb41..f19fdc0 100644 --- a/sdk/plugins/integral.cpp +++ b/sdk/plugins/integral.cpp @@ -1,6 +1,9 @@ #include +#include #include +using namespace cv; + namespace br { @@ -15,7 +18,7 @@ class IntegralTransform : public UntrainableTransform void project(const Template &src, Template &dst) const { - cv::integral(src, dst); + integral(src, dst); } }; @@ -23,6 +26,71 @@ BR_REGISTER(Transform, IntegralTransform) /*! * \ingroup transforms + * \brief Sliding window object recognition from a multi-channel intergral image. + * \author Josh Klontz \cite jklontz + */ +class IntegralSampler : public UntrainableTransform +{ + Q_OBJECT + Q_PROPERTY(int scales READ get_scales WRITE set_scales RESET reset_scales STORED false) + Q_PROPERTY(float scaleFactor READ get_scaleFactor WRITE set_scaleFactor RESET reset_scaleFactor STORED false) + Q_PROPERTY(float stepFactor READ get_stepFactor WRITE set_stepFactor RESET reset_stepFactor STORED false) + Q_PROPERTY(int minSize READ get_minSize WRITE set_minSize RESET reset_minSize STORED false) + BR_PROPERTY(int, scales, 1) + BR_PROPERTY(float, scaleFactor, 1.25) + BR_PROPERTY(float, stepFactor, 0.25) + BR_PROPERTY(int, minSize, 8) + + void project(const Template &src, Template &dst) const + { + typedef Eigen::Map< const Eigen::Matrix > InputDescriptor; + typedef Eigen::Map< Eigen::Matrix > OutputDescriptor; + const Mat &m = src.m(); + if (m.depth() != CV_32S) qFatal("Expected CV_32S matrix depth."); + const int channels = m.channels(); + const int rowStep = channels * m.cols; + + int descriptors = 0; + int currentSize = min(m.rows, m.cols)-1; + for (int scale=0; scale mv; + foreach (const Mat &m, src) + mv.push_back(m); + merge(mv, dst); + } +}; + +BR_REGISTER(Transform, MergeTransform) + +/*! + * \ingroup transforms * \brief Duplicates the template data. * \author Josh Klontz \cite jklontz */