使用线程刷新opencv的问题

时间:2011-04-11 10:37:35

标签: c++ multithreading opencv pthreads refresh

我正在使用两个帖子:

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

显示它们的线程

在第二个帖子中,我正在使用cvWaitKey(200); (我也尝试过其他值......)

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

我怎么能解决这个问题?

编辑: 当我在线程中显示图像时,我松开了帧。它应该是正常的吗?

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

EDIT3: 这就是我正在做的或多或少:

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
}

}

干杯

1 个答案:

答案 0 :(得分:0)

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