#pragma once #include #include #include #include #include namespace pipeline { class FrameQueue { public: explicit FrameQueue(size_t max_size = 30); ~FrameQueue(); // 禁用拷贝 FrameQueue(const FrameQueue&) = delete; FrameQueue& operator=(const FrameQueue&) = delete; // 推入一帧(带超时) bool push(const cv::Mat& frame, std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)); // 弹出一帧(带超时) bool pop(cv::Mat& frame, std::chrono::milliseconds timeout = std::chrono::milliseconds(1000)); // 清空队列 void clear(); // 关闭队列 void close(); // 获取队列状态 bool empty() const; bool full() const; size_t size() const; size_t capacity() const { return max_size_; } bool is_closed() const { return is_closed_; } private: std::queue queue_; // 帧队列 mutable std::mutex mutex_; // 互斥锁 std::condition_variable not_full_; // 队列未满条件变量 std::condition_variable not_empty_; // 队列非空条件变量 const size_t max_size_; // 最大队列大小 bool is_closed_{false}; // 队列是否关闭 }; } // namespace pipeline