2016-09-26 3 views
0

J'ai une application multi-thread écrite en C++ avec Qt5.7 et OpenNI. Il a un thread principal qui commence un deuxième thread qui capture la trame d'un fichier d'enregistrement .oni (asus xtion pro live) fait un certain traitement et par le mécanisme de slot-signal Qt passe le cadre au thread principal, qui l'affiche en utilisant imshow(). Ce que je veux faire est de mettre en œuvre une touche de pause, en appuyant par exemple sur 'p' la pause de traitement. Je pense à quelque chose comme ceci:en utilisant opencv waitKey() dans une application multithread

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; 
     } 
    } 
} 

De cette façon, il ne fonctionne pas, je pense que c'est parce que le cadre est affiché par un autre thread (le principal), le waitKey() ici bloque simplement l'ensemble du processus, mais si je le mets dans le thread principal, juste après imshow() de cette façon:

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

waitkey semble être ignoré (l'image présentant des œuvres bien) .. une idée?

EDIT La partie GUI n'est utilisée qu'à des fins de débogage.

+0

'imshow',' waitKey' et d'autres fonctionnalités dans 'highgui' sont destinés uniquement au débogage. Puisque vous utilisez déjà Qt, je suggère de montrer les images à travers les fonctionnalités Qt qui vont se comporter correctement avec les threads – Miki

+0

l'affichage de l'image fonctionne bien maintenant, le seul problème que j'ai est avec waitkey(). Suggérez-vous d'utiliser une fonction Qt avec les mêmes fonctionnalités? Pourriez-vous en suggérer un? – rok

+0

Cochez [KeyEvent] (http://doc.qt.io/qt-5/qkeyevent.html), mais ce n'est pas vraiment mon truc ... Je ne fais que suggérer d'utiliser Qt pour toutes les fonctionnalités de l'interface graphique, car les fonctionnalités OpenCV ne sont pas destinés à être utilisés pour des tâches complexes. – Miki

Répondre

1

Vous devez implémenter un buffer FIFO thread-safe ou un tampon circulaire dans votre thread d'affichage. Le signal du fil de la caméra pousserait les images vers ce tampon et le fil d'affichage les retirerait et les afficherait dans une boucle séparée. C'est seulement ainsi que vous séparez la boucle d'événement de caméra du fil d'affichage.