在第二个线程OpenCV中显示图像?

And*_*dyL 13 c++ multithreading opencv image-processing

我有一个循环从250fps的高速framegrabbger中获取图像.

/** Loop processes 250 video frames per second **/
while(1){
  AcquireFrame();
  DoProcessing();
  TakeAction();
}
Run Code Online (Sandbox Code Playgroud)

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

Thread(){
  cvShowImage();
  Wait(30); /** Wait for 30 ms **/
}
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试使用CreateThread()创建一个新线程cvShowImage()cvWaitKey(),但显然这些功能不是线程安全的.

我正在考虑使用OpenMP,但有些人报告了OpenMP和OpenCV的问题.我也正在考虑尝试使用DirectX directDraw,因为它显然非常快.但它看起来很复杂,显然使用Windows DLL与MinGw有问题.

哪些途径是最好的起点?

And*_*dyL 10

好.令人尴尬的是,我的问题也是它自己的答案.

使用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;
}
Run Code Online (Sandbox Code Playgroud)

当我最初发布这个问题时,我的代码因无关原因而失败.我希望这有帮助!