在c ++ 11中使用多线程来充分利用OpenCV的CPU

时间:2015-06-10 03:59:33

标签: c++ multithreading opencv c++11

我正在编写一个控制台C ++程序,它使用OpenCV库分析颜色(和其他属性)的影片。我使用cap.retrieve()函数(类似于cap.read())遇到了严重的瓶颈。此操作占用我在程序中调用的任何单个函数中的最长时间,并且在读取高清视频时花费的时间要长得多。尽管如此,我运行程序时的CPU利用率仍然低于50%。

我已经决定最好的行动方案是尝试通过每次我想要从视频中读取(或者#34;检索)图像时创建一个新线程来达到充分利用,具有特定的最大值基于CPU规格的线程数。我已经用C ++ 11对多线程的基础知识做了一些阅读,但我不确定从哪里开始。

以下是我想要多线程的代码部分:

// Run until all frames have been read
while(cap.get(CV_CAP_PROP_POS_FRAMES) != cap.get(CV_CAP_PROP_FRAME_COUNT)) {

  // look at but do not read the frame
  cap.grab();

  // only process if user wants to process it
  // eg: if resolution = 20 then will only process every 20 frames
  if (int(cap.get(CV_CAP_PROP_POS_FRAMES)) % resolution == 0) {

    // multithread everything inside this loop??

    Mat frame;

    // retrieve frame and get data to solve for avg time to retrieve
    double t1 = (double)getTickCount();
    bool bSuccess = cap.retrieve(frame);
    t1 = ((double)getTickCount() - t1)/getTickFrequency();
    readT.push_back(t1);

    //if not success, break loop
    if (!bSuccess) {
      break;
    }

    // Get avg color and data to calculate total avg color
    // get data to solve for avg time to calc mean
    HIDDEN

   // adds a single row of the avg color to the colorCloud mat
   HIDDEN
  }
}

提前感谢您的帮助。从链接到资源到教程或伪代码的任何内容都将非常感谢!

0 个答案:

没有答案