139 lines
3.1 KiB
C++
139 lines
3.1 KiB
C++
// globals.h
|
|
#ifndef GLOBALS_H
|
|
#define GLOBALS_H
|
|
|
|
#include <MIL.h>
|
|
#include <QMutex>
|
|
#include <opencv2/opencv.hpp>
|
|
#include <QSemaphore>
|
|
#include <QDir>
|
|
#include <QCoreApplication>
|
|
#include <queue>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
#include <optional>
|
|
#include <thread>
|
|
#include <atomic>
|
|
#include "onnxrunner.h"
|
|
|
|
// 图片显示0
|
|
extern QMutex gDispPicMutex0;
|
|
extern MIL_ID gDispCurrentPicId0;
|
|
|
|
// 图片显示1
|
|
extern QMutex gDispPicMutex1;
|
|
extern MIL_ID gDispCurrentPicId1;
|
|
|
|
// 掩膜互斥锁和ID
|
|
extern QMutex gMaskMutex0;
|
|
extern MIL_ID gMask0;
|
|
|
|
extern QMutex gMaskMutex1;
|
|
extern MIL_ID gMask1;
|
|
|
|
// 检测准备信号量
|
|
extern QSemaphore detection_ready;
|
|
|
|
|
|
|
|
// 获取保存目录和配置目录函数
|
|
QString getSaveDirectory();
|
|
QString getConfigDirectory();
|
|
|
|
// 定义一个结构体来存储图像数据及其来源相机ID
|
|
struct ImageData
|
|
{
|
|
int camera_id;
|
|
cv::Mat image;
|
|
};
|
|
|
|
// 添加 DetectionResult 结构体
|
|
struct DetectionResult {
|
|
QMutex mutex; // 保护数据的互斥锁
|
|
std::vector<std::vector<uint8_t>> dl_mask; // 深度学习掩膜
|
|
std::vector<std::vector<uint8_t>> traditional_mask; // 传统算法掩膜
|
|
};
|
|
|
|
extern DetectionResult g_detection_result[2];
|
|
|
|
// 线程安全队列模板类
|
|
template <typename T>
|
|
class ThreadSafeQueue{
|
|
public:
|
|
// 添加元素到队列
|
|
void enqueue(const T& item)
|
|
{
|
|
std::unique_lock<std::mutex> lock(mutex_);
|
|
queue_.push(item);
|
|
cond_var_.notify_one();
|
|
}
|
|
|
|
// 从队列中移除并获取元素
|
|
bool dequeue(T& item)
|
|
{
|
|
std::unique_lock<std::mutex> lock(mutex_);
|
|
while (queue_.empty() && !stop_)
|
|
{
|
|
cond_var_.wait(lock);
|
|
}
|
|
if (queue_.empty())
|
|
return false;
|
|
item = std::move(queue_.front());
|
|
queue_.pop();
|
|
return true;
|
|
}
|
|
|
|
// 查看队列中的第一个元素而不移除
|
|
bool front(T& item)
|
|
{
|
|
std::unique_lock<std::mutex> lock(mutex_);
|
|
while (queue_.empty() && !stop_)
|
|
{
|
|
cond_var_.wait(lock);
|
|
}
|
|
if (queue_.empty())
|
|
return false;
|
|
item = queue_.front(); // 直接复制,不移除
|
|
return true;
|
|
}
|
|
|
|
// 停止队列,唤醒所有等待的线程
|
|
void stop()
|
|
{
|
|
std::unique_lock<std::mutex> lock(mutex_);
|
|
stop_ = true;
|
|
cond_var_.notify_all();
|
|
}
|
|
|
|
// 检查队列是否为空
|
|
bool empty()
|
|
{
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
return queue_.empty();
|
|
}
|
|
|
|
private:
|
|
std::queue<T> queue_;
|
|
std::mutex mutex_;
|
|
std::condition_variable cond_var_;
|
|
bool stop_ = false;
|
|
};
|
|
|
|
// 定义全局存储队列
|
|
extern ThreadSafeQueue<ImageData> g_storageQueue;
|
|
|
|
// 定义全局图像队列和结果队列
|
|
extern ThreadSafeQueue<ImageData>* g_img_Queue[2];
|
|
extern ThreadSafeQueue<ImageData>* g_result_Queue[2];
|
|
|
|
// 定义全局识别线程
|
|
extern std::thread* g_recognitionThread[2];
|
|
|
|
// 定义线程控制变量
|
|
extern std::atomic<bool>* g_recognitionRunning[2];
|
|
|
|
// 定义全局ONNXRunner实例数组
|
|
extern ONNXRunner* g_runner_array[2];
|
|
|
|
#endif // GLOBALS_H
|