2016-09-26 12 views
0

У меня есть многопоточное приложение, написанное на C++ с Qt5.7 и OpenNI. У него есть основной поток, который запускает второй поток, который захватывает кадр из файла записи .oni (asus xtion pro live) выполняет некоторую обработку, и через механизм сигнала с интервалом Qt передает кадр в основной поток, который отображает его с помощью . Что я хочу сделать, так это реализовать клавишу паузы, так что нажатие, например, «p» на паузу обработки. Я имею в виду что-то вроде этого:using opencv waitKey() в многопоточном приложении

void Camera::run(){ 
    while(!cameraStop && this->device.isValid()) 
    { 
     try { 
     if (!buttonPause) { 
      getFrame(); 
      process(); 
      emit sigFrameImageReady(frame); 
      if (cv::waitKey(1)==112){ 
       setButtonPause(!(getButtonPause())); 
      } 
      } 

     } 
     catch(std::exception &ex) { 
     std::cerr << "getFrame()" << ex.what() << std::endl; 
     } 
    } 
} 

Таким образом, он не работает, я думаю, что это потому, что кадр отображается другим потоком (главной), в waitKey() здесь просто блокирует весь процесс, но если я ставлю его в основном потоке, только после того, как imshow() таким образом:

void Process::FrameImageReady(cv::Mat FrameImage) 
{ 
    if (modedebug) 
    cv::imshow("bgr", FrameImage); 
    if (cv::waitKey(1)==112){ 
    cam->setButtonPause(!(getButtonPause())); 
    } 
} 

WaitKey кажется игнорироваться (изображение отображения работает отлично) .. какие-либо идеи?

EDIT Часть GUI предназначена только для целей отладки.

+0

'imshow',' waitKey' и другие функции в 'highgui' предназначены только для целей отладки. Поскольку вы уже используете Qt, я предлагаю показать изображения через Qt-функции, которые будут корректно вести себя с помощью потоков – Miki

+0

. Теперь отображение изображений отлично работает, единственная проблема, с которой я столкнулся, - это waitkey(). Вы предлагаете использовать функцию Qt с одинаковыми функциональными возможностями? Не могли бы вы предложить его? – rok

+0

Проверьте [KeyEvent] (http://doc.qt.io/qt-5/qkeyevent.html), но это не мое дело ... Я просто предлагаю использовать Qt для всего GUI-материала, поскольку функции OpenCV не предназначены для использования в сложных задачах. – Miki

ответ

1

Вы должны внедрить поточный буфер FIFO или круговой буфер в отображаемом потоке. Сигнал от потока камеры будет толкать изображения в этот буфер, и отображающий поток будет вынимать их и отображать их в отдельном цикле. Только таким образом вы выделяете петлю событий камеры из потока отображения.

 Смежные вопросы

  • Нет связанных вопросов^_^