#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 да, конечно, если это показывает, в чем проблема, с которой вы столкнулись