IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Vidéo corrompue dans une interface (lecture par OpenCV)


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 60
    Points : 36
    Points
    36
    Par défaut Vidéo corrompue dans une interface (lecture par OpenCV)
    J'ai réalisé une GUI sur Debian 6.0 permettant de faire du traitement d'images (Canny Edge) sur des images et un flux vidéo via OpenCV.

    En ce qui concerne les images, tout marche bien mais pour la vidéo, à l'exécution la vidéo est distordue. Le plus génant est que ce bug n'est pas reproductible à chaque exécution, c'est aléatoire.

    Voici un exemple de vidéo distordue :



    Le problème ne vient pas de la webcam puisqu'un petit code purement en OpenCV affiche une bonne vidéo.

    J'utilise dans le code une classe principale ImageViewer dérivée de QMainWindow.

    Le boutton "start webcam" est relié au slot "start_webcam" via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     startwebcamAct = new QAction(tr("&Start Webcam"), this);
     connect(startwebcamAct, SIGNAL(triggered()), this, SLOT(start_webcam()));
    La fonction "start_webcam" est la suivante où j'utilise un QTimer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void ImageViewer::start_webcam()
    {
      webcam_on = 1;
      invertWebcam = 0;
      close_current();
      updateStatusWebcam(webcam_on);
      // Init capture
      capture = cvCaptureFromCAM(0);
      first_image = cvQueryFrame(capture);
      // Init current qimage
      current_qimage = QImage(QSize(first_image->width,first_image->height),QImage::Format_RGB32);
      resize(first_image->width,first_image->height);
      // start QTimer
      timer = new QTimer(this);
      connect(timer,SIGNAL(timeout()),this,SLOT(query_frame()));
      timer->start(0);  
    }
    avec la fonction query_frame() ou j'utilise la fonction repaint() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    void ImageViewer::query_frame()
    {
      webcam_off = 0;
      IplImage* frame = cvQueryFrame(capture);
      int w = frame->width;
      int h = frame->height;
     
      if (matrixMode)
      {
        current_image = cvCreateImage(cvGetSize(frame),8,3);
        cvCvtColor(frame,current_image,CV_BGR2RGB);
        int cvIndex = 0;
        int cvLineStart = 0;
        unsigned char red,green,blue;
     
        for(int j = 0; j < h; j++)
        {
          cvIndex = cvLineStart;
          for(int i = 0; i < w; i++)
          {
            red = 0;
            green = current_image->imageData[cvIndex+1];
            blue = 0;
     
            current_qimage.setPixel(i,j,qRgb(red, green, blue));
            cvIndex += 3;
          }
          cvLineStart += current_image->widthStep;
        }
      }
     gaussianfilter(webcam_off);
      border_detect(webcam_off);
      if (invertWebcam)
        invertvalues(webcam_off);
      cvReleaseImage(&current_image);
      repaint();
    }
    La fonction repaint() appelle instantanément (du moins je pense) la fonction paintEvent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void ImageViewer::paintEvent(QPaintEvent*)
    {
     
    QPainter painter(this);
    painter.drawImage(QRect(0,0,current_qimage.width(),current_qimage.height()),current_qimage);
    }
    A l'exécution, le fait que si je maximise la fenêtre de l'interface, la vidéo s'affiche correctement, me fait penser à un conflit de synchronisation entre la méthode paintEvent et la méthode repaint() que j'utilise dans la méthode query_frame ci-dessus.

    Voici un exemple de ce cas là où la vidéo s'affiche correctement :



    Quelqu'un pourrait-il me confirmer si le problème vient de ce conflit ?

    et surtout que puis-je essayer pour le résoudre

    Merci par avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 60
    Points : 36
    Points
    36
    Par défaut
    J'ai trouvé la solution : utiliser la fonction update() à la place de repaint().

    Quelqu'un pourrait m'expliquer la différence entre les deux ?

    D'après ce que j'ai compris, repaint() n'appelle pas immédiatement paintEvent(), ce qui crée un conflit avec mon QTimer() qui appelle la méthode query_frame() ?

    Merci par avance pour vos explications

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 60
    Points : 36
    Points
    36
    Par défaut
    finalement, même avec la fonction update() , le bug continue d'apparaître de manière aléatoire

Discussions similaires

  1. affichage dans une interface des valeurs renvoyées par le port rs232
    Par EmilieGh dans le forum Bibliothèques, systèmes et outils
    Réponses: 5
    Dernier message: 20/05/2011, 17h51
  2. [Autres] Intégration de fenêtre OpenCV dans une interface Qt
    Par Gulish dans le forum Bibliothèques
    Réponses: 12
    Dernier message: 20/05/2010, 11h44
  3. lire une vidéo dans une interface
    Par alexismarque dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 14/07/2009, 17h51
  4. Afficher une vidéo dans une interface graphique
    Par Arwendil dans le forum Interfaces Graphiques
    Réponses: 28
    Dernier message: 15/05/2008, 11h38
  5. lire une vidéo dans une interface Perl/Tk
    Par François31 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 25/08/2006, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo