Commit e6376e0e624017edaf549b4358ef3dec7b12783c
1 parent
d159dc08
Moved some transforms to more recognizable plugins
Showing
5 changed files
with
121 additions
and
92 deletions
openbr/plugins/draw.cpp
| ... | ... | @@ -213,6 +213,41 @@ class DrawGridTransform : public UntrainableTransform |
| 213 | 213 | |
| 214 | 214 | BR_REGISTER(Transform, DrawGridTransform) |
| 215 | 215 | |
| 216 | +/*! | |
| 217 | + * \ingroup transforms | |
| 218 | + * \brief Computes the mean of a set of templates. | |
| 219 | + * \note Suitable for visualization only as it sets every projected template to the mean template. | |
| 220 | + * \author Scott Klum \cite sklum | |
| 221 | + */ | |
| 222 | +class MeanTransform : public Transform | |
| 223 | +{ | |
| 224 | + Q_OBJECT | |
| 225 | + | |
| 226 | + Mat mean; | |
| 227 | + | |
| 228 | + void train(const TemplateList &data) | |
| 229 | + { | |
| 230 | + mean = Mat::zeros(data[0].m().rows,data[0].m().cols,CV_32F); | |
| 231 | + | |
| 232 | + for (int i = 0; i < data.size(); i++) { | |
| 233 | + Mat converted; | |
| 234 | + data[i].m().convertTo(converted, CV_32F); | |
| 235 | + mean += converted; | |
| 236 | + } | |
| 237 | + | |
| 238 | + mean /= data.size(); | |
| 239 | + } | |
| 240 | + | |
| 241 | + void project(const Template &src, Template &dst) const | |
| 242 | + { | |
| 243 | + dst = src; | |
| 244 | + dst.m() = mean; | |
| 245 | + } | |
| 246 | + | |
| 247 | +}; | |
| 248 | + | |
| 249 | +BR_REGISTER(Transform, MeanTransform) | |
| 250 | + | |
| 216 | 251 | // TODO: re-implement EditTransform using Qt |
| 217 | 252 | #if 0 |
| 218 | 253 | /*! | ... | ... |
openbr/plugins/gui.cpp
openbr/plugins/landmarks.cpp
| ... | ... | @@ -149,13 +149,9 @@ class DelaunayTransform : public UntrainableTransform |
| 149 | 149 | Q_OBJECT |
| 150 | 150 | |
| 151 | 151 | Q_PROPERTY(float scaleFactor READ get_scaleFactor WRITE set_scaleFactor RESET reset_scaleFactor STORED false) |
| 152 | - Q_PROPERTY(QString widthCrop READ get_widthCrop WRITE set_widthCrop RESET reset_widthCrop STORED false) | |
| 153 | - Q_PROPERTY(QString heightCrop READ get_heightCrop WRITE set_heightCrop RESET reset_heightCrop STORED false) | |
| 154 | 152 | Q_PROPERTY(bool warp READ get_warp WRITE set_warp RESET reset_warp STORED false) |
| 155 | 153 | Q_PROPERTY(bool draw READ get_draw WRITE set_draw RESET reset_draw STORED false) |
| 156 | 154 | BR_PROPERTY(float, scaleFactor, 1) |
| 157 | - BR_PROPERTY(QString, widthCrop, QString()) | |
| 158 | - BR_PROPERTY(QString, heightCrop, QString()) | |
| 159 | 155 | BR_PROPERTY(bool, warp, true) |
| 160 | 156 | BR_PROPERTY(bool, draw, false) |
| 161 | 157 | |
| ... | ... | @@ -289,13 +285,7 @@ class DelaunayTransform : public UntrainableTransform |
| 289 | 285 | } |
| 290 | 286 | |
| 291 | 287 | Rect boundingBox = boundingRect(mappedPoints.toVector().toStdVector()); |
| 292 | - | |
| 293 | - boundingBox.x += boundingBox.width * QtUtils::toPoint(widthCrop).x(); | |
| 294 | - boundingBox.y += boundingBox.height * QtUtils::toPoint(heightCrop).x(); | |
| 295 | - boundingBox.width *= 1-QtUtils::toPoint(widthCrop).y(); | |
| 296 | - boundingBox.height *= 1-QtUtils::toPoint(heightCrop).y(); | |
| 297 | - | |
| 298 | - dst.m() = Mat(dst.m(), boundingBox); | |
| 288 | + dst.file.appendRect(OpenCVUtils::fromRect(boundingBox)); | |
| 299 | 289 | } |
| 300 | 290 | } |
| 301 | 291 | |
| ... | ... | @@ -303,41 +293,6 @@ class DelaunayTransform : public UntrainableTransform |
| 303 | 293 | |
| 304 | 294 | BR_REGISTER(Transform, DelaunayTransform) |
| 305 | 295 | |
| 306 | -/*! | |
| 307 | - * \ingroup transforms | |
| 308 | - * \brief Computes the mean of a set of templates. | |
| 309 | - * \note Suitable for visualization only as it sets every projected template to the mean template. | |
| 310 | - * \author Scott Klum \cite sklum | |
| 311 | - */ | |
| 312 | -class MeanTransform : public Transform | |
| 313 | -{ | |
| 314 | - Q_OBJECT | |
| 315 | - | |
| 316 | - Mat mean; | |
| 317 | - | |
| 318 | - void train(const TemplateList &data) | |
| 319 | - { | |
| 320 | - mean = Mat::zeros(data[0].m().rows,data[0].m().cols,CV_32F); | |
| 321 | - | |
| 322 | - for (int i = 0; i < data.size(); i++) { | |
| 323 | - Mat converted; | |
| 324 | - data[i].m().convertTo(converted, CV_32F); | |
| 325 | - mean += converted; | |
| 326 | - } | |
| 327 | - | |
| 328 | - mean /= data.size(); | |
| 329 | - } | |
| 330 | - | |
| 331 | - void project(const Template &src, Template &dst) const | |
| 332 | - { | |
| 333 | - dst = src; | |
| 334 | - dst.m() = mean; | |
| 335 | - } | |
| 336 | - | |
| 337 | -}; | |
| 338 | - | |
| 339 | -BR_REGISTER(Transform, MeanTransform) | |
| 340 | - | |
| 341 | 296 | } // namespace br |
| 342 | 297 | |
| 343 | 298 | #include "landmarks.moc" | ... | ... |
openbr/plugins/misc.cpp
| ... | ... | @@ -516,52 +516,6 @@ class RestoreMatTransform : public UntrainableMetaTransform |
| 516 | 516 | }; |
| 517 | 517 | BR_REGISTER(Transform, RestoreMatTransform) |
| 518 | 518 | |
| 519 | -/*! | |
| 520 | - * \ingroup transforms | |
| 521 | - * \brief Expand the width and height of a template's rects by input width and height factors. | |
| 522 | - * \author Charles Otto \cite caotto | |
| 523 | - */ | |
| 524 | -class ExpandRectTransform : public UntrainableTransform | |
| 525 | -{ | |
| 526 | - Q_OBJECT | |
| 527 | - Q_PROPERTY(float widthExpand READ get_widthExpand WRITE set_widthExpand RESET reset_widthExpand STORED false) | |
| 528 | - Q_PROPERTY(float heightExpand READ get_heightExpand WRITE set_heightExpand RESET reset_heightExpand STORED false) | |
| 529 | - BR_PROPERTY(float, widthExpand, .5) | |
| 530 | - BR_PROPERTY(float, heightExpand, .5) | |
| 531 | - void project(const Template &src, Template &dst) const | |
| 532 | - { | |
| 533 | - dst = src; | |
| 534 | - QList<QRectF> rects = dst.file.rects(); | |
| 535 | - for (int i=0;i < rects.size(); i++) { | |
| 536 | - QRectF rect = rects[i]; | |
| 537 | - | |
| 538 | - qreal width = rect.width(); | |
| 539 | - qreal height = rect.height(); | |
| 540 | - float half_w_expansion = widthExpand / 2; | |
| 541 | - float half_h_expansion = heightExpand / 2; | |
| 542 | - | |
| 543 | - qreal half_width = width * widthExpand; | |
| 544 | - qreal quarter_width = width * half_w_expansion; | |
| 545 | - qreal half_height = height * heightExpand; | |
| 546 | - qreal quarter_height = height * half_h_expansion; | |
| 547 | - | |
| 548 | - rect.setX(std::max(qreal(0),(rect.x() - quarter_width))); | |
| 549 | - rect.setY(std::max(qreal(0),(rect.y() - quarter_height))); | |
| 550 | - | |
| 551 | - qreal x2 = std::min(rect.width() + half_width + rect.x(), qreal(src.m().cols) - 1); | |
| 552 | - qreal y2 = std::min(rect.height() + half_height + rect.y(), qreal(src.m().rows) - 1); | |
| 553 | - | |
| 554 | - rect.setWidth(x2 - rect.x()); | |
| 555 | - rect.setHeight(y2 - rect.y()); | |
| 556 | - | |
| 557 | - rects[i] = rect; | |
| 558 | - } | |
| 559 | - dst.file.setRects(rects); | |
| 560 | - } | |
| 561 | -}; | |
| 562 | - | |
| 563 | -BR_REGISTER(Transform, ExpandRectTransform) | |
| 564 | - | |
| 565 | 519 | |
| 566 | 520 | class EventTransform : public UntrainableMetaTransform |
| 567 | 521 | { | ... | ... |
openbr/plugins/regions.cpp
| ... | ... | @@ -191,6 +191,87 @@ BR_REGISTER(Transform, DupTransform) |
| 191 | 191 | |
| 192 | 192 | /*! |
| 193 | 193 | * \ingroup transforms |
| 194 | + * \brief Expand the width and height of a template's rects by input width and height factors. | |
| 195 | + * \author Charles Otto \cite caotto | |
| 196 | + */ | |
| 197 | +class ExpandRectTransform : public UntrainableTransform | |
| 198 | +{ | |
| 199 | + Q_OBJECT | |
| 200 | + Q_PROPERTY(float widthExpand READ get_widthExpand WRITE set_widthExpand RESET reset_widthExpand STORED false) | |
| 201 | + Q_PROPERTY(float heightExpand READ get_heightExpand WRITE set_heightExpand RESET reset_heightExpand STORED false) | |
| 202 | + BR_PROPERTY(float, widthExpand, .5) | |
| 203 | + BR_PROPERTY(float, heightExpand, .5) | |
| 204 | + void project(const Template &src, Template &dst) const | |
| 205 | + { | |
| 206 | + dst = src; | |
| 207 | + QList<QRectF> rects = dst.file.rects(); | |
| 208 | + for (int i=0;i < rects.size(); i++) { | |
| 209 | + QRectF rect = rects[i]; | |
| 210 | + | |
| 211 | + qreal width = rect.width(); | |
| 212 | + qreal height = rect.height(); | |
| 213 | + float half_w_expansion = widthExpand / 2; | |
| 214 | + float half_h_expansion = heightExpand / 2; | |
| 215 | + | |
| 216 | + qreal half_width = width * widthExpand; | |
| 217 | + qreal quarter_width = width * half_w_expansion; | |
| 218 | + qreal half_height = height * heightExpand; | |
| 219 | + qreal quarter_height = height * half_h_expansion; | |
| 220 | + | |
| 221 | + rect.setX(std::max(qreal(0),(rect.x() - quarter_width))); | |
| 222 | + rect.setY(std::max(qreal(0),(rect.y() - quarter_height))); | |
| 223 | + | |
| 224 | + qreal x2 = std::min(rect.width() + half_width + rect.x(), qreal(src.m().cols) - 1); | |
| 225 | + qreal y2 = std::min(rect.height() + half_height + rect.y(), qreal(src.m().rows) - 1); | |
| 226 | + | |
| 227 | + rect.setWidth(x2 - rect.x()); | |
| 228 | + rect.setHeight(y2 - rect.y()); | |
| 229 | + | |
| 230 | + rects[i] = rect; | |
| 231 | + } | |
| 232 | + dst.file.setRects(rects); | |
| 233 | + } | |
| 234 | +}; | |
| 235 | + | |
| 236 | +BR_REGISTER(Transform, ExpandRectTransform) | |
| 237 | + | |
| 238 | +/*! | |
| 239 | + * \ingroup transforms | |
| 240 | + * \brief Crops the width and height of a template's rects by input width and height factors. | |
| 241 | + * \author Scott Klum \cite sklum | |
| 242 | + */ | |
| 243 | +class CropRectTransform : public UntrainableTransform | |
| 244 | +{ | |
| 245 | + Q_OBJECT | |
| 246 | + | |
| 247 | + Q_PROPERTY(QString widthCrop READ get_widthCrop WRITE set_widthCrop RESET reset_widthCrop STORED false) | |
| 248 | + Q_PROPERTY(QString heightCrop READ get_heightCrop WRITE set_heightCrop RESET reset_heightCrop STORED false) | |
| 249 | + BR_PROPERTY(QString, widthCrop, QString()) | |
| 250 | + BR_PROPERTY(QString, heightCrop, QString()) | |
| 251 | + | |
| 252 | + void project(const Template &src, Template &dst) const | |
| 253 | + { | |
| 254 | + dst = src; | |
| 255 | + QList<QRectF> rects = dst.file.rects(); | |
| 256 | + for (int i=0;i < rects.size(); i++) { | |
| 257 | + QRectF rect = rects[i]; | |
| 258 | + | |
| 259 | + // Do a bit of error checking | |
| 260 | + rect.x += rect.width * QtUtils::toPoint(widthCrop).x(); | |
| 261 | + rect.y += rect.height * QtUtils::toPoint(heightCrop).x(); | |
| 262 | + rect.width *= 1-QtUtils::toPoint(widthCrop).y(); | |
| 263 | + rect.height *= 1-QtUtils::toPoint(heightCrop).y(); | |
| 264 | + | |
| 265 | + dst.m() = Mat(dst.m(), rect); | |
| 266 | + } | |
| 267 | + dst.file.setRects(rects); | |
| 268 | + } | |
| 269 | +}; | |
| 270 | + | |
| 271 | +BR_REGISTER(Transform, CropRectTransform) | |
| 272 | + | |
| 273 | +/*! | |
| 274 | + * \ingroup transforms | |
| 194 | 275 | * \brief Create matrix from landmarks. |
| 195 | 276 | * \author Scott Klum \cite sklum |
| 196 | 277 | * \todo Padding should be a percent of total image size | ... | ... |