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 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 }
... ...