#pragma once #include #include #include #include #include #include #include #include #include #include #include "spdlog/spdlog.h" #include "yoloDetector/yolo_detector.hpp" // ... TrackedVehicle 结构体保持不变 ... struct TrackedVehicle { int id; cv::Rect box; float ev_score; int missing_frames; int last_class_id; std::string label; }; // [新增] 每一帧的数据包 struct FrameData { long frame_id; // 帧序号,用于排序 cv::Mat original_frame; // 原始图像 std::vector results; // 检测结果 }; class VideoPipeline { public: VideoPipeline(); ~VideoPipeline(); void Start(const std::string& inputUrl, const std::string& outputUrl); void StartTest(const std::string& filePath, const std::string& outputUrl); void Stop(); private: void processLoop(std::string inputUrl, std::string outputUrl, bool isFileSource); // [新增] 工作线程函数 void inferenceWorker(); void drawOverlay(cv::Mat& frame, const std::vector& trackedObjects); void updateTracker(const std::vector& detections); float computeIOU(const cv::Rect& box1, const cv::Rect& box2); private: std::atomic running_; std::thread processingThread_; // 主处理线程 std::unique_ptr detector_; // 追踪相关 std::map tracks_; int next_track_id_ = 0; // === [新增] 多线程并行处理相关 === std::vector worker_threads_; // 3个工作线程 // 输入队列 (待检测) std::queue input_queue_; std::mutex input_mtx_; std::condition_variable input_cv_; const size_t MAX_INPUT_QUEUE_SIZE = 5; // 限制缓冲大小,防止内存爆炸 // 输出缓冲区 (已检测,等待排序) // 使用 map 自动按 frame_id 排序,解决乱序问题 std::map output_buffer_; std::mutex output_mtx_; std::condition_variable output_cv_; };