123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- #pragma once
- #include <iostream>
- #include <map>
- #include <chrono>
- #include <opencv2/opencv.hpp>
- #include "proto/def.grpc.pb.h"
- #include "tool/lock_class.hpp"
- class MatDataBuffer : public lockFunc<MatDataBuffer>{
- public:
- static MatDataBuffer *iter() {
- static MatDataBuffer *instance = nullptr;
- if (instance == nullptr) {
- instance = new MatDataBuffer();
- }
- return instance;
- }
- bool set(int azimuth, int lable, cv::Mat &mat) {
- if (azimuth >= DeviceAzimuth::DEVICE_AZIMUTH_MAX) {
- return false;
- }
- if (data[azimuth].size() > 10) {
- data[azimuth].erase(data[azimuth].begin());
- }
- data[azimuth].emplace_back(lable, mat);
- return true;
- }
- bool get(int azimuth, int lable, cv::Mat &mat, double timeout = 10) {
- if (azimuth >= DeviceAzimuth::DEVICE_AZIMUTH_MAX) {
- LOG(INFO) << "azimuth: " << azimuth << " < " << DeviceAzimuth::DEVICE_AZIMUTH_MAX;
- return false;
- }
- for (auto & iter : data[azimuth]) {
- if (iter.lable != lable) {
- //LOG(INFO) << lable << " != " << iter.lable;
- continue;
- } else {
- std::chrono::duration<double> cost = std::chrono::steady_clock::now() - iter.t;
- if (cost.count() > timeout) {
- //LOG(INFO) << "data is too old : " << cost.count() << "s";
- return false;
- } else {
- mat = iter.mat.clone();
- return true;
- }
- }
- }
- //(INFO) << "Not found data: " << lable << " in device " << azimuth;
- return false;
- }
- bool setIr(int lable, cv::Mat &mat) {
- if (ir.size() > 10) {
- ir.erase(ir.begin());
- }
- ir.emplace_back(lable, mat);
- return true;
- }
- bool getIr(int lable, cv::Mat &mat, double timeout = 10) {
- for (auto & iter : ir) {
- if (iter.lable != lable) {
- //LOG(INFO) << lable << " != " << iter.lable;
- continue;
- } else {
- std::chrono::duration<double> cost = std::chrono::steady_clock::now() - iter.t;
- if (cost.count() > timeout) {
- //LOG(INFO) << "data is too old : " << cost.count() << "s";
- return false;
- } else {
- mat = iter.mat.clone();
- return true;
- }
- }
- }
- //(INFO) << "Not found data: " << lable << " in device " << azimuth;
- return false;
- }
- private:
- struct DataBufferInfo {
- std::chrono::steady_clock::time_point t;
- int lable;
- cv::Mat mat;
- DataBufferInfo(int lable_, cv::Mat &mat_) : lable(lable_), mat(mat_.clone()) {
- t = std::chrono::steady_clock::now();
- }
- };
- private:
- std::vector<DataBufferInfo> data[DeviceAzimuth::DEVICE_AZIMUTH_MAX];
- std::vector<DataBufferInfo> ir;
- };
- class LabelYoloDataBuffer : public lockFunc<LabelYoloDataBuffer> {
- public:
- static LabelYoloDataBuffer *iter() {
- static LabelYoloDataBuffer *instance = nullptr;
- if (instance == nullptr) {
- instance = new LabelYoloDataBuffer();
- }
- return instance;
- }
- bool set(JetStream::LabelYolo &yolo) {
- if (data.size() > 10) {
- data.pop();
- }
- data.push(yolo);
- return true;
- }
- bool get(JetStream::LabelYolo &yolo, double timeout = 10) {
- if (data.empty()) {
- return false;
- }
- yolo = data.front();
- data.pop();
- return true;
- }
- private:
- std::queue<JetStream::LabelYolo> data;
- };
|