Opencv - как использовать одно и то же окно с методом imshow (), который используется многими потоками

0

Мой код ниже работает иногда, и иногда он работает не так, как ожидалось. В основном я создал пул потоков, которые должны представлять изображения в одном окне. Чтобы добиться этого эффекта, каждая группа методов потоков вызывает imshow (windowName) с тем же именем (переменная windowName). Поэтому каждая группа потоков имеет конкретное окно, в котором должно отображаться изображение.

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

Что было бы хорошим решением для обеспечения того, чтобы только первый поток запускал imshow()? Возможно, этот подход неправильный или не очень хороший, и я хотел бы знать об этом!

Часть кода приведена ниже:

    int processVideo(char * videoFileName, char * projectNameIn, vector<SelectedRegion> * v_region, char * configPar) {

        char mainWindowName[100];
        static char threadWindow[sizeof(mainWindowName)];
        //Some code here
        sprintf_s(mainWindowName, "ImageProc[Thread Session ID: %00d]", config.threadGroupSession);
        //Some code here
        cv::Mat videoFrameFeed;

        while(capture.read(videoFrameFeed) && !terminateApp){
            //Some code here
            imshow(mainWindowName, videoFrameFeed);
            //Some code here
        }
   }
  • 2
    используйте cv::namedWindow в основном потоке, и пусть потоки используют только cv::imshow для своих (ранее созданных) windownames.
  • 4
    Кроме того: напомните, что openCV highgui не предназначен для использования конечными пользователями, а только для быстрых механизмов тестирования / визуализации вашего проекта в процессе разработки. Если вы находитесь за этим состоянием, переключитесь на какой-нибудь настоящий интерфейс ... Qt или что-то в этом роде.
Показать ещё 2 комментария
Теги:
opencv
multithreading

1 ответ

0

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

//Global Variable
bool global_llock_for_thread = false;

void look_session_image_proc(){
    while(global_llock_for_thread){
        //wait for unlook;
    }

    global_llock_for_thread = true;
}

void unlook_session_image_proc(){
    global_llock_for_thread = false;
}

После этого я добавляю код ниже.

while(capture.read(videoFrameFeed) && !terminateApp){
    //Some code here
    unlook_session_image_proc();

    imshow(mainWindowName, videoFrameFeed);

    unlook_session_image_proc();

    //Some code here
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню