Commit 23bd6de45a37ef8b25a3f6b9d3edf469dd952312
1 parent
a231cbed
Smarter use of pointers
Showing
9 changed files
with
93 additions
and
32 deletions
openbr/core/boost.cpp
| ... | ... | @@ -144,7 +144,7 @@ void FeatureEvaluator::init(Representation *_representation, int _maxSampleCount |
| 144 | 144 | representation = _representation; |
| 145 | 145 | |
| 146 | 146 | int dx, dy; |
| 147 | - Size windowSize = representation->windowSize(dx, dy); | |
| 147 | + Size windowSize = representation->windowSize(&dx, &dy); | |
| 148 | 148 | data.create((int)_maxSampleCount, Size(windowSize.width + dx, windowSize.height + dy).area(), CV_32SC1); |
| 149 | 149 | cls.create( (int)_maxSampleCount, 1, CV_32FC1 ); |
| 150 | 150 | } |
| ... | ... | @@ -154,7 +154,7 @@ void FeatureEvaluator::setImage(const Mat &img, uchar clsLabel, int idx) |
| 154 | 154 | cls.ptr<float>(idx)[0] = clsLabel; |
| 155 | 155 | |
| 156 | 156 | int dx, dy; |
| 157 | - Size windowSize = representation->windowSize(dx, dy); | |
| 157 | + Size windowSize = representation->windowSize(&dx, &dy); | |
| 158 | 158 | Mat integralImg(Size(windowSize.width + dx, windowSize.height + dy), data.type(), data.ptr<int>(idx)); |
| 159 | 159 | representation->preprocess(img, integralImg); |
| 160 | 160 | } | ... | ... |
openbr/core/cascade.cpp
| ... | ... | @@ -232,7 +232,7 @@ void _CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& object |
| 232 | 232 | |
| 233 | 233 | for (double factor = 1; ; factor *= scaleFactor) { |
| 234 | 234 | int dx, dy; |
| 235 | - Size originalWindowSize = representation->windowSize(dx, dy); | |
| 235 | + Size originalWindowSize = representation->windowSize(&dx, &dy); | |
| 236 | 236 | |
| 237 | 237 | Size windowSize(cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) ); |
| 238 | 238 | Size scaledImageSize(cvRound(image.cols/factor ), cvRound(image.rows/factor)); | ... | ... |
openbr/openbr_plugin.h
| ... | ... | @@ -1407,7 +1407,7 @@ public: |
| 1407 | 1407 | // and returned. |
| 1408 | 1408 | virtual cv::Mat evaluate(const cv::Mat &image, const QList<int> &indices = QList<int>()) const = 0; |
| 1409 | 1409 | |
| 1410 | - virtual cv::Size windowSize(int &dx, int &dy) const = 0; // dx and dy should indicate the change to the original window size after preprocessing | |
| 1410 | + virtual cv::Size windowSize(int *dx = NULL, int *dy = NULL) const = 0; // dx and dy should indicate the change to the original window size after preprocessing | |
| 1411 | 1411 | virtual int numFeatures() const = 0; |
| 1412 | 1412 | virtual int maxCatCount() const = 0; |
| 1413 | 1413 | }; |
| ... | ... | @@ -1422,11 +1422,11 @@ public: |
| 1422 | 1422 | static Classifier *make(QString str, QObject *parent); /*!< \brief Make a classifier from a string. */ |
| 1423 | 1423 | |
| 1424 | 1424 | virtual void train(const QList<cv::Mat> &images, const QList<float> &labels) = 0; |
| 1425 | - virtual float classify(const cv::Mat &image, float &confidence) const = 0; | |
| 1425 | + virtual float classify(const cv::Mat &image, float *confidence = NULL) const = 0; | |
| 1426 | 1426 | |
| 1427 | 1427 | // Slots for representation |
| 1428 | 1428 | virtual cv::Mat preprocess(const cv::Mat &image) const = 0; |
| 1429 | - virtual cv::Size windowSize(int &dx, int &dy) const = 0; | |
| 1429 | + virtual cv::Size windowSize(int *dx = NULL, int *dy = NULL) const = 0; | |
| 1430 | 1430 | |
| 1431 | 1431 | // OpenCV compatibility |
| 1432 | 1432 | virtual int numFeatures() const = 0; | ... | ... |
openbr/plugins/classification/boostedforest.cpp
| ... | ... | @@ -129,9 +129,9 @@ class BoostedForestClassifier : public Classifier |
| 129 | 129 | } |
| 130 | 130 | } |
| 131 | 131 | |
| 132 | - float classify(const Mat &image, float &confidence) const | |
| 132 | + float classify(const Mat &image, float *confidence) const | |
| 133 | 133 | { |
| 134 | - confidence = 0; | |
| 134 | + float sum = 0; | |
| 135 | 135 | for (int i = 0; i < classifiers.size(); i++) { |
| 136 | 136 | Node *node = classifiers[i]; |
| 137 | 137 | |
| ... | ... | @@ -144,10 +144,12 @@ class BoostedForestClassifier : public Classifier |
| 144 | 144 | node = val <= node->threshold ? node->left : node->right; |
| 145 | 145 | } |
| 146 | 146 | } |
| 147 | - confidence += node->value; | |
| 147 | + sum += node->value; | |
| 148 | 148 | } |
| 149 | 149 | |
| 150 | - return confidence < threshold - THRESHOLD_EPS ? 0.0f : 1.0f; | |
| 150 | + if (confidence) | |
| 151 | + *confidence = sum; | |
| 152 | + return sum < threshold - THRESHOLD_EPS ? 0.0f : 1.0f; | |
| 151 | 153 | } |
| 152 | 154 | |
| 153 | 155 | int numFeatures() const |
| ... | ... | @@ -167,7 +169,7 @@ class BoostedForestClassifier : public Classifier |
| 167 | 169 | return dst; |
| 168 | 170 | } |
| 169 | 171 | |
| 170 | - Size windowSize(int &dx, int &dy) const | |
| 172 | + Size windowSize(int *dx, int *dy) const | |
| 171 | 173 | { |
| 172 | 174 | return representation->windowSize(dx, dy); |
| 173 | 175 | } | ... | ... |
openbr/plugins/classification/cascade.cpp
| ... | ... | @@ -152,23 +152,18 @@ class CascadeClassifier : public Classifier |
| 152 | 152 | } |
| 153 | 153 | } |
| 154 | 154 | |
| 155 | - float classify(const Mat &image, float &confidence) const | |
| 155 | + float classify(const Mat &image, float *confidence) const | |
| 156 | 156 | { |
| 157 | - if (stages.empty()) { | |
| 158 | - confidence = 0.0f; | |
| 159 | - return 1.0f; | |
| 160 | - } | |
| 161 | - | |
| 162 | - for (int i = 0; i < stages.size(); i++) { | |
| 163 | - float result = stages[i]->classify(image, confidence); | |
| 157 | + float stageConf = 0.0f; | |
| 158 | + foreach (const Classifier *stage, stages) { | |
| 159 | + float result = stage->classify(image, &stageConf); | |
| 164 | 160 | if (result == 0.0f) { |
| 165 | - //confidence *= i; | |
| 166 | - return i; | |
| 161 | + if (confidence) | |
| 162 | + *confidence += stageConf; | |
| 163 | + return 0.0f; | |
| 167 | 164 | } |
| 168 | 165 | } |
| 169 | - | |
| 170 | - //confidence *= stages.size(); | |
| 171 | - return stages.size(); | |
| 166 | + return 1.0f; | |
| 172 | 167 | } |
| 173 | 168 | |
| 174 | 169 | int numFeatures() const |
| ... | ... | @@ -186,7 +181,7 @@ class CascadeClassifier : public Classifier |
| 186 | 181 | return stages.first()->preprocess(image); |
| 187 | 182 | } |
| 188 | 183 | |
| 189 | - Size windowSize(int &dx, int &dy) const | |
| 184 | + Size windowSize(int *dx, int *dy) const | |
| 190 | 185 | { |
| 191 | 186 | return stages.first()->windowSize(dx, dy); |
| 192 | 187 | } |
| ... | ... | @@ -217,14 +212,14 @@ private: |
| 217 | 212 | { |
| 218 | 213 | imgHandler.restart(); |
| 219 | 214 | |
| 220 | - float confidence = 0.0f; // not used; | |
| 215 | + float confidence = 0.0f; | |
| 221 | 216 | |
| 222 | 217 | while (images.size() < numPos) { |
| 223 | 218 | Mat pos(imgHandler.winSize, CV_8UC1); |
| 224 | 219 | if (!imgHandler.getPos(pos)) |
| 225 | 220 | qFatal("Cannot get another positive sample!"); |
| 226 | 221 | |
| 227 | - if (classify(pos, confidence) > 0.0f) { | |
| 222 | + if (classify(pos, &confidence) > 0.0f) { | |
| 228 | 223 | printf("POS current samples: %d\r", images.size()); |
| 229 | 224 | images.append(pos); |
| 230 | 225 | labels.append(1.0f); |
| ... | ... | @@ -240,7 +235,7 @@ private: |
| 240 | 235 | if (!imgHandler.getNeg(neg)) |
| 241 | 236 | qFatal("Cannot get another negative sample!"); |
| 242 | 237 | |
| 243 | - if (classify(neg, confidence) > 0.0f) { | |
| 238 | + if (classify(neg, &confidence) > 0.0f) { | |
| 244 | 239 | printf("NEG current samples: %d\r", images.size() - posCount); |
| 245 | 240 | images.append(neg); |
| 246 | 241 | labels.append(0.0f); | ... | ... |
openbr/plugins/imgproc/slidingwindow.cpp
| ... | ... | @@ -100,7 +100,7 @@ class SlidingWindowTransform : public MetaTransform |
| 100 | 100 | |
| 101 | 101 | for (double factor = 1; ; factor *= scaleFactor) { |
| 102 | 102 | int dx, dy; |
| 103 | - Size originalWindowSize = classifier->windowSize(dx, dy); | |
| 103 | + Size originalWindowSize = classifier->windowSize(&dx, &dy); | |
| 104 | 104 | |
| 105 | 105 | Size windowSize(cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) ); |
| 106 | 106 | Size scaledImageSize(cvRound(m.cols/factor ), cvRound(m.rows/factor)); |
| ... | ... | @@ -124,7 +124,7 @@ class SlidingWindowTransform : public MetaTransform |
| 124 | 124 | Mat window = repImage(Rect(Point(x, y), Size(originalWindowSize.width + dx, originalWindowSize.height + dy))).clone(); |
| 125 | 125 | |
| 126 | 126 | float gypWeight; |
| 127 | - int result = classifier->classify(window, gypWeight); | |
| 127 | + int result = classifier->classify(window, &gypWeight); | |
| 128 | 128 | |
| 129 | 129 | if (12 - result < 4) { |
| 130 | 130 | rects.push_back(Rect(cvRound(x*factor), cvRound(y*factor), windowSize.width, windowSize.height)); | ... | ... |
openbr/plugins/representation/haar.cpp
| ... | ... | @@ -89,7 +89,14 @@ class HaarRepresentation : public Representation |
| 89 | 89 | } |
| 90 | 90 | |
| 91 | 91 | int numFeatures() const { return features.size(); } |
| 92 | - Size windowSize(int &dx, int &dy) const { dx = dy = 1; return Size(winWidth, winHeight); } | |
| 92 | + | |
| 93 | + Size windowSize(int *dx, int *dy) const | |
| 94 | + { | |
| 95 | + if (dx && dy) | |
| 96 | + *dx = *dy = 1; | |
| 97 | + return Size(winWidth, winHeight); | |
| 98 | + } | |
| 99 | + | |
| 93 | 100 | int maxCatCount() const { return 0; } |
| 94 | 101 | |
| 95 | 102 | struct Feature | ... | ... |
openbr/plugins/representation/mblbp.cpp
| ... | ... | @@ -58,7 +58,13 @@ class MBLBPRepresentation : public Representation |
| 58 | 58 | return result; |
| 59 | 59 | } |
| 60 | 60 | |
| 61 | - Size windowSize(int &dx, int &dy) const { dx = dy = 1; return Size(winWidth, winHeight); } | |
| 61 | + Size windowSize(int *dx, int *dy) const | |
| 62 | + { | |
| 63 | + if (dx && dy) | |
| 64 | + *dx = *dy = 1; | |
| 65 | + return Size(winWidth, winHeight); | |
| 66 | + } | |
| 67 | + | |
| 62 | 68 | int numFeatures() const { return features.size(); } |
| 63 | 69 | int maxCatCount() const { return 256; } |
| 64 | 70 | ... | ... |
openbr/plugins/representation/npd.cpp
0 → 100644
| 1 | +#include <openbr/plugins/openbr_internal.h> | |
| 2 | + | |
| 3 | +using namespace cv; | |
| 4 | + | |
| 5 | +namespace br | |
| 6 | +{ | |
| 7 | + | |
| 8 | +class NPDRepresentation : public Representation | |
| 9 | +{ | |
| 10 | + Q_OBJECT | |
| 11 | + | |
| 12 | + Q_PROPERTY(int winWidth READ get_winWidth WRITE set_winWidth RESET reset_winWidth STORED false) | |
| 13 | + Q_PROPERTY(int winHeight READ get_winHeight WRITE set_winHeight RESET reset_winHeight STORED false) | |
| 14 | + BR_PROPERTY(int, winWidth, 24) | |
| 15 | + BR_PROPERTY(int, winHeight, 24) | |
| 16 | + | |
| 17 | + void init() | |
| 18 | + { | |
| 19 | + for (int p1 = 0; p1 < (winWidth * winHeight); p1++) | |
| 20 | + for (int p2 = p1; p2 < (winWidth * winHeight); p2++) | |
| 21 | + features.append(Feature(p1, p2)); | |
| 22 | + } | |
| 23 | + | |
| 24 | + float evaluate(const Mat &image, int idx) const | |
| 25 | + { | |
| 26 | + return features[idx].calc(image); | |
| 27 | + } | |
| 28 | + | |
| 29 | + Size windowSize(int *dx, int *dy) const | |
| 30 | + { | |
| 31 | + if (dx && dy) | |
| 32 | + *dx = *dy = 0; | |
| 33 | + return Size(winWidth, winHeight); | |
| 34 | + } | |
| 35 | + | |
| 36 | + struct Feature | |
| 37 | + { | |
| 38 | + Feature() {} | |
| 39 | + Feature(int p1, int p2) { p[0] = p1; p[1] = p2; } | |
| 40 | + float calc(const Mat &image) const; | |
| 41 | + | |
| 42 | + int p[2]; | |
| 43 | + }; | |
| 44 | + QList<Feature> features; | |
| 45 | +}; | |
| 46 | + | |
| 47 | +BR_REGISTER(Representation, NPDRepresentation) | |
| 48 | + | |
| 49 | +} // namespace br | |
| 50 | + | |
| 51 | +#include "representation/npd.moc" | ... | ... |