Commit 14650db9510efde71178c8e6e7d2780c63d25a2a
1 parent
24ca08bc
Removed GradientHistogram
Showing
1 changed file
with
0 additions
and
145 deletions
openbr/plugins/representation/gradienthistogram.cpp deleted
| 1 | -#include <opencv2/imgproc/imgproc.hpp> | |
| 2 | -#include <opencv2/highgui/highgui.hpp> | |
| 3 | - | |
| 4 | -#include <openbr/plugins/openbr_internal.h> | |
| 5 | -#include <openbr/core/opencvutils.h> | |
| 6 | - | |
| 7 | -using namespace cv; | |
| 8 | - | |
| 9 | -namespace br | |
| 10 | -{ | |
| 11 | - | |
| 12 | -/*! | |
| 13 | - * \ingroup representations | |
| 14 | - * \brief Computes first order gradient histogram features using an integral image | |
| 15 | - * \author Scott Klum \cite sklum | |
| 16 | - */ | |
| 17 | -class GradientHistogramRepresentation : public Representation | |
| 18 | -{ | |
| 19 | - Q_OBJECT | |
| 20 | - | |
| 21 | - Q_PROPERTY(int winWidth READ get_winWidth WRITE set_winWidth RESET reset_winWidth STORED false) | |
| 22 | - Q_PROPERTY(int winHeight READ get_winHeight WRITE set_winHeight RESET reset_winHeight STORED false) | |
| 23 | - Q_PROPERTY(int bins READ get_bins WRITE set_bins RESET reset_bins STORED false) | |
| 24 | - Q_PROPERTY(bool squareOnly READ get_squareOnly WRITE set_squareOnly RESET reset_squareOnly STORED false) | |
| 25 | - BR_PROPERTY(int, winWidth, 24) | |
| 26 | - BR_PROPERTY(int, winHeight, 24) | |
| 27 | - BR_PROPERTY(int, bins, 6) | |
| 28 | - BR_PROPERTY(bool, squareOnly, false) | |
| 29 | - | |
| 30 | - void init() | |
| 31 | - { | |
| 32 | - if (features.isEmpty()) { | |
| 33 | - int dx, dy; | |
| 34 | - Size size = windowSize(&dx,&dy); | |
| 35 | - | |
| 36 | - int width = size.width+dx, height = size.height+dy; | |
| 37 | - | |
| 38 | - // Enumerate all possible rectangles | |
| 39 | - for (int x=0; x<width; x++) | |
| 40 | - for (int y=0; y<height; y++) | |
| 41 | - for (int w=1; w < width-x; w++) | |
| 42 | - for (int h=1; h < height-y; h++) | |
| 43 | - if (!squareOnly || w == h) | |
| 44 | - features.append(Rect(x,y,w,h)); | |
| 45 | - } | |
| 46 | - | |
| 47 | - qDebug() << "Number of Gradient Histogram features:" << features.size(); | |
| 48 | - } | |
| 49 | - | |
| 50 | - void preprocess(const Mat &src, Mat &dst) const | |
| 51 | - { | |
| 52 | - // Compute as is done in GradientTransform | |
| 53 | - Mat dx, dy, magnitude, angle; | |
| 54 | - Sobel(src, dx, CV_32F, 1, 0, CV_SCHARR); | |
| 55 | - Sobel(src, dy, CV_32F, 0, 1, CV_SCHARR); | |
| 56 | - cartToPolar(dx, dy, magnitude, angle, true); | |
| 57 | - | |
| 58 | - const double floor = ((src.depth() == CV_32F) || (src.depth() == CV_64F)) ? -0.5 : 0; | |
| 59 | - | |
| 60 | - Mat histogram; | |
| 61 | - angle.convertTo(histogram, bins > 256 ? CV_16U : CV_8U, bins/360., floor); | |
| 62 | - | |
| 63 | - // Mask and compute integral image | |
| 64 | - std::vector<Mat> outputs; | |
| 65 | - for (int i=0; i<bins; i++) { | |
| 66 | - Mat output = (histogram == i)/255; | |
| 67 | - Mat integralImg; | |
| 68 | - integral(output, integralImg); | |
| 69 | - outputs.push_back(integralImg); | |
| 70 | - } | |
| 71 | - | |
| 72 | - merge(outputs,dst); | |
| 73 | - } | |
| 74 | - | |
| 75 | - /* ___ ___ | |
| 76 | - * | | | | |
| 77 | - * | A | B | | |
| 78 | - * |___|___| | |
| 79 | - * | | | | |
| 80 | - * | C | D | | |
| 81 | - * |___|___| | |
| 82 | - * | |
| 83 | - * 1, 2, 3 and 4 refer to the lower right corners of A, B, C, and D, respectively. | |
| 84 | - * Rectangle D can be computed as 4 + 1 - (2 + 3) | |
| 85 | - */ | |
| 86 | - | |
| 87 | - float evaluate(const Mat &image, int idx) const | |
| 88 | - { | |
| 89 | - // To which channel does idx belong? | |
| 90 | - const int index = idx % features.size(); | |
| 91 | - const int channel = idx / features.size(); | |
| 92 | - | |
| 93 | - int dx, dy; | |
| 94 | - Size size = windowSize(&dx, &dy); | |
| 95 | - | |
| 96 | - const int *ptr = image.ptr<int>(); | |
| 97 | - | |
| 98 | - int four = ptr[((features[index].y+features[index].height)*(size.height+dy)+(features[index].x+features[index].width))*bins+channel]; | |
| 99 | - int one = ptr[(features[index].y*(size.height+dy)+features[index].x)*bins+channel]; | |
| 100 | - int two = ptr[(features[index].y*(size.height+dy)+(features[index].x+features[index].width))*bins+channel]; | |
| 101 | - int three = ptr[((features[index].y+features[index].height)*(size.height+dy)+features[index].x)*bins+channel]; | |
| 102 | - | |
| 103 | - return four + one - (two + three); | |
| 104 | - } | |
| 105 | - | |
| 106 | - Mat evaluate(const Mat &image, const QList<int> &indices) const | |
| 107 | - { | |
| 108 | - int size = indices.empty() ? numFeatures() : indices.size(); | |
| 109 | - | |
| 110 | - Mat result(1, size, CV_32FC1); | |
| 111 | - for (int i = 0; i < size; i++) | |
| 112 | - result.at<float>(i) = evaluate(image, indices.empty() ? i : indices[i]); | |
| 113 | - | |
| 114 | - return result; | |
| 115 | - } | |
| 116 | - | |
| 117 | - int numFeatures() const | |
| 118 | - { | |
| 119 | - return features.size()*bins; | |
| 120 | - } | |
| 121 | - | |
| 122 | - int numChannels() const | |
| 123 | - { | |
| 124 | - return bins; | |
| 125 | - } | |
| 126 | - | |
| 127 | - Size windowSize(int *dx, int *dy) const | |
| 128 | - { | |
| 129 | - if (dx && dy) | |
| 130 | - *dx = *dy = 1; | |
| 131 | - return Size(winWidth, winHeight); | |
| 132 | - } | |
| 133 | - | |
| 134 | - int maxCatCount() const { return 0; } | |
| 135 | - | |
| 136 | - QList<Rect> features; | |
| 137 | -}; | |
| 138 | - | |
| 139 | -BR_REGISTER(Representation, GradientHistogramRepresentation) | |
| 140 | - | |
| 141 | -} // namespace br | |
| 142 | - | |
| 143 | -#include "representation/gradienthistogram.moc" | |
| 144 | - | |
| 145 | - |