Advertisement
jack06215

[OpenCV] multithread capture

Jul 8th, 2020
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include "barter.h"
  2. #include "fps_stats.hpp"
  3. #include <opencv2/opencv.hpp>
  4. #include <string>
  5. #include <list>
  6. #include <thread>
  7.  
  8. enum ThreadState {
  9.     Pause, Running, Quit
  10. };
  11.  
  12. //std::list<cv::Mat> frames;
  13. cv::VideoCapture cap;
  14. barter<cv::Mat> frame_barter;
  15. std::atomic_int t_state{ ThreadState::Pause };
  16.  
  17. // thread function for video getting and show
  18. void StreamThread(barter<cv::Mat>& frame_barter_, std::atomic_int& t_state_)
  19. {
  20.     auto frame = std::unique_ptr<cv::Mat>(new cv::Mat);
  21.     for (;;) {
  22.         // wait for a new frame to arrive
  23.         while (t_state_ != ThreadState::Running) {
  24.             if (t_state_ == ThreadState::Quit) return;
  25.             std::this_thread::sleep_for(std::chrono::microseconds(30));
  26.         }
  27.         frame_barter_.exchange(frame);
  28.         CV_Assert(frame);
  29.  
  30.         if (frame->empty()) continue;
  31.         //cv::imshow("R1", *frame);
  32.         //cv::waitKey(1);
  33.     }
  34. }
  35.  
  36.  
  37. int main(int, char)
  38. {
  39.     cap.open(0);
  40.  
  41.     //open check
  42.     if (!cap.isOpened()) {
  43.         std::cerr << "Stream open failed : " << std::endl;
  44.         return 1;
  45.     }
  46.  
  47.     cv::setNumThreads(8);
  48.  
  49.  
  50.     std::thread t1{ &StreamThread, std::ref(frame_barter), std::ref(t_state) };
  51.  
  52.     auto frame = std::unique_ptr<cv::Mat>(new cv::Mat);
  53.     std::this_thread::sleep_for(std::chrono::seconds(1));
  54.     std::cout << "cv::getNumThreads(): " << cv::getNumThreads() << std::endl;
  55.  
  56.     fps_stats fps{ "Video" };
  57.     cap >> *frame;
  58.     while (!frame->empty())
  59.     {
  60.         cv::imshow("Result", *frame);
  61.  
  62.         frame_barter.exchange(frame);
  63.         t_state = ThreadState::Running;
  64.  
  65.         if (cv::waitKey(1) >= 0)
  66.         {
  67.             break;
  68.         }
  69.         cap >> *frame;
  70.         fps.tick();
  71.     }
  72.  
  73.     if (t1.joinable())
  74.     {
  75.         t_state = ThreadState::Quit;
  76.         t1.join();
  77.         std::cout << "t1 is joined" << std::endl;
  78.     }
  79.  
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement