OpenCV C++ 多线程提高帧率

Posted

技术标签:

【中文标题】OpenCV C++ 多线程提高帧率【英文标题】:OpenCV C++ Multi-threading to Improve Framerate 【发布时间】:2016-06-24 16:28:24 【问题描述】:

我有一个 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;

【问题讨论】:

“导致我的程序出现色情行为” 应该是错误的。哎呀:D 这既不是教程也不是为我创建代码的网站。您将不得不研究如何在 C++ 中启动线程以及如何在它们之间传递信息。 en.cppreference.com/w/cpp/thread 如果您遇到困难,请发布有关您遇到的特定问题的问题。 pyimagesearch.com/2015/12/21/… 不是 C++,但如果提供了一些好的想法,您可以使用它来编写自己的版本 先录制一段视频并将其用作输入,以验证您的问题是由丢帧引起的! 【参考方案1】:

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

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

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

【讨论】:

不要删除,而是改为 waitKey(1)。如果没有 waitKey,openCV 不会更新窗口内容。 我尝试在 ProcessFrames 中将 waitKey(30) 更改为 waitKey(1),但没有成功。然后我试着把所有的函数都改成waitKey(1),对象检测更稳定了,但它似乎仍然只能每隔几帧工作一次,导致闪烁的开/关效果。

以上是关于OpenCV C++ 多线程提高帧率的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV C++ 多线程

多线程中的 OpenCV CascadeClassifier C++ 接口

OpenCV C++ 多线程加速

将多线程合并到 C++ 中如何提高性能,为啥?

在多线程应用程序中使用 opencv waitKey()

c++ && OpenCV的多线程实时视频传输(TCP on Windows)