Vehicle_Road_Counter/src/videoService/video_pipeline.hpp

77 lines
2.0 KiB
C++
Raw Normal View History

#pragma once
#include <atomic>
#include <condition_variable>
#include <map>
#include <memory>
#include <mutex>
#include <opencv2/opencv.hpp>
#include <queue>
#include <string>
#include <thread>
#include <vector>
#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<DetectionResult> 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<TrackedVehicle>& trackedObjects);
void updateTracker(const std::vector<DetectionResult>& detections);
float computeIOU(const cv::Rect& box1, const cv::Rect& box2);
private:
std::atomic<bool> running_;
std::thread processingThread_; // 主处理线程
std::unique_ptr<YoloDetector> detector_;
// 追踪相关
std::map<int, TrackedVehicle> tracks_;
int next_track_id_ = 0;
// === [新增] 多线程并行处理相关 ===
std::vector<std::thread> worker_threads_; // 3个工作线程
// 输入队列 (待检测)
std::queue<FrameData> input_queue_;
std::mutex input_mtx_;
std::condition_variable input_cv_;
const size_t MAX_INPUT_QUEUE_SIZE = 5; // 限制缓冲大小,防止内存爆炸
// 输出缓冲区 (已检测,等待排序)
// 使用 map 自动按 frame_id 排序,解决乱序问题
std::map<long, FrameData> output_buffer_;
std::mutex output_mtx_;
std::condition_variable output_cv_;
};