Commit e41031d2acb26231be86b2c41f8358ab6f290a62

Authored by Charles Otto
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.
openbr/plugins/meta.cpp
@@ -588,57 +588,6 @@ static void _projectList(const Transform *transform, const TemplateList *src, Te @@ -588,57 +588,6 @@ static void _projectList(const Transform *transform, const TemplateList *src, Te
588 transform->project(*src, *dst); 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 class DistributeTemplateTransform : public MetaTransform 591 class DistributeTemplateTransform : public MetaTransform
643 { 592 {
644 Q_OBJECT 593 Q_OBJECT
openbr/plugins/openbr_internal.h
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 #define __OPENBR_INTERNAL_H 2 #define __OPENBR_INTERNAL_H
3 3
4 #include "openbr/openbr_plugin.h" 4 #include "openbr/openbr_plugin.h"
  5 +#include "openbr/core/resource.h"
5 6
6 namespace br 7 namespace br
7 { 8 {
@@ -97,6 +98,58 @@ protected: @@ -97,6 +98,58 @@ protected:
97 MetaTransform() : Transform(false) {} 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 * \brief A MetaTransform that aggregates some sub-transforms 154 * \brief A MetaTransform that aggregates some sub-transforms
102 */ 155 */
@@ -116,10 +169,21 @@ public: @@ -116,10 +169,21 @@ public:
116 169
117 virtual void project(const TemplateList &src, TemplateList &dst) const 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 _project(src, dst); 183 _project(src, dst);
121 } 184 }
122 185
  186 +
123 bool timeVarying() const { return isTimeVarying; } 187 bool timeVarying() const { return isTimeVarying; }
124 188
125 void init() 189 void init()
@@ -173,10 +237,13 @@ public: @@ -173,10 +237,13 @@ public:
173 protected: 237 protected:
174 bool isTimeVarying; 238 bool isTimeVarying;
175 239
  240 + mutable QMutex aliasLock;
  241 + Transform * timeInvariantAlias;
  242 +
176 virtual void _project(const Template & src, Template & dst) const = 0; 243 virtual void _project(const Template & src, Template & dst) const = 0;
177 virtual void _project(const TemplateList & src, TemplateList & dst) const = 0; 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 }