Commit a231cbed0cac8f199d17de0f0c526e81faef922f

Authored by Jordan Cheney
1 parent 98ce6592

Fixed compile bug in store and update windowSize to be more elegant

openbr/core/boost.cpp
@@ -142,7 +142,10 @@ static CvMat* cvPreprocessIndexArray( const CvMat* idx_arr, int data_arr_size, b @@ -142,7 +142,10 @@ static CvMat* cvPreprocessIndexArray( const CvMat* idx_arr, int data_arr_size, b
142 void FeatureEvaluator::init(Representation *_representation, int _maxSampleCount) 142 void FeatureEvaluator::init(Representation *_representation, int _maxSampleCount)
143 { 143 {
144 representation = _representation; 144 representation = _representation;
145 - data.create((int)_maxSampleCount, representation->postWindowSize().area(), CV_32SC1); 145 +
  146 + int dx, dy;
  147 + Size windowSize = representation->windowSize(dx, dy);
  148 + data.create((int)_maxSampleCount, Size(windowSize.width + dx, windowSize.height + dy).area(), CV_32SC1);
146 cls.create( (int)_maxSampleCount, 1, CV_32FC1 ); 149 cls.create( (int)_maxSampleCount, 1, CV_32FC1 );
147 } 150 }
148 151
@@ -150,7 +153,9 @@ void FeatureEvaluator::setImage(const Mat &img, uchar clsLabel, int idx) @@ -150,7 +153,9 @@ void FeatureEvaluator::setImage(const Mat &img, uchar clsLabel, int idx)
150 { 153 {
151 cls.ptr<float>(idx)[0] = clsLabel; 154 cls.ptr<float>(idx)[0] = clsLabel;
152 155
153 - Mat integralImg(representation->postWindowSize(), data.type(), data.ptr<int>(idx)); 156 + int dx, dy;
  157 + Size windowSize = representation->windowSize(dx, dy);
  158 + Mat integralImg(Size(windowSize.width + dx, windowSize.height + dy), data.type(), data.ptr<int>(idx));
154 representation->preprocess(img, integralImg); 159 representation->preprocess(img, integralImg);
155 } 160 }
156 161
openbr/core/cascade.cpp
@@ -231,7 +231,8 @@ void _CascadeClassifier::detectMultiScale(const Mat&amp; image, vector&lt;Rect&gt;&amp; object @@ -231,7 +231,8 @@ void _CascadeClassifier::detectMultiScale(const Mat&amp; image, vector&lt;Rect&gt;&amp; object
231 Mat imageBuffer(image.rows + 1, image.cols + 1, CV_8U); 231 Mat imageBuffer(image.rows + 1, image.cols + 1, CV_8U);
232 232
233 for (double factor = 1; ; factor *= scaleFactor) { 233 for (double factor = 1; ; factor *= scaleFactor) {
234 - Size originalWindowSize = representation->preWindowSize(); 234 + int dx, dy;
  235 + Size originalWindowSize = representation->windowSize(dx, dy);
235 236
236 Size windowSize(cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) ); 237 Size windowSize(cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) );
237 Size scaledImageSize(cvRound(image.cols/factor ), cvRound(image.rows/factor)); 238 Size scaledImageSize(cvRound(image.cols/factor ), cvRound(image.rows/factor));
@@ -253,7 +254,7 @@ void _CascadeClassifier::detectMultiScale(const Mat&amp; image, vector&lt;Rect&gt;&amp; object @@ -253,7 +254,7 @@ void _CascadeClassifier::detectMultiScale(const Mat&amp; image, vector&lt;Rect&gt;&amp; object
253 int yStep = factor > 2. ? 1 : 2; 254 int yStep = factor > 2. ? 1 : 2;
254 for (int y = 0; y < processingRectSize.height; y += yStep) { 255 for (int y = 0; y < processingRectSize.height; y += yStep) {
255 for (int x = 0; x < processingRectSize.width; x += yStep) { 256 for (int x = 0; x < processingRectSize.width; x += yStep) {
256 - Mat window = repImage(Rect(Point(x, y), representation->postWindowSize())).clone(); 257 + Mat window = repImage(Rect(Point(x, y), Size(originalWindowSize.width + dx, originalWindowSize.height + dy))).clone();
257 258
258 double gypWeight; 259 double gypWeight;
259 int result = predict(window, gypWeight); 260 int result = predict(window, gypWeight);
openbr/openbr_plugin.h
@@ -1407,8 +1407,7 @@ public: @@ -1407,8 +1407,7 @@ public:
1407 // and returned. 1407 // and returned.
1408 virtual cv::Mat evaluate(const cv::Mat &image, const QList<int> &indices = QList<int>()) const = 0; 1408 virtual cv::Mat evaluate(const cv::Mat &image, const QList<int> &indices = QList<int>()) const = 0;
1409 1409
1410 - virtual cv::Size preWindowSize() const = 0; // window size before preprocessing  
1411 - virtual cv::Size postWindowSize() const = 0; // window size after preprocessing 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
1412 virtual int numFeatures() const = 0; 1411 virtual int numFeatures() const = 0;
1413 virtual int maxCatCount() const = 0; 1412 virtual int maxCatCount() const = 0;
1414 }; 1413 };
@@ -1427,7 +1426,7 @@ public: @@ -1427,7 +1426,7 @@ public:
1427 1426
1428 // Slots for representation 1427 // Slots for representation
1429 virtual cv::Mat preprocess(const cv::Mat &image) const = 0; 1428 virtual cv::Mat preprocess(const cv::Mat &image) const = 0;
1430 - virtual cv::Size windowSize() const = 0; 1429 + virtual cv::Size windowSize(int &dx, int &dy) const = 0;
1431 1430
1432 // OpenCV compatibility 1431 // OpenCV compatibility
1433 virtual int numFeatures() const = 0; 1432 virtual int numFeatures() const = 0;
openbr/plugins/classification/boostedforest.cpp
@@ -167,9 +167,9 @@ class BoostedForestClassifier : public Classifier @@ -167,9 +167,9 @@ class BoostedForestClassifier : public Classifier
167 return dst; 167 return dst;
168 } 168 }
169 169
170 - Size windowSize() const 170 + Size windowSize(int &dx, int &dy) const
171 { 171 {
172 - return representation->preWindowSize(); 172 + return representation->windowSize(dx, dy);
173 } 173 }
174 174
175 void read(const FileNode &node) 175 void read(const FileNode &node)
openbr/plugins/classification/cascade.cpp
@@ -186,9 +186,9 @@ class CascadeClassifier : public Classifier @@ -186,9 +186,9 @@ class CascadeClassifier : public Classifier
186 return stages.first()->preprocess(image); 186 return stages.first()->preprocess(image);
187 } 187 }
188 188
189 - Size windowSize() const 189 + Size windowSize(int &dx, int &dy) const
190 { 190 {
191 - return stages.first()->windowSize(); 191 + return stages.first()->windowSize(dx, dy);
192 } 192 }
193 193
194 void read(const FileNode &node) 194 void read(const FileNode &node)
openbr/plugins/imgproc/slidingwindow.cpp
@@ -99,7 +99,8 @@ class SlidingWindowTransform : public MetaTransform @@ -99,7 +99,8 @@ class SlidingWindowTransform : public MetaTransform
99 Mat imageBuffer(m.rows + 1, m.cols + 1, CV_8U); 99 Mat imageBuffer(m.rows + 1, m.cols + 1, CV_8U);
100 100
101 for (double factor = 1; ; factor *= scaleFactor) { 101 for (double factor = 1; ; factor *= scaleFactor) {
102 - Size originalWindowSize(24, 24); 102 + int dx, dy;
  103 + Size originalWindowSize = classifier->windowSize(dx, dy);
103 104
104 Size windowSize(cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) ); 105 Size windowSize(cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) );
105 Size scaledImageSize(cvRound(m.cols/factor ), cvRound(m.rows/factor)); 106 Size scaledImageSize(cvRound(m.cols/factor ), cvRound(m.rows/factor));
@@ -120,7 +121,7 @@ class SlidingWindowTransform : public MetaTransform @@ -120,7 +121,7 @@ class SlidingWindowTransform : public MetaTransform
120 int step = factor > 2. ? 1 : 2; 121 int step = factor > 2. ? 1 : 2;
121 for (int y = 0; y < processingRectSize.height; y += step) { 122 for (int y = 0; y < processingRectSize.height; y += step) {
122 for (int x = 0; x < processingRectSize.width; x += step) { 123 for (int x = 0; x < processingRectSize.width; x += step) {
123 - Mat window = repImage(Rect(Point(x, y), Size(25,25))).clone(); 124 + Mat window = repImage(Rect(Point(x, y), Size(originalWindowSize.width + dx, originalWindowSize.height + dy))).clone();
124 125
125 float gypWeight; 126 float gypWeight;
126 int result = classifier->classify(window, gypWeight); 127 int result = classifier->classify(window, gypWeight);
@@ -173,7 +174,7 @@ class SlidingWindowTransform : public MetaTransform @@ -173,7 +174,7 @@ class SlidingWindowTransform : public MetaTransform
173 { 174 {
174 (void) stream; 175 (void) stream;
175 176
176 - QString path = Globals->sdkPath + "/share/openbr/models/openbrcascades/" + cascadeDir; 177 + QString path = Globals->sdkPath + "/share/openbr/models/openbrcascades/" + model;
177 QtUtils::touchDir(QDir(path)); 178 QtUtils::touchDir(QDir(path));
178 179
179 QString filename = path + "/cascade.xml"; 180 QString filename = path + "/cascade.xml";
openbr/plugins/representation/haar.cpp
@@ -89,8 +89,7 @@ class HaarRepresentation : public Representation @@ -89,8 +89,7 @@ class HaarRepresentation : public Representation
89 } 89 }
90 90
91 int numFeatures() const { return features.size(); } 91 int numFeatures() const { return features.size(); }
92 - Size preWindowSize() const { return Size(winWidth, winHeight); }  
93 - Size postWindowSize() const { return Size(winWidth + 1, winHeight + 1); } 92 + Size windowSize(int &dx, int &dy) const { dx = dy = 1; return Size(winWidth, winHeight); }
94 int maxCatCount() const { return 0; } 93 int maxCatCount() const { return 0; }
95 94
96 struct Feature 95 struct Feature
openbr/plugins/representation/mblbp.cpp
@@ -58,9 +58,8 @@ class MBLBPRepresentation : public Representation @@ -58,9 +58,8 @@ class MBLBPRepresentation : public Representation
58 return result; 58 return result;
59 } 59 }
60 60
  61 + Size windowSize(int &dx, int &dy) const { dx = dy = 1; return Size(winWidth, winHeight); }
61 int numFeatures() const { return features.size(); } 62 int numFeatures() const { return features.size(); }
62 - Size preWindowSize() const { return Size(winWidth, winHeight); }  
63 - Size postWindowSize() const { return Size(winWidth + 1, winHeight + 1); }  
64 int maxCatCount() const { return 256; } 63 int maxCatCount() const { return 256; }
65 64
66 struct Feature 65 struct Feature
@@ -77,16 +76,28 @@ class MBLBPRepresentation : public Representation @@ -77,16 +76,28 @@ class MBLBPRepresentation : public Representation
77 76
78 BR_REGISTER(Representation, MBLBPRepresentation) 77 BR_REGISTER(Representation, MBLBPRepresentation)
79 78
  79 +static inline void calcOffset(int &p0, int &p1, int &p2, int &p3, Rect rect, int offset)
  80 +{
  81 + /* (x, y) */
  82 + p0 = rect.x + offset * rect.y;
  83 + /* (x + w, y) */
  84 + p1 = rect.x + rect.width + offset * rect.y;
  85 + /* (x + w, y) */
  86 + p2 = rect.x + offset * (rect.y + rect.height);
  87 + /* (x + w, y + h) */
  88 + p3 = rect.x + rect.width + offset * (rect.y + rect.height);
  89 +}
  90 +
80 MBLBPRepresentation::Feature::Feature( int offset, int x, int y, int _blockWidth, int _blockHeight ) 91 MBLBPRepresentation::Feature::Feature( int offset, int x, int y, int _blockWidth, int _blockHeight )
81 { 92 {
82 Rect tr = rect = cvRect(x, y, _blockWidth, _blockHeight); 93 Rect tr = rect = cvRect(x, y, _blockWidth, _blockHeight);
83 - CV_SUM_OFFSETS( p[0], p[1], p[4], p[5], tr, offset ) 94 + calcOffset(p[0], p[1], p[4], p[5], tr, offset);
84 tr.x += 2*rect.width; 95 tr.x += 2*rect.width;
85 - CV_SUM_OFFSETS( p[2], p[3], p[6], p[7], tr, offset ) 96 + calcOffset(p[2], p[3], p[6], p[7], tr, offset);
86 tr.y +=2*rect.height; 97 tr.y +=2*rect.height;
87 - CV_SUM_OFFSETS( p[10], p[11], p[14], p[15], tr, offset ) 98 + calcOffset(p[10], p[11], p[14], p[15], tr, offset);
88 tr.x -= 2*rect.width; 99 tr.x -= 2*rect.width;
89 - CV_SUM_OFFSETS( p[8], p[9], p[12], p[13], tr, offset ) 100 + calcOffset(p[8], p[9], p[12], p[13], tr, offset);
90 } 101 }
91 102
92 inline uchar MBLBPRepresentation::Feature::calc(const Mat &img) const 103 inline uchar MBLBPRepresentation::Feature::calc(const Mat &img) const