Commit e41031d2acb26231be86b2c41f8358ab6f290a62
1 parent
13d81417
Give composite transform a default way to handle timevarying child transforms
Move TimeInvariantTransformWrapper to openbr_internal.h, add a default way for composite transforms to handle const project calls when they have time-varying child transforms.
Showing
2 changed files
with
69 additions
and
53 deletions
openbr/plugins/meta.cpp
| ... | ... | @@ -588,57 +588,6 @@ static void _projectList(const Transform *transform, const TemplateList *src, Te |
| 588 | 588 | transform->project(*src, *dst); |
| 589 | 589 | } |
| 590 | 590 | |
| 591 | - | |
| 592 | -class TransformCopier : public ResourceMaker<Transform> | |
| 593 | -{ | |
| 594 | -public: | |
| 595 | - Transform * basis; | |
| 596 | - TransformCopier(Transform * _basis) | |
| 597 | - { | |
| 598 | - basis = _basis; | |
| 599 | - } | |
| 600 | - | |
| 601 | - virtual Transform *make() const | |
| 602 | - { | |
| 603 | - return basis->smartCopy(); | |
| 604 | - } | |
| 605 | - | |
| 606 | -}; | |
| 607 | - | |
| 608 | -class TimeInvariantWrapperTransform : public MetaTransform | |
| 609 | -{ | |
| 610 | -public: | |
| 611 | - Resource<Transform> transformSource; | |
| 612 | - | |
| 613 | - TimeInvariantWrapperTransform(Transform * basis) : transformSource(new TransformCopier(basis)) | |
| 614 | - { | |
| 615 | - baseTransform = basis; | |
| 616 | - } | |
| 617 | - | |
| 618 | - virtual void project(const Template &src, Template &dst) const | |
| 619 | - { | |
| 620 | - Transform * aTransform = transformSource.acquire(); | |
| 621 | - aTransform->projectUpdate(src,dst); | |
| 622 | - transformSource.release(aTransform); | |
| 623 | - } | |
| 624 | - | |
| 625 | - | |
| 626 | - void project(const TemplateList &src, TemplateList &dst) const | |
| 627 | - { | |
| 628 | - Transform * aTransform = transformSource.acquire(); | |
| 629 | - aTransform->projectUpdate(src,dst); | |
| 630 | - transformSource.release(aTransform); | |
| 631 | - } | |
| 632 | - | |
| 633 | - void train(const TemplateList &data) | |
| 634 | - { | |
| 635 | - baseTransform->train(data); | |
| 636 | - } | |
| 637 | - | |
| 638 | -private: | |
| 639 | - Transform * baseTransform; | |
| 640 | -}; | |
| 641 | - | |
| 642 | 591 | class DistributeTemplateTransform : public MetaTransform |
| 643 | 592 | { |
| 644 | 593 | Q_OBJECT | ... | ... |
openbr/plugins/openbr_internal.h
| ... | ... | @@ -2,6 +2,7 @@ |
| 2 | 2 | #define __OPENBR_INTERNAL_H |
| 3 | 3 | |
| 4 | 4 | #include "openbr/openbr_plugin.h" |
| 5 | +#include "openbr/core/resource.h" | |
| 5 | 6 | |
| 6 | 7 | namespace br |
| 7 | 8 | { |
| ... | ... | @@ -97,6 +98,58 @@ protected: |
| 97 | 98 | MetaTransform() : Transform(false) {} |
| 98 | 99 | }; |
| 99 | 100 | |
| 101 | + | |
| 102 | +class TransformCopier : public ResourceMaker<Transform> | |
| 103 | +{ | |
| 104 | +public: | |
| 105 | + Transform * basis; | |
| 106 | + TransformCopier(Transform * _basis) | |
| 107 | + { | |
| 108 | + basis = _basis; | |
| 109 | + } | |
| 110 | + | |
| 111 | + virtual Transform *make() const | |
| 112 | + { | |
| 113 | + return basis->smartCopy(); | |
| 114 | + } | |
| 115 | + | |
| 116 | +}; | |
| 117 | + | |
| 118 | +class TimeInvariantWrapperTransform : public MetaTransform | |
| 119 | +{ | |
| 120 | +public: | |
| 121 | + Resource<Transform> transformSource; | |
| 122 | + | |
| 123 | + TimeInvariantWrapperTransform(Transform * basis) : transformSource(new TransformCopier(basis)) | |
| 124 | + { | |
| 125 | + baseTransform = basis; | |
| 126 | + } | |
| 127 | + | |
| 128 | + virtual void project(const Template &src, Template &dst) const | |
| 129 | + { | |
| 130 | + Transform * aTransform = transformSource.acquire(); | |
| 131 | + aTransform->projectUpdate(src,dst); | |
| 132 | + transformSource.release(aTransform); | |
| 133 | + } | |
| 134 | + | |
| 135 | + | |
| 136 | + void project(const TemplateList &src, TemplateList &dst) const | |
| 137 | + { | |
| 138 | + Transform * aTransform = transformSource.acquire(); | |
| 139 | + aTransform->projectUpdate(src,dst); | |
| 140 | + transformSource.release(aTransform); | |
| 141 | + } | |
| 142 | + | |
| 143 | + void train(const TemplateList &data) | |
| 144 | + { | |
| 145 | + baseTransform->train(data); | |
| 146 | + } | |
| 147 | + | |
| 148 | +private: | |
| 149 | + Transform * baseTransform; | |
| 150 | +}; | |
| 151 | + | |
| 152 | + | |
| 100 | 153 | /*! |
| 101 | 154 | * \brief A MetaTransform that aggregates some sub-transforms |
| 102 | 155 | */ |
| ... | ... | @@ -116,10 +169,21 @@ public: |
| 116 | 169 | |
| 117 | 170 | virtual void project(const TemplateList &src, TemplateList &dst) const |
| 118 | 171 | { |
| 119 | - if (timeVarying()) qFatal("No const project defined for time-varying transform"); | |
| 172 | + if (timeVarying()) { | |
| 173 | + if (!this->timeInvariantAlias) { | |
| 174 | + QMutexLocker lock(&aliasLock); | |
| 175 | + CompositeTransform * non_const = const_cast<CompositeTransform *>(this); | |
| 176 | + non_const->timeInvariantAlias = non_const->smartCopy(); | |
| 177 | + non_const->timeInvariantAlias->setParent(non_const); | |
| 178 | + lock.unlock(); | |
| 179 | + } | |
| 180 | + timeInvariantAlias->projectUpdate(src,dst); | |
| 181 | + return; | |
| 182 | + } | |
| 120 | 183 | _project(src, dst); |
| 121 | 184 | } |
| 122 | 185 | |
| 186 | + | |
| 123 | 187 | bool timeVarying() const { return isTimeVarying; } |
| 124 | 188 | |
| 125 | 189 | void init() |
| ... | ... | @@ -173,10 +237,13 @@ public: |
| 173 | 237 | protected: |
| 174 | 238 | bool isTimeVarying; |
| 175 | 239 | |
| 240 | + mutable QMutex aliasLock; | |
| 241 | + Transform * timeInvariantAlias; | |
| 242 | + | |
| 176 | 243 | virtual void _project(const Template & src, Template & dst) const = 0; |
| 177 | 244 | virtual void _project(const TemplateList & src, TemplateList & dst) const = 0; |
| 178 | 245 | |
| 179 | - CompositeTransform() : TimeVaryingTransform(false) {} | |
| 246 | + CompositeTransform() : TimeVaryingTransform(false) { timeInvariantAlias = NULL; } | |
| 180 | 247 | }; |
| 181 | 248 | |
| 182 | 249 | } | ... | ... |