Blame view

src/reprocessing_module/save_snapshot_reprocessing.cpp 3.09 KB
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
1
2
3
4
5
6
7
  #include "save_snapshot_reprocessing.h"
  #include <thread>
  
  #include "opencv2/opencv.hpp"
  #include <opencv2/imgproc/types_c.h>
  #include <algorithm>
  #include "../common/logger.hpp"
29b64a88   Hu Chunming   添加行人逆行算法
8
  #include "../util/vpc_util.h"
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  
  const bool DRAW_ON_IMG = false;
  
  int save_img_thread_process(void* param) {
    save_snapshot_reprocessing *pThreadParam = (save_snapshot_reprocessing *)param;
    if (pThreadParam != nullptr){
      pThreadParam->save_img_process();
    }
    return 0;
  }
  
  // 初始化快照保存模块 开启图片保存线程
  save_snapshot_reprocessing::save_snapshot_reprocessing(int devId) {
  #ifdef POST_USE_RABBITMQ
    callback_ = nullptr;
  #endif
  
ca992942   Hu Chunming   优化图片保存
26
27
    m_devId = devId;
  
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
28
    bFinish = false;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
29
  
ca992942   Hu Chunming   优化图片保存
30
31
32
33
    for (size_t i = 0; i < SAVE_THREAD_COUNT; i++)
    {
      m_save_img_thread[i] = std::thread(save_img_thread_process, this);
    }
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
34
35
36
37
38
  }
  
  save_snapshot_reprocessing::~save_snapshot_reprocessing(){
    // 结束线程
    bFinish = true;
ca992942   Hu Chunming   优化图片保存
39
40
41
42
    for (size_t i = 0; i < SAVE_THREAD_COUNT; i++)
    {
      m_save_img_thread[i].join();
    }
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
43
44
45
46
47
48
49
50
51
52
53
54
  }
  
  // 释放资源
  void save_snapshot_reprocessing::save_snapshot_reprocessing_release() {
  
    std::unique_lock<std::mutex> l(waitforsave_img_queue_mutex);
  
    while (!waitforsave_img_queue.empty()) {
      ImgSaveInfo cur_image = waitforsave_img_queue.front();
      waitforsave_img_queue.pop();
  
      if(!cur_image.file_path.empty()){
29b64a88   Hu Chunming   添加行人逆行算法
55
        VPCUtil::vpc_img_release(cur_image.img_info);
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
      }
    }
  
    l.unlock();
  }
  
  #ifdef POST_USE_RABBITMQ
  
  // 设置MQ返回回调函数 方便内部调用MQ推送结果
  void save_snapshot_reprocessing::set_callback(callback_t cb) {
    callback_ = cb;
  }
  
  #endif // #ifdef POST_USE_RABBITMQ
  
  
  void save_snapshot_reprocessing::reprocessing_process_wo_locus_async(ImgSaveInfo saveInfo){
  
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
74
75
     while(!bFinish){
      waitforsave_img_queue_mutex.lock();
ca992942   Hu Chunming   优化图片保存
76
      if(waitforsave_img_queue.size() > 320){
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
77
78
79
80
81
82
83
84
85
86
87
88
        waitforsave_img_queue_mutex.unlock();
        std::this_thread::sleep_for(std::chrono::milliseconds(5));
        continue;
      }
      waitforsave_img_queue.push(saveInfo);
      waitforsave_img_queue_mutex.unlock();
      break;
    }
    
  }
  
  void save_snapshot_reprocessing::save_img_process() {
ca992942   Hu Chunming   优化图片保存
89
90
91
    JpegUtil jpegUtil;
    jpegUtil.jpeg_init(m_devId);
  
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
92
93
94
95
96
97
    while (true) {
      if (bFinish){
        break;
      }
  
      std::this_thread::sleep_for(std::chrono::milliseconds(2));
ca992942   Hu Chunming   优化图片保存
98
      waitforsave_img_queue_mutex.lock();
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
99
100
101
102
      if (!waitforsave_img_queue.empty()) {
        LOG_DEBUG("waitforsave_image_queue size: {}", waitforsave_img_queue.size());
        ImgSaveInfo cur_image = waitforsave_img_queue.front();
        waitforsave_img_queue.pop();
ca992942   Hu Chunming   优化图片保存
103
        waitforsave_img_queue_mutex.unlock();
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
104
  
75b6ea89   Hu Chunming   完善mq消息发送
105
        bool bPost = false;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
106
        if(!cur_image.file_path.empty()){
758b0072   Hu Chunming   代码优化
107
108
          bPost = jpegUtil.jpeg_encode(cur_image.img_info.pic_desc, cur_image.file_path);
          if(!bPost){
ca992942   Hu Chunming   优化图片保存
109
            LOG_ERROR("jpeg_encode failed");
758b0072   Hu Chunming   代码优化
110
          } 
75b6ea89   Hu Chunming   完善mq消息发送
111
112
        } else {
          bPost = true;
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
113
        }
29b64a88   Hu Chunming   添加行人逆行算法
114
        VPCUtil::vpc_img_release(cur_image.img_info);
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
115
116
  
  #ifdef POST_USE_RABBITMQ
75b6ea89   Hu Chunming   完善mq消息发送
117
        if (bPost && callback_ != nullptr && cur_image.json_str.length() > 0) {
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
118
          callback_(cur_image.json_str.c_str());
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
119
120
121
122
        }
  #endif
  
      } else {
ca992942   Hu Chunming   优化图片保存
123
        waitforsave_img_queue_mutex.unlock();
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
124
      }
0b4cd5d5   Hu Chunming   完成轨迹定时抓拍
125
    }
ca992942   Hu Chunming   优化图片保存
126
127
128
  
    jpegUtil.jpeg_release();
  }