Обновление проблем с opencv с использованием потоков - PullRequest
1 голос
/ 11 апреля 2011

Я использую две темы:

поток 1 - это тот, который берет кадры с камеры и обрабатывает их поток 2 отображает их с помощью cvshowimage

Во втором потоке я использую cvWaitKey (200); (я пробовал и другие значения ..)

Проблема в том, что показываются первые изображения, но через некоторое время их уже нет (такая же ситуация возникает при попытке переместить окно. Он зависает и иногда изображение становится пустым ..

Есть идеи, как решить эту проблему?

Edit: когда я показываю изображения в теме, я теряю кадры. Это должно быть нормально?

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 голосов
/ 11 апреля 2011

Я не уверен, что попытка показать что-то на GUI из другого потока - очень хорошая идея.Если я неправильно понял, что вы говорите, вы должны напрямую вызывать cvshowimage из потока GUI.

...