Commit c11e9eec8ec440f8fb664ce850e1fd9195740896

Authored by Josh Klontz
Committed by Brendan Klare
1 parent 17e0d318

Factor out multi-template per detection into new transform

openbr/plugins/slidingwindow.cpp
@@ -38,7 +38,7 @@ static float getAspectRatio(const TemplateList &data) @@ -38,7 +38,7 @@ static float getAspectRatio(const TemplateList &data)
38 * Discards negative detections. 38 * Discards negative detections.
39 * \author Austin Blanton \cite imaus10 39 * \author Austin Blanton \cite imaus10
40 */ 40 */
41 -class SlidingWindowTransform : public MetaTransform 41 +class SlidingWindowTransform : public Transform
42 { 42 {
43 Q_OBJECT 43 Q_OBJECT
44 Q_PROPERTY(br::Transform *transform READ get_transform WRITE set_transform RESET reset_transform STORED false) 44 Q_PROPERTY(br::Transform *transform READ get_transform WRITE set_transform RESET reset_transform STORED false)
@@ -93,6 +93,14 @@ private: @@ -93,6 +93,14 @@ private:
93 93
94 void project(const Template &src, Template &dst) const 94 void project(const Template &src, Template &dst) const
95 { 95 {
  96 + float scale = src.file.get<float>("scale", 1);
  97 + projectHelp(src, dst, windowWidth, windowHeight, scale);
  98 + }
  99 +
  100 + protected:
  101 + void projectHelp(const Template &src, Template &dst, int windowWidth, int windowHeight, float scale = 1) const
  102 + {
  103 +
96 dst = src; 104 dst = src;
97 if (skipProject) { 105 if (skipProject) {
98 dst = src; 106 dst = src;
@@ -100,11 +108,10 @@ private: @@ -100,11 +108,10 @@ private:
100 } 108 }
101 109
102 dst.file.clearRects(); 110 dst.file.clearRects();
103 - float scale = src.file.get<float>("scale", 1);  
104 Template windowTemplate(src.file, src); 111 Template windowTemplate(src.file, src);
105 QList<float> confidences = dst.file.getList<float>("Confidences", QList<float>()); 112 QList<float> confidences = dst.file.getList<float>("Confidences", QList<float>());
106 - for (double y = 0; y + windowHeight < src.m().rows; y += stepSize) {  
107 - for (double x = 0; x + windowWidth < src.m().cols; x += stepSize) { 113 + for (float y = 0; y + windowHeight < src.m().rows; y += windowHeight*stepFraction) {
  114 + for (float x = 0; x + windowWidth < src.m().cols; x += windowWidth*stepFraction) {
108 Mat windowMat(src, Rect(x, y, windowWidth, windowHeight)); 115 Mat windowMat(src, Rect(x, y, windowWidth, windowHeight));
109 windowTemplate.replace(0,windowMat); 116 windowTemplate.replace(0,windowMat);
110 Template detect; 117 Template detect;
@@ -113,7 +120,7 @@ private: @@ -113,7 +120,7 @@ private:
113 120
114 // the result will be in the Label 121 // the result will be in the Label
115 if (conf > threshold) { 122 if (conf > threshold) {
116 - dst.file.appendRect(QRectF((float) x * scale, (float) y * scale, (float) windowWidth * scale, (float) windowHeight * scale)); 123 + dst.file.appendRect(QRectF(x*scale, y*scale, windowWidth*scale, windowHeight*scale));
117 confidences.append(conf); 124 confidences.append(conf);
118 if (takeFirst) 125 if (takeFirst)
119 return; 126 return;
@@ -136,7 +143,8 @@ class IntegralSlidingWindowTransform : public SlidingWindowTransform @@ -136,7 +143,8 @@ class IntegralSlidingWindowTransform : public SlidingWindowTransform
136 { 143 {
137 Q_OBJECT 144 Q_OBJECT
138 145
139 - void project(const TemplateList &src, TemplateList &dst) const 146 + private:
  147 + void project(const Template &src, Template &dst) const
140 { 148 {
141 // TODO: call SlidingWindowTransform::project on multiple scales 149 // TODO: call SlidingWindowTransform::project on multiple scales
142 SlidingWindowTransform::projectHelp(src, dst, 24, 24); 150 SlidingWindowTransform::projectHelp(src, dst, 24, 24);
@@ -212,7 +220,7 @@ static TemplateList cropTrainingSamples(const TemplateList &amp;data, const float as @@ -212,7 +220,7 @@ static TemplateList cropTrainingSamples(const TemplateList &amp;data, const float as
212 * \brief . 220 * \brief .
213 * \author Austin Blanton \cite imaus10 221 * \author Austin Blanton \cite imaus10
214 */ 222 */
215 -class BuildScalesTransform : public MetaTransform 223 +class BuildScalesTransform : public Transform
216 { 224 {
217 Q_OBJECT 225 Q_OBJECT
218 Q_PROPERTY(br::Transform *transform READ get_transform WRITE set_transform RESET reset_transform STORED false) 226 Q_PROPERTY(br::Transform *transform READ get_transform WRITE set_transform RESET reset_transform STORED false)
@@ -486,6 +494,36 @@ private: @@ -486,6 +494,36 @@ private:
486 494
487 BR_REGISTER(Transform, ConsolidateDetectionsTransform) 495 BR_REGISTER(Transform, ConsolidateDetectionsTransform)
488 496
  497 +/*!
  498 + * \ingroup transforms
  499 + * \brief For each rectangle bounding box in TemplateList, a new
  500 + * template is created.
  501 + * \author Brendan Klare \cite bklare
  502 + */
  503 +class RectsToTemplatesTransform : public UntrainableMetaTransform
  504 +{
  505 + Q_OBJECT
  506 +
  507 +private:
  508 + void project(const Template &src, Template &dst) const
  509 + {
  510 + Template tOut(src.file);
  511 + QList<float> confidences = src.file.getList<float>("Confidences");
  512 + QList<QRectF> rects = src.file.rects();
  513 + for (int i = 0; i < rects.size(); i++) {
  514 + Mat m(src, OpenCVUtils::toRect(rects[i]));
  515 + Template t(src.file, m);
  516 + t.file.set("Confidence", confidences[i]);
  517 + t.file.clearRects();
  518 + tOut << t;
  519 + }
  520 + dst = tOut;
  521 + }
  522 +};
  523 +
  524 +BR_REGISTER(Transform, RectsToTemplatesTransform)
  525 +
  526 +
489 } // namespace br 527 } // namespace br
490 528
491 #include "slidingwindow.moc" 529 #include "slidingwindow.moc"