c++ - OpenCV C++多线程提高帧率

标签 c++ multithreading opencv image-processing

我有一个 opencv 程序,其中图像处理对视频捕获中具有稳定且相对较高的帧率很敏感。不幸的是,我所做的所有图像处理都会显着降低帧速率,从而导致我的程序出现错误行为。我相信将相机放在一个单独的线程上并在其自己的线程上进行图像处理会提高帧率,但我不确定该怎么做。谁能指导我完成整个过程?

更新:在对线程进行了一些研究之后,我设法将线程实现到显示经过后处理的最终视频提要的位置。然而,不知何故,我对它的实现导致图像处理方法失败(例如,在我能够成功跟踪移动物体之前,现在无论是否被跟踪都是错误的)。我怀疑这与图像处理算法无法在读入新帧时足够快地处理每一帧有关。我如何改进此实现,以便我的处理方法像在没有多线程的情况下一样工作?

void CaptureFrames() {
  VideoCapture capture(0);
  if (!capture.isOpened()) {
      cout << "cannot open camera" << endl;
  }

  while (true) {
      //CAMERAFRAME is a global Mat defined at the top of my program
      capture.read(CAMERAFRAME);
      if (waitKey(30) >= 0) { break; }
  }
}

void ProcessFrames() {

  while (true) {



    Mat hsvFrame;
    Mat binMat;
    Mat grayFrame;
    Mat grayBinMat;

    if (!CAMERAFRAME.empty()) {
        //do image processing functions (these worked before implementing threads and are not causing errors)

        imshow("gray binary", grayBinMat);
        imshow("multithread test", CAMERAFRAME);
    }



    if (waitKey(30) >= 0) { break; }
   }
}

int main(int argc, char** argv[]) {
  thread t1(CaptureFrames);
  thread t2(ProcessFrames);

  while(true) {
    if(waitKey(30) >= 0) {break;}
  }

  return 0;
}

最佳答案

再次尝试旧版本,但从 ProcessFrames 函数中删除最后一行。

if (waitKey(30) >= 0) { break; }

在显示图像时不要让它再次等待 30 毫秒,while 循环就足够了

关于c++ - OpenCV C++多线程提高帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38018095/

相关文章:

opencv - 属性错误 : MultiTracker_create() Not Found in cv2 on Raspberry Pi

c++ - 相机矩阵条目的 OpenCV 坐标系

c++ - 找不到问题 - [错误] ld 返回 1 退出状态

c++ - 使用绝对路径指定库的 GCC 行为是什么

c++11 线程不修改相同的值

java - Java 中使用堆栈的生产者-消费者

python - 曝光模式 OpenCV 4.0.1

c++ - 使用 AJAX 和 c++/cli 与 Web 服务器交互

c++ - 在哪里可以找到运算符重载列表?

java - 复制 volatile ArrayList 的元素