glitch.gui/examples/rect_size/frame_collection.hpp
Source: glitch.gui/examples/rect_size/frame_collection.hpp
#ifndef _FRAME_COL_H_
#define _FRAME_COL_H_
#include"acidcam/ac.h"
#include<deque>
class FrameCollection {
public:
FrameCollection();
FrameCollection(size_t max);
FrameCollection(const FrameCollection &f);
FrameCollection(FrameCollection &&f);
FrameCollection &operator=(const FrameCollection &f);
FrameCollection &operator=(FrameCollection &&f);
void shiftFrames(const cv::Mat &frame);
const cv::Mat &operator[](size_t pos) const;
cv::Mat &operator[](size_t pos);
void setMaxFrames(size_t max);
void clear();
size_t count() const;
void set(size_t index, const cv::Mat &frame);
bool get(size_t index, cv::Mat &frame);
cv::Mat &get_frame(size_t index);
cv::Mat *at(size_t index);
private:
size_t max_frames;
std::deque<cv::Mat> frames;
};
FrameCollection::FrameCollection() {
setMaxFrames(8);
}
FrameCollection::FrameCollection(size_t max) {
setMaxFrames(max);
}
FrameCollection::FrameCollection(const FrameCollection &f) : max_frames{f.max_frames}, frames{f.frames} {}
FrameCollection::FrameCollection(FrameCollection &&f) : max_frames{f.max_frames}, frames{std::move(f.frames)} {}
FrameCollection &FrameCollection::operator=(const FrameCollection &f) {
max_frames = f.max_frames;
if(!frames.empty())
frames.erase(frames.begin(), frames.end());
std::copy(f.frames.begin(), f.frames.end(), std::back_inserter(frames));
return *this;
}
FrameCollection &FrameCollection::operator=(FrameCollection &&f) {
max_frames = f.max_frames;
frames = std::move(f.frames);
return *this;
}
void FrameCollection::shiftFrames(const cv::Mat &frame) {
if(frames.size() < max_frames) {
for(size_t i = 0; i < max_frames; ++i) {
frames.push_back(frame);
}
return;
}
frames.push_front(frame);
frames.pop_back();
}
void FrameCollection::clear() {
if(!frames.empty()) {
frames.erase(frames.begin(), frames.end());
}
}
size_t FrameCollection::count() const {
return frames.size();
}
const cv::Mat &FrameCollection::operator[](size_t pos) const {
return frames[pos];
}
cv::Mat &FrameCollection::operator[](size_t pos) {
return frames[pos];
}
void FrameCollection::setMaxFrames(size_t max) {
max_frames = max;
}
void FrameCollection::set(size_t index, const cv::Mat &frame) {
frames[index] = frame.clone();
}
bool FrameCollection::get(size_t index, cv::Mat &frame) {
if(index < frames.size()) {
frame = frames[index];
return true;
}
return false;
}
cv::Mat &FrameCollection::get_frame(size_t index) {
return frames[index];
}
cv::Mat *FrameCollection::at(size_t index) {
if(index < frames.size())
return &frames[index];
return nullptr;
}
#endif