Commit 6ab3d0c5687b3b702c644ea061ddcbe744261fe9
1 parent
1c003ddc
Separated point reordering functionality, reverted openbr_plugin change such tha…
…t Fork is not affected
Showing
5 changed files
with
62 additions
and
33 deletions
openbr/openbr_plugin.cpp
| @@ -81,10 +81,8 @@ QString File::hash() const | @@ -81,10 +81,8 @@ QString File::hash() const | ||
| 81 | 81 | ||
| 82 | void File::append(const QVariantMap &metadata) | 82 | void File::append(const QVariantMap &metadata) |
| 83 | { | 83 | { |
| 84 | - foreach (const QString &key, metadata.keys()) { | ||
| 85 | - if (key != "Points" && key != "Rects") | ||
| 86 | - set(key, metadata[key]); | ||
| 87 | - } | 84 | + foreach (const QString &key, metadata.keys()) |
| 85 | + set(key, metadata[key]); | ||
| 88 | } | 86 | } |
| 89 | 87 | ||
| 90 | void File::append(const File &other) | 88 | void File::append(const File &other) |
| @@ -98,8 +96,6 @@ void File::append(const File &other) | @@ -98,8 +96,6 @@ void File::append(const File &other) | ||
| 98 | } | 96 | } |
| 99 | } | 97 | } |
| 100 | append(other.m_metadata); | 98 | append(other.m_metadata); |
| 101 | - appendPoints(other.points()); | ||
| 102 | - appendRects(other.rects()); | ||
| 103 | } | 99 | } |
| 104 | 100 | ||
| 105 | QList<File> File::split() const | 101 | QList<File> File::split() const |
openbr/plugins/algorithms.cpp
| @@ -79,10 +79,10 @@ class AlgorithmsInitializer : public Initializer | @@ -79,10 +79,10 @@ class AlgorithmsInitializer : public Initializer | ||
| 79 | Globals->abbreviations.insert("RegisterAffine", "Open+Affine(256,256,0.37,0.45)"); | 79 | Globals->abbreviations.insert("RegisterAffine", "Open+Affine(256,256,0.37,0.45)"); |
| 80 | Globals->abbreviations.insert("ContrastEnhanced", "Open+Affine(256,256,0.37,0.45)+Cvt(Gray)+Blur(1.1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)"); | 80 | Globals->abbreviations.insert("ContrastEnhanced", "Open+Affine(256,256,0.37,0.45)+Cvt(Gray)+Blur(1.1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)"); |
| 81 | Globals->abbreviations.insert("ColoredLBP", "Open+Affine(128,128,0.37,0.45)+Cvt(Gray)+Blur(1.1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)+LBP(1,2)+ColoredU2"); | 81 | Globals->abbreviations.insert("ColoredLBP", "Open+Affine(128,128,0.37,0.45)+Cvt(Gray)+Blur(1.1)+Gamma(0.2)+DoG(1,2)+ContrastEq(0.1,10)+LBP(1,2)+ColoredU2"); |
| 82 | - Globals->abbreviations.insert("FlipMUCT","Flip(from=[ 0, 1, 2, 3, 4, 5, 6, 7, 17,18,19,20,21,31,32,36,37,38,39,40,41,48,49,50,55,56,60,61,65], \ | ||
| 83 | - to=[16,15,14,13,12,11,10, 9, 26,25,24,23,22,35,34,45,44,43,42,47,46,54,53,52,59,58,64,63,67])"); | ||
| 84 | - Globals->abbreviations.insert("FlipMUCTNoJaw","Flip(from=[0,1,2,3,4,14,15,19,20,21,22,23,24,31,32,33,38,39,43,44,48], \ | ||
| 85 | - to=[9,8,7,6,5,18,17,28,27,26,25,30,29,37,36,35,42,41,47,46,50])"); | 82 | + Globals->abbreviations.insert("FlipMUCT","Flip+ReorderPoints([ 0, 1, 2, 3, 4, 5, 6, 7, 17,18,19,20,21,31,32,36,37,38,39,40,41,48,49,50,55,56,60,61,65], \ |
| 83 | + to=[16,15,14,13,12,11,10, 9, 26,25,24,23,22,35,34,45,44,43,42,47,46,54,53,52,59,58,64,63,67],true)"); | ||
| 84 | + Globals->abbreviations.insert("FlipMUCTNoJaw","Flip+ReorderPoints([0,1,2,3,4,14,15,19,20,21,22,23,24,31,32,33,38,39,43,44,48], \ | ||
| 85 | + [9,8,7,6,5,18,17,28,27,26,25,30,29,37,36,35,42,41,47,46,50],true)"); | ||
| 86 | 86 | ||
| 87 | // Transforms | 87 | // Transforms |
| 88 | Globals->abbreviations.insert("FaceDetection", "Open+Cvt(Gray)+Cascade(FrontalFace)"); | 88 | Globals->abbreviations.insert("FaceDetection", "Open+Cvt(Gray)+Cascade(FrontalFace)"); |
openbr/plugins/regions.cpp
| @@ -246,8 +246,16 @@ class DupTransform : public UntrainableMetaTransform | @@ -246,8 +246,16 @@ class DupTransform : public UntrainableMetaTransform | ||
| 246 | 246 | ||
| 247 | void project(const Template &src, Template &dst) const | 247 | void project(const Template &src, Template &dst) const |
| 248 | { | 248 | { |
| 249 | + QList<QPointF> points = src.file.points(); | ||
| 250 | + QList<QRectF> rects = src.file.rects(); | ||
| 251 | + | ||
| 249 | for (int i=0; i<n; i++) | 252 | for (int i=0; i<n; i++) |
| 250 | dst.merge(src); | 253 | dst.merge(src); |
| 254 | + | ||
| 255 | + for (int i=1; i<n; i++) { | ||
| 256 | + dst.file.appendPoints(points); | ||
| 257 | + dst.file.appendRects(rects); | ||
| 258 | + } | ||
| 251 | } | 259 | } |
| 252 | }; | 260 | }; |
| 253 | 261 |
openbr/plugins/register.cpp
| @@ -124,17 +124,12 @@ BR_REGISTER(Transform, AffineTransform) | @@ -124,17 +124,12 @@ BR_REGISTER(Transform, AffineTransform) | ||
| 124 | * \ingroup transforms | 124 | * \ingroup transforms |
| 125 | * \brief Flips the image about an axis. | 125 | * \brief Flips the image about an axis. |
| 126 | * \author Josh Klontz \cite jklontz | 126 | * \author Josh Klontz \cite jklontz |
| 127 | - * \note In the case that you would like to flip both the image and the template's points but keep the indices for | ||
| 128 | - * the points consistent between flipped an unflipped images, the to and from variables specify which indices | ||
| 129 | - * to swap (i.e. points[from[0]] becomes points[to[0]] and vice versa). | ||
| 130 | */ | 127 | */ |
| 131 | class FlipTransform : public UntrainableMetaTransform | 128 | class FlipTransform : public UntrainableMetaTransform |
| 132 | { | 129 | { |
| 133 | Q_OBJECT | 130 | Q_OBJECT |
| 134 | Q_ENUMS(Axis) | 131 | Q_ENUMS(Axis) |
| 135 | Q_PROPERTY(Axis axis READ get_axis WRITE set_axis RESET reset_axis STORED false) | 132 | Q_PROPERTY(Axis axis READ get_axis WRITE set_axis RESET reset_axis STORED false) |
| 136 | - Q_PROPERTY(QList<int> from READ get_from WRITE set_from RESET reset_from STORED false) | ||
| 137 | - Q_PROPERTY(QList<int> to READ get_to WRITE set_to RESET reset_to STORED false) | ||
| 138 | 133 | ||
| 139 | public: | 134 | public: |
| 140 | /*!< */ | 135 | /*!< */ |
| @@ -144,34 +139,29 @@ public: | @@ -144,34 +139,29 @@ public: | ||
| 144 | 139 | ||
| 145 | private: | 140 | private: |
| 146 | BR_PROPERTY(Axis, axis, Y) | 141 | BR_PROPERTY(Axis, axis, Y) |
| 147 | - BR_PROPERTY(QList<int>, from, QList<int>()) | ||
| 148 | - BR_PROPERTY(QList<int>, to, QList<int>()) | ||
| 149 | 142 | ||
| 150 | void project(const TemplateList &src, TemplateList &dst) const | 143 | void project(const TemplateList &src, TemplateList &dst) const |
| 151 | { | 144 | { |
| 152 | - dst.append(src.first()); | ||
| 153 | for (int i=0; i<src.size(); i++) { | 145 | for (int i=0; i<src.size(); i++) { |
| 146 | + dst.append(src[i]); | ||
| 147 | + | ||
| 154 | Mat buffer; | 148 | Mat buffer; |
| 155 | flip(src[i], buffer, axis); | 149 | flip(src[i], buffer, axis); |
| 156 | dst.append(Template(src[i].file,buffer)); | 150 | dst.append(Template(src[i].file,buffer)); |
| 157 | 151 | ||
| 158 | - if (from.size() == to.size()) { | ||
| 159 | - QList<QPointF> flippedPoints; | ||
| 160 | - foreach(const QPointF &point, dst.last().file.points()) { | ||
| 161 | - if (axis == Y) { | ||
| 162 | - flippedPoints.append(QPointF(src[i].m().cols-point.x(),point.y())); | ||
| 163 | - } else if (axis == X) { | ||
| 164 | - flippedPoints.append(QPointF(point.x(),src[i].m().rows-point.y())); | ||
| 165 | - } else { | ||
| 166 | - flippedPoints.append(QPointF(src[i].m().cols-point.x(),src[i].m().rows-point.y())); | ||
| 167 | - } | 152 | + QList<QPointF> flippedPoints; |
| 153 | + foreach(const QPointF &point, src.last().file.points()) { | ||
| 154 | + if (axis == Y) { | ||
| 155 | + flippedPoints.append(QPointF(src[i].m().cols-point.x(),point.y())); | ||
| 156 | + } else if (axis == X) { | ||
| 157 | + flippedPoints.append(QPointF(point.x(),src[i].m().rows-point.y())); | ||
| 158 | + } else { | ||
| 159 | + flippedPoints.append(QPointF(src[i].m().cols-point.x(),src[i].m().rows-point.y())); | ||
| 168 | } | 160 | } |
| 161 | + } | ||
| 169 | 162 | ||
| 170 | - for (int j=0; j<from.size(); j++) | ||
| 171 | - std::swap(flippedPoints[from[j]],flippedPoints[to[j]]); | ||
| 172 | - | ||
| 173 | - dst.last().file.setPoints(flippedPoints); | ||
| 174 | - } else qFatal("Inconsistent sizes for to and from index lists."); | 163 | + dst.last().file.setPoints(flippedPoints); |
| 164 | + dst.last().file.set("Flipped",true); | ||
| 175 | } | 165 | } |
| 176 | } | 166 | } |
| 177 | 167 |
openbr/plugins/template.cpp
| @@ -207,6 +207,41 @@ public: | @@ -207,6 +207,41 @@ public: | ||
| 207 | 207 | ||
| 208 | BR_REGISTER(Transform, FilterDupeMetadataTransform) | 208 | BR_REGISTER(Transform, FilterDupeMetadataTransform) |
| 209 | 209 | ||
| 210 | +/*! | ||
| 211 | + * \ingroup transforms | ||
| 212 | + * \brief Reorder the points such that points[from[i]] becomes points[to[i]] and | ||
| 213 | + * vice versa | ||
| 214 | + * \author Scott Klum \cite sklum | ||
| 215 | + */ | ||
| 216 | +class ReorderPointsTransform : public UntrainableMetadataTransform | ||
| 217 | +{ | ||
| 218 | + Q_OBJECT | ||
| 219 | + | ||
| 220 | + Q_PROPERTY(QList<int> from READ get_from WRITE set_from RESET reset_from STORED false) | ||
| 221 | + Q_PROPERTY(QList<int> to READ get_to WRITE set_to RESET reset_to STORED false) | ||
| 222 | + Q_PROPERTY(bool flippedOnly READ get_flippedOnly WRITE set_flippedOnly RESET reset_flippedOnly STORED false) | ||
| 223 | + BR_PROPERTY(QList<int>, from, QList<int>()) | ||
| 224 | + BR_PROPERTY(QList<int>, to, QList<int>()) | ||
| 225 | + BR_PROPERTY(bool, flippedOnly, false) | ||
| 226 | + | ||
| 227 | + void projectMetadata(const File &src, File &dst) const | ||
| 228 | + { | ||
| 229 | + if (flippedOnly && !src.contains("Flipped")) { | ||
| 230 | + dst = src; | ||
| 231 | + return; | ||
| 232 | + } | ||
| 233 | + | ||
| 234 | + if (from.size() == to.size()) { | ||
| 235 | + QList<QPointF> points = src.points(); | ||
| 236 | + for (int i=0; i<from.size(); i++) | ||
| 237 | + std::swap(points[from[i]],points[to[i]]); | ||
| 238 | + dst.setPoints(points); | ||
| 239 | + } else qFatal("Inconsistent sizes for to and from index lists."); | ||
| 240 | + } | ||
| 241 | +}; | ||
| 242 | + | ||
| 243 | +BR_REGISTER(Transform, ReorderPointsTransform) | ||
| 244 | + | ||
| 210 | } // namespace br | 245 | } // namespace br |
| 211 | 246 | ||
| 212 | #include "template.moc" | 247 | #include "template.moc" |