使用线程刷新opencv问题

Posted

技术标签:

【中文标题】使用线程刷新opencv问题【英文标题】:Refreshing problems with opencv using threads 【发布时间】:2011-04-11 10:37:34 【问题描述】:

我正在使用两个线程:

线程 1 是从相机获取帧并处理它们的线程 线程 2 是使用 cvshowimage 显示它们的线程

在第二个线程中,我使用 cvWaitKey(200); (我也尝试了其他值..)

问题是显示了第一张图像,但过了一段时间它们不再显示(当您尝试移动窗口时也会出现同样的情况。 它冻结,有时图像变成空白..

知道如何解决这个问题吗?

编辑: 当我在线程中显示图像时,我会丢失框架。应该正常吗?

编辑2: 我还尝试在线程中可视化 2 个旧帧而不是新帧但输出相同..

编辑3: 这就是我或多或少正在做的事情:

void *showImages( void *ptr )

  bool showit = false;
  while (!MainThreadHasFinished) 
  

    pthread_mutex_lock( &mutex1 );
    if(ImageGenerated = true) 
       showit = true;
     else
       showit = false;
    pthread_mutex_unlock( &mutex1 );

    showit = true;

   if(showit == true)
     cvShowImage( "RGB Image", RGBImage); 

    cvWaitKey(500);



IplImage *RGBImage;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
bool ImageGenerated;

int main(int argc, char** argv)

//init camera and other stuff
  int frameCounter=0;
  RGBImage = cvCreateImage( cvSize(RGB_RES_X,RGB_RES_Y),8,3); 
  int iret1 = pthread_create( &showImagesThread, NULL, showImages, (void*) message1);

   for (;;) 
    pthread_mutex_lock( &mutex1 );
    ImageGenerated = false;
    pthread_mutex_unlock( &mutex1 );

        //get frame here in showImg

    frameCounter++;
    if(frameCounter == 10) frameCounter=0;

    if(frameCounter == 2)
       cvCopy(&showImg,RGBImage);  
   pthread_mutex_lock( &mutex1 );
   ImageGenerated = true;
   pthread_mutex_unlock( &mutex1 );

//other stuff



干杯

【问题讨论】:

这行“if(ImageGenerated = true)”是怎么回事?你想要“==”而不是“=”吗? 这是Win平台的吗?你用过 pthreads-win32 吗? 【参考方案1】:

我不确定尝试从另一个线程在 GUI 上显示某些内容是一个非常好的主意。除非我误解了您的意思,否则您应该直接从 GUI 线程调用 cvshowimage

【讨论】:

问题是 cvshowimage 需要 cvWaitKey(X) 然后如果我在主线程中显示图像我会丢失帧,因为 X 让我丢失 ms(帧可能到达的位置) 整个代码就几千行了,我发个case base代码来解释一下好吗 @nanz 是的,只要它显示您遇到的问题是什么

以上是关于使用线程刷新opencv问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenCv 是不是已经线程化?

Opencv 的“findContours”错误:线程停止,代码为 -1073740777

使用opencv线程捕获空白图像

Opencv - 如何使用与多个线程共享的 imshow() 方法相同的窗口

如何使用线程通过 openCV 和 MFC 处理图像

openCV 和线程问题