c++ - 在第二个线程中显示图像,OpenCV?

标签 c++ multithreading image-processing opencv

我有一个循环以 250fps 的速度从高速帧抓取器中获取图像。

/** Loop processes 250 video frames per second **/
while(1){
  AcquireFrame();
  DoProcessing();
  TakeAction();
}

同时,我希望用户能够监控正在发生的事情。用户只需要以大约 30 fps(或更低)的速度查看图像。如何设置第二个线程,每隔一段时间显示当前帧?

Thread(){
  cvShowImage();
  Wait(30); /** Wait for 30 ms **/
}

我在 Windows 上使用 MinGW、gcc 和 OpenCV 1.1 的四核 Intel 机器。主要标准是显示线程必须尽可能少地离开我的主处理循环。每一毫秒都很重要。

我已经尝试使用 CreateThread() 来创建一个带有 cvShowImage()cvWaitKey() 的新线程,但是 apparently those functions are not threadsafe .

我正在考虑使用 OpenMP,但有些人 report problems with OpenMP and OpenCV .我也在考虑尝试使用 DirectX directDraw,因为它显然非常快。但它looks complicated显然有problems using Windows DLL's with MinGw .

这些途径中的哪一个是最好的起点?

最佳答案

好的。很尴尬的是,我的问题也是它自己的答案。

使用我的问题中描述的 CreateThread()CvShowImage()CvWaitKey() 确实有效 - 与一些帖子相反否则建议的网络。

无论如何,我实现了这样的东西:

/** Global Variables **/
bool DispThreadHasFinished;
bool MainThreadHasFinished;
iplImage* myImg;

/** Main Loop that loops at >100fps **/
main() {
  DispThreadHasFinished = FALSE;
  MainThreadHasFinished = FALSE;
  CreateThread(..,..,Thread,..);

  while( IsTheUserDone() ) {
    myImg=AcquireFrame();
    DoProcessing();
    TakeAction();
  }
  MainThreadHasFinished = TRUE;

  while ( !DisplayThreadHasFinished ) {
     CvWaitKey(100);
  }

  return;
}

/** Thread that displays image at ~30fps **/
Thread() {
  while ( !MainThreadHasFinished ) {
    cvShowImage(myImg);
    cvWaitKey(30);
  }
DispThreadHasFinished=TRUE;
return;
}

当我最初发布这个问题时,我的代码由于不相关的原因而失败。我希望这会有所帮助!

关于c++ - 在第二个线程中显示图像,OpenCV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050369/

相关文章:

c++ - std::move 返回和输入引用参数

c++ - 混合/修改数组访问

.net - 将事件与ThreadPool.RegisterWaitForSingleObject一起使用是否安全?

javascript - 防止浏览器缓存上传图片

c++ - 程序输出仅在多线程程序中有时出现

c++ - 适用于 WinAPI 和 WinRT 的单个 DirectX/C++ 项目

Android:具有多个 UI Activity (多线程/处理程序)的蓝牙 SPP 应用程序的一般方向

java - Reactor 2.0 中的多线程 - 为什么我不能将信号输出到多个线程

python - 检测噪声帧

Java 图像作为 OpenGL 纹理映射的 ByteBuffer