Обновление проблем с opencv с использованием потоков

#c #multithreading #opencv #pthreads #refresh

#c #многопоточность #opencv #pthreads #обновить

Вопрос:

Я использую два потока:

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

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

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

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

Редактировать: когда я показываю изображения в потоке, я теряю фреймы. Должно ли это быть нормальным?

Edit2: я попытался также визуализировать в потоке 2 старых фрейма вместо нового, но с тем же результатом..

Правка3: Это то, что я делаю более или менее:

 void *showImages( void *ptr )
{
  bool showit = false;
  while (!MainThreadHasFinished) 
  {

    pthread_mutex_lock( amp;mutex1 );
    if(ImageGenerated = true) 
       showit = true;
     else
       showit = false;
    pthread_mutex_unlock( amp;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( amp;showImagesThread, NULL, showImages, (void*) message1);

   for (;;) {
    pthread_mutex_lock( amp;mutex1 );
    ImageGenerated = false;
    pthread_mutex_unlock( amp;mutex1 );

        //get frame here in showImg

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

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

//other stuff
}

}
  

Приветствия

Комментарии:

1. Что происходит с этой строкой «if (ImageGenerated = true)»? Вы хотели «==» вместо «=»?

2. Это на платформе Win? Вы использовали pthreads-win32?

Ответ №1:

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

Комментарии:

1. проблема в том, что cvshowimage нуждается в cvWaitKey (X), а затем, если я показываю изображения в основном потоке, я теряю фреймы, потому что X приводит к потере ms (где может появиться фрейм)

2. весь код состоит из тысячи строк, я собираюсь опубликовать базовый код case, чтобы лучше объяснить, хорошо

3. @nanz да, конечно, если это показывает, в чем проблема, с которой вы столкнулись