Commit 2ac9c2d5d064c9aababd94a2097e60ee88e3e4b3

Authored by Scott Klum
2 parents db05fbdc 011017d3

Fixed conflicts

openbr/openbr_plugin.h
@@ -1206,7 +1206,7 @@ public: @@ -1206,7 +1206,7 @@ public:
1206 static QSharedPointer<Distance> fromAlgorithm(const QString &algorithm); /*!< \brief Retrieve an algorithm's distance. */ 1206 static QSharedPointer<Distance> fromAlgorithm(const QString &algorithm); /*!< \brief Retrieve an algorithm's distance. */
1207 virtual void train(const TemplateList &src) { (void) src; } /*!< \brief Train the distance. */ 1207 virtual void train(const TemplateList &src) { (void) src; } /*!< \brief Train the distance. */
1208 virtual void compare(const TemplateList &target, const TemplateList &query, Output *output) const; /*!< \brief Compare two template lists. */ 1208 virtual void compare(const TemplateList &target, const TemplateList &query, Output *output) const; /*!< \brief Compare two template lists. */
1209 - QList<float> compare(const TemplateList &targets, const Template &query) const; /*!< \brief Compute the normalized distance between a template and a template list. */ 1209 + virtual QList<float> compare(const TemplateList &targets, const Template &query) const; /*!< \brief Compute the normalized distance between a template and a template list. */
1210 virtual float compare(const Template &a, const Template &b) const = 0; /*!< \brief Compute the distance between two templates. */ 1210 virtual float compare(const Template &a, const Template &b) const = 0; /*!< \brief Compute the distance between two templates. */
1211 1211
1212 protected: 1212 protected:
openbr/plugins/draw.cpp
@@ -25,7 +25,10 @@ namespace br @@ -25,7 +25,10 @@ namespace br
25 25
26 /*! 26 /*!
27 * \ingroup transforms 27 * \ingroup transforms
28 - * \brief Renders metadata onto the image 28 + * \brief Renders metadata onto the image.
  29 + *
  30 + * The inPlace argument controls whether or not the image is cloned before the metadata is drawn.
  31 + *
29 * \author Josh Klontz \cite jklontz 32 * \author Josh Klontz \cite jklontz
30 */ 33 */
31 class DrawTransform : public UntrainableTransform 34 class DrawTransform : public UntrainableTransform
@@ -34,15 +37,17 @@ class DrawTransform : public UntrainableTransform @@ -34,15 +37,17 @@ class DrawTransform : public UntrainableTransform
34 Q_PROPERTY(bool verbose READ get_verbose WRITE set_verbose RESET reset_verbose STORED false) 37 Q_PROPERTY(bool verbose READ get_verbose WRITE set_verbose RESET reset_verbose STORED false)
35 Q_PROPERTY(bool points READ get_points WRITE set_points RESET reset_points STORED false) 38 Q_PROPERTY(bool points READ get_points WRITE set_points RESET reset_points STORED false)
36 Q_PROPERTY(bool rects READ get_rects WRITE set_rects RESET reset_rects STORED false) 39 Q_PROPERTY(bool rects READ get_rects WRITE set_rects RESET reset_rects STORED false)
  40 + Q_PROPERTY(bool inPlace READ get_inPlace WRITE set_inPlace RESET reset_inPlace STORED false)
37 BR_PROPERTY(bool, verbose, false) 41 BR_PROPERTY(bool, verbose, false)
38 BR_PROPERTY(bool, points, true) 42 BR_PROPERTY(bool, points, true)
39 BR_PROPERTY(bool, rects, true) 43 BR_PROPERTY(bool, rects, true)
  44 + BR_PROPERTY(bool, inPlace, false)
40 45
41 void project(const Template &src, Template &dst) const 46 void project(const Template &src, Template &dst) const
42 { 47 {
43 const Scalar color(0,255,0); 48 const Scalar color(0,255,0);
44 - const Scalar verboseColor(0, 0, 0);  
45 - dst = src.m().clone(); 49 + const Scalar verboseColor(255, 255, 0);
  50 + dst.m() = inPlace ? src.m() : src.m().clone();
46 51
47 if (points) { 52 if (points) {
48 const QList<Point2f> pointsList = OpenCVUtils::toPoints(src.file.namedPoints() + src.file.points()); 53 const QList<Point2f> pointsList = OpenCVUtils::toPoints(src.file.namedPoints() + src.file.points());
@@ -62,13 +67,23 @@ class DrawTransform : public UntrainableTransform @@ -62,13 +67,23 @@ class DrawTransform : public UntrainableTransform
62 BR_REGISTER(Transform, DrawTransform) 67 BR_REGISTER(Transform, DrawTransform)
63 68
64 69
  70 +/*!
  71 + * \ingroup transforms
  72 + * \brief Draw the value of the specified property at the specified point on the image
  73 + *
  74 + * The inPlace argument controls whether or not the image is cloned before it is drawn on.
  75 + *
  76 + * \author Charles Otto \cite caotto
  77 + */
65 class DrawPropertyPointTransform : public UntrainableTransform 78 class DrawPropertyPointTransform : public UntrainableTransform
66 { 79 {
67 Q_OBJECT 80 Q_OBJECT
68 Q_PROPERTY(QString propName READ get_propName WRITE set_propName RESET reset_propName STORED false) 81 Q_PROPERTY(QString propName READ get_propName WRITE set_propName RESET reset_propName STORED false)
69 Q_PROPERTY(QString pointName READ get_pointName WRITE set_pointName RESET reset_pointName STORED false) 82 Q_PROPERTY(QString pointName READ get_pointName WRITE set_pointName RESET reset_pointName STORED false)
  83 + Q_PROPERTY(bool inPlace READ get_inPlace WRITE set_inPlace RESET reset_inPlace STORED false)
70 BR_PROPERTY(QString, propName, "") 84 BR_PROPERTY(QString, propName, "")
71 BR_PROPERTY(QString, pointName, "") 85 BR_PROPERTY(QString, pointName, "")
  86 + BR_PROPERTY(bool, inPlace, false)
72 87
73 88
74 void project(const Template &src, Template &dst) const 89 void project(const Template &src, Template &dst) const
@@ -77,6 +92,8 @@ class DrawPropertyPointTransform : public UntrainableTransform @@ -77,6 +92,8 @@ class DrawPropertyPointTransform : public UntrainableTransform
77 if (propName.isEmpty() || pointName.isEmpty()) 92 if (propName.isEmpty() || pointName.isEmpty())
78 return; 93 return;
79 94
  95 + dst.m() = inPlace ? src.m() : src.m().clone();
  96 +
80 const Scalar textColor(255, 255, 0); 97 const Scalar textColor(255, 255, 0);
81 98
82 QVariant prop = dst.file.value(propName); 99 QVariant prop = dst.file.value(propName);
@@ -94,7 +111,9 @@ class DrawPropertyPointTransform : public UntrainableTransform @@ -94,7 +111,9 @@ class DrawPropertyPointTransform : public UntrainableTransform
94 QPointF targetPoint = point.toPointF(); 111 QPointF targetPoint = point.toPointF();
95 112
96 Point2f cvPoint =OpenCVUtils::toPoint(targetPoint); 113 Point2f cvPoint =OpenCVUtils::toPoint(targetPoint);
97 - putText(dst, propString.toStdString(), cvPoint, FONT_HERSHEY_SIMPLEX, 0.5, textColor, 1); 114 +
  115 + std::string text = propName.toStdString() + ": " + propString.toStdString();
  116 + putText(dst, text, cvPoint, FONT_HERSHEY_SIMPLEX, 0.5, textColor, 1);
98 } 117 }
99 118
100 }; 119 };
@@ -102,6 +121,65 @@ BR_REGISTER(Transform, DrawPropertyPointTransform) @@ -102,6 +121,65 @@ BR_REGISTER(Transform, DrawPropertyPointTransform)
102 121
103 /*! 122 /*!
104 * \ingroup transforms 123 * \ingroup transforms
  124 + * \brief Draw the values of a list of properties at the specified point on the image
  125 + *
  126 + * The inPlace argument controls whether or not the image is cloned before it is drawn on.
  127 + *
  128 + * \author Charles Otto \cite caotto
  129 + */
  130 +class DrawPropertiesPointTransform : public UntrainableTransform
  131 +{
  132 + Q_OBJECT
  133 + Q_PROPERTY(QStringList propNames READ get_propNames WRITE set_propNames RESET reset_propNames STORED false)
  134 + Q_PROPERTY(QString pointName READ get_pointName WRITE set_pointName RESET reset_pointName STORED false)
  135 + Q_PROPERTY(bool inPlace READ get_inPlace WRITE set_inPlace RESET reset_inPlace STORED false)
  136 + BR_PROPERTY(QStringList, propNames, QStringList())
  137 + BR_PROPERTY(QString, pointName, "")
  138 + BR_PROPERTY(bool, inPlace, false)
  139 +
  140 + void project(const Template &src, Template &dst) const
  141 + {
  142 + dst = src;
  143 + if (propNames.isEmpty() || pointName.isEmpty())
  144 + return;
  145 +
  146 + dst.m() = inPlace ? src.m() : src.m().clone();
  147 +
  148 + QVariant point = dst.file.value(pointName);
  149 +
  150 + if (!point.canConvert(QVariant::PointF))
  151 + return;
  152 +
  153 + QPointF targetPoint = point.toPointF();
  154 +
  155 + Point2f cvPoint =OpenCVUtils::toPoint(targetPoint);
  156 +
  157 +
  158 + const Scalar textColor(255, 255, 0);
  159 +
  160 + std::string outString = "";
  161 + foreach (const QString & propName, propNames)
  162 + {
  163 + QVariant prop = dst.file.value(propName);
  164 +
  165 + if (!prop.canConvert(QVariant::String))
  166 + continue;
  167 + QString propString = prop.toString();
  168 + outString += propName.toStdString() + ": " + propString.toStdString() + " ";
  169 +
  170 + }
  171 + if (outString.empty())
  172 + return;
  173 +
  174 + putText(dst, outString, cvPoint, FONT_HERSHEY_SIMPLEX, 0.5, textColor, 1);
  175 + }
  176 +
  177 +};
  178 +BR_REGISTER(Transform, DrawPropertiesPointTransform)
  179 +
  180 +
  181 +/*!
  182 + * \ingroup transforms
105 * \brief Draws a grid on the image 183 * \brief Draws a grid on the image
106 * \author Josh Klontz \cite jklontz 184 * \author Josh Klontz \cite jklontz
107 */ 185 */
openbr/plugins/independent.cpp
@@ -73,7 +73,7 @@ static TemplateList Downsample(const TemplateList &amp;templates, const Transform *t @@ -73,7 +73,7 @@ static TemplateList Downsample(const TemplateList &amp;templates, const Transform *t
73 class IndependentTransform : public MetaTransform 73 class IndependentTransform : public MetaTransform
74 { 74 {
75 Q_OBJECT 75 Q_OBJECT
76 - Q_PROPERTY(br::Transform* transform READ get_transform WRITE set_transform STORED false) 76 + Q_PROPERTY(br::Transform* transform READ get_transform WRITE set_transform RESET reset_transform STORED false)
77 BR_PROPERTY(br::Transform*, transform, NULL) 77 BR_PROPERTY(br::Transform*, transform, NULL)
78 78
79 QList<Transform*> transforms; 79 QList<Transform*> transforms;
openbr/plugins/misc.cpp
@@ -469,6 +469,98 @@ class RemoveMetadataTransform : public UntrainableMetaTransform @@ -469,6 +469,98 @@ class RemoveMetadataTransform : public UntrainableMetaTransform
469 469
470 BR_REGISTER(Transform, RemoveMetadataTransform) 470 BR_REGISTER(Transform, RemoveMetadataTransform)
471 471
  472 +/*!
  473 + * \ingroup transforms
  474 + * \brief Store the last matrix of the input template as a metadata key with input property name.
  475 + * \author Charles Otto \cite caotto
  476 + */
  477 +class SaveMatTransform : public UntrainableMetaTransform
  478 +{
  479 + Q_OBJECT
  480 +
  481 + Q_PROPERTY(QString propName READ get_propName WRITE set_propName RESET reset_propName STORED false)
  482 + BR_PROPERTY(QString, propName, "")
  483 +
  484 + void project(const Template &src, Template &dst) const
  485 + {
  486 + dst = src;
  487 + dst.file.set(propName, QVariant::fromValue(dst.m()));
  488 + }
  489 +};
  490 +BR_REGISTER(Transform, SaveMatTransform)
  491 +
  492 +/*!
  493 + * \ingroup transforms
  494 + * \brief Set the last matrix of the input template to a matrix stored as metadata with input propName.
  495 + *
  496 + * Also removes the property from the templates metadata after restoring it.
  497 + *
  498 + * \author Charles Otto \cite caotto
  499 + */
  500 +class RestoreMatTransform : public UntrainableMetaTransform
  501 +{
  502 + Q_OBJECT
  503 + Q_PROPERTY(QString propName READ get_propName WRITE set_propName RESET reset_propName STORED false)
  504 + BR_PROPERTY(QString, propName, "")
  505 +
  506 + void project(const Template &src, Template &dst) const
  507 + {
  508 + dst = src;
  509 + if (dst.file.contains(propName)) {
  510 + dst.clear();
  511 + dst.m() = dst.file.get<cv::Mat>(propName);
  512 + dst.file.remove(propName);
  513 + }
  514 + }
  515 +};
  516 +BR_REGISTER(Transform, RestoreMatTransform)
  517 +
  518 +/*!
  519 + * \ingroup transforms
  520 + * \brief Expand the width and height of a template's rects by input width and height factors.
  521 + * \author Charles Otto \cite caotto
  522 + */
  523 +class ExpandRectTransform : public UntrainableTransform
  524 +{
  525 + Q_OBJECT
  526 + Q_PROPERTY(float widthExpand READ get_widthExpand WRITE set_widthExpand RESET reset_widthExpand STORED false)
  527 + Q_PROPERTY(float heightExpand READ get_heightExpand WRITE set_heightExpand RESET reset_heightExpand STORED false)
  528 + BR_PROPERTY(float, widthExpand, .5)
  529 + BR_PROPERTY(float, heightExpand, .5)
  530 + void project(const Template &src, Template &dst) const
  531 + {
  532 + dst = src;
  533 + QList<QRectF> rects = dst.file.rects();
  534 + for (int i=0;i < rects.size(); i++) {
  535 + QRectF rect = rects[i];
  536 +
  537 + qreal width = rect.width();
  538 + qreal height = rect.height();
  539 + float half_w_expansion = widthExpand / 2;
  540 + float half_h_expansion = heightExpand / 2;
  541 +
  542 + qreal half_width = width * widthExpand;
  543 + qreal quarter_width = width * half_w_expansion;
  544 + qreal half_height = height * heightExpand;
  545 + qreal quarter_height = height * half_h_expansion;
  546 +
  547 + rect.setX(std::max(qreal(0),(rect.x() - quarter_width)));
  548 + rect.setY(std::max(qreal(0),(rect.y() - quarter_height)));
  549 +
  550 + qreal x2 = std::min(rect.width() + half_width + rect.x(), qreal(src.m().cols) - 1);
  551 + qreal y2 = std::min(rect.height() + half_height + rect.y(), qreal(src.m().rows) - 1);
  552 +
  553 + rect.setWidth(x2 - rect.x());
  554 + rect.setHeight(y2 - rect.y());
  555 +
  556 + rects[i] = rect;
  557 + }
  558 + dst.file.setRects(rects);
  559 + }
  560 +};
  561 +
  562 +BR_REGISTER(Transform, ExpandRectTransform)
  563 +
472 } 564 }
473 565
474 #include "misc.moc" 566 #include "misc.moc"
openbr/plugins/pp5.cpp
@@ -213,7 +213,7 @@ struct PP5Context @@ -213,7 +213,7 @@ struct PP5Context
213 * \author Josh Klontz \cite jklontz 213 * \author Josh Klontz \cite jklontz
214 * \author E. Taborsky \cite mmtaborsky 214 * \author E. Taborsky \cite mmtaborsky
215 */ 215 */
216 -class PP5EnrollTransform : public UntrainableTransform 216 +class PP5EnrollTransform : public UntrainableMetaTransform
217 { 217 {
218 Q_OBJECT 218 Q_OBJECT
219 Q_PROPERTY(bool detectOnly READ get_detectOnly WRITE set_detectOnly RESET reset_detectOnly STORED false) 219 Q_PROPERTY(bool detectOnly READ get_detectOnly WRITE set_detectOnly RESET reset_detectOnly STORED false)