diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-12-19 12:33:44 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-12-19 12:33:44 +0000 |
| commit | 5bbe3c31236d0cbaa28f1fd34655dc6a1b5f6675 (patch) | |
| tree | 5fc026b287dd61508d9651ada2c67f407f6ddd7a /rotord | |
| parent | 5b937b31f75b06488b59a09e5a0f844af782fbd0 (diff) | |
correct copy constructor for Image - variable delay feedback
Diffstat (limited to 'rotord')
| -rw-r--r-- | rotord/src/cvimage.h | 10 | ||||
| -rw-r--r-- | rotord/src/rotor.h | 24 |
2 files changed, 25 insertions, 9 deletions
diff --git a/rotord/src/cvimage.h b/rotord/src/cvimage.h index 0a91715..2374e5b 100644 --- a/rotord/src/cvimage.h +++ b/rotord/src/cvimage.h @@ -90,6 +90,15 @@ namespace Rotor { zero(); setup(_w,_h); }; + Image(const Image &mom) { + // copy constructor + zero(); + rgb=mom.rgb.clone(); + w=mom.w; + h=mom.h; + RGBdata=rgb.data; //can move to use the bare pointer eventually + ownsRGBdata=false; //always just deallocate cv::Mat from stack + } ~Image() { free(); }; @@ -193,6 +202,7 @@ namespace Rotor { h=rgb.cols; return true; } + //leaks Image* clone(){ Image *t=new Image(); t->rgb=rgb.clone(); diff --git a/rotord/src/rotor.h b/rotord/src/rotor.h index dc7d737..fe85b4d 100644 --- a/rotord/src/rotor.h +++ b/rotord/src/rotor.h @@ -416,7 +416,7 @@ namespace Rotor { }; void reset(){ time_taken=0.0; - int(); + init(); } void time_frame(){ struct timeval end_time; @@ -1153,24 +1153,30 @@ namespace Rotor { }; Image *output(const Frame_spec &frame){ if (feedbackptr->RGBdata){ + //feedback.push_back((*(*feedbackptr).clone())); feedback.push_back(*feedbackptr); - feedbacknums.push_back(frame.frame()); - cerr<<"video feedback: added, "<<feedback.size()<<" images in cache"<<endl; + feedbacknums.push_back(frame.lastframe().frame()); + //cerr<<"video feedback: added, "<<feedback.size()<<" images in cache"<<endl; list<Image>::iterator it1=feedback.begin(); list<int>::iterator iit1=feedbacknums.begin(); - if (feedback.size()>((int)parameters["delay"]->value)){ - if (feedback.size()>((int)parameters["delay"]->value+1)){ + if (feedback.size()>((int)parameters["delay"]->value)-1){ + if (feedback.size()>((int)parameters["delay"]->value)){ list<Image>::iterator it2=feedback.begin(); list<int>::iterator iit2=feedbacknums.begin(); - advance(it2,feedback.size()-(((int)parameters["delay"]->value)+1)); - advance(iit2,feedback.size()-(((int)parameters["delay"]->value)+1)); + advance(it2,feedback.size()-(((int)parameters["delay"]->value))); + advance(iit2,feedback.size()-(((int)parameters["delay"]->value))); feedback.erase(it1,it2); feedbacknums.erase(iit1,iit2); - cerr<<"video feedback: removed, "<<feedback.size()<<" images remain in cache"<<endl; + //cerr<<"video feedback: removed, "<<feedback.size()<<" images remain in cache"<<endl; it1=feedback.begin(); iit1=feedbacknums.begin(); } - cerr<<"frame "<<(frame.frame())<<", feedback "<<(*iit1)<<endl; + /* + string l="["; + for (auto f:feedbacknums) l=l+toString(f)+","; + l+="]"; + cerr<<"frame "<<(frame.frame())<<", feedback "<<(*iit1)<<" of "<<l<<endl; + */ return &(*it1); } } |
