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

OpenCV Discussion :

Problème de lecture de fichiers AVI : cvQueryFrame plante au bout d'un certain nombre de trames


Sujet :

OpenCV

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Problème de lecture de fichiers AVI : cvQueryFrame plante au bout d'un certain nombre de trames
    Bonjour à tous ,

    j'ai un Pb que je n'arrive pas à résoudre depuis plusieurs jours.
    J'ai cherché sur le net mais en vain...

    je m'explique :

    je souhaite lire une séquence vidéo complète et afficher les frames courants en utilisant les fonction : cvQueryFrame et cvCloneImage

    currentFrame = cvCloneImage (cvQueryFrame(videoCapture));

    bien sur le pointeur : "videoCapture" est créé comme suit :

    videoCapture = cvCaptureFromFile ("maVideo.avi") ;

    la boucle de lecture tourne bien jusqu'à ce que j'atteigne un certain nombre de frame (1700 ou plus) le programme plante et m'affiche une fenetre avec le message d'erreur : "Bad argument" "bad image header" in function cvCloneImage.

    Je ne sais absolument pas d'où peut venir cette erreur.
    Ce que j'ai constaté c'est que cvQueryFrame renvoit un pointeur NULL lorsque la boucle atteint le nombre de frame en question (1700).


    Je me demande si celà ne vient pas du format AVI de mon fichier en entrée ?
    en effet, j'utilise l'outil "virtualDub" pour créer un AVI qui soit, à mon avis compatible OpenCV à partir d'un autre AVI que je n'arrive meme pas à lire avec openCV. Ce que je fais avec virtualDub c'est ajouter un filtre de désentrelacement et je modifie la profondeur couleur pour obtenir des couleur 8bits pour chaque canal après ça je demande à virtual dub de sauvegarder sous format AVI.



    merci par avance pour votre aide.


    looneace.

  2. #2
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Bonjour,
    Sans le code impossible de voir l'erreur ;
    A bientôt

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut réponse... voici mon code
    Désolé,

    voici un résumé du code.
    comme vous le voyez, ça n'a rien d'exceptionnel.
    Je soupçonne les codec et virtualdub ???

    merci encore !

    Loo.


    *************************************
    IplImage* currentFrame ;
    CvCapture* videoCapture ;
    int N ;
    int frameIndex = 0 ;
    int key = -1 ;

    videoCapture = cvCaptureFromFile ("monFichierAvi.avi") ;

    N = (int) cvGetCaptureProperty (videoCapture, CV_CAP_PROP_FRAME_COUNT);

    cvSetCaptureProperty(videoCapture, CV_CAP_PROP_POS_FRAMES, 0);

    while ((key != 'q') && (frameIndex<N))
    {
    //cvSetCaptureProperty(videoCapture,CV_CAP_PROP_POS_FRAMES, frameIndex);// cette ligne ne change rien car le pointeur videoCapture s'incrémente automatiquement à chaque itération

    currentFrame = cvCloneImage(cvQueryFrame(videoCapture));

    cout << " frame number : " << frameIndex << endl ;

    //release memory
    cvReleaseImage(&currentFrame);

    // wait for key
    key = cvWaitKey(10);

    //e. increment frame index
    frameIndex++ ;
    }
    ********************************

  4. #4
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Comme ça a vue de nez je dirait de faire le release après le while afin d'éviter une erreur d'adressage.
    Sinon utiliser cvGrabFrame sans release également.

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut et la mémoire ???
    Bonjour Vinsss84,

    je te remercie pour ta réponse.

    tu propose de n'appeler le release qu'une fois à l'extérieur du while... mais, je ne peux le faire car si je ne le fait pas je ne libère pas la mémoire qui grossie à chaque itération... ???

    ceci dit, je viens tout juste de relire le manuel openCV et j'ai vu ça :

    cvQueryFrame
    Grabs and returns a frame from camera or file

    The function cvQueryFrame grabs a frame from camera or video file, decompresses and returns it. This function is just a combination of cvGrabFrame and cvRetrieveFrame in one call. The returned image should not be released or modified by user. .


    merci pour ton aide !

    je vais tester ça.

    je te dirai ce que ça donne.


    Loo.

  6. #6
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Hum mes souvenirs sont un peu lointains mais il me semblait que la mémoire utilisée augmentait en flèche uniquement si l'IplImage etait déclarée dans le while, je devait me tromper
    Essaye avec le Grab qui est fait pour ton utilisation
    Bonne chance,

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut pb avi tjrs pas résolu
    Bonjour vins,


    j'ai tout essayé (cvGrab+cvRetrieve; cvQuery), et aussi, j'ai essayé cvCaptureFromFile au lieu de cvCreateFileCapture... mais tjrs la même chose !
    dès que j'arrive au frame N°: 1711 de mon fichier vidéo ça plante !!!!!!!

    je me demande si ce n'ai pas du à la vidéo elle meme !?
    peut etre que OpenCV n'aime pas les vidéo longues ???
    j'ai lu quelque part sur un site web que pour les gros AVI l'entête des images peut changer à partir d'un certain nombre de frame! ? est ce vrai ?
    c'est peut etre ça la cause de mon pb !?

    par ailleurs, j'aimerais rappeler l'info suivante, à savoir que j'utilise un AVI obtenu avec virtualDub.

    je m'explique : l'AVI d'origine provient d'une caméra d'acquisition qu'on utilise dans les labos... je n'ai pas cette caméra... j'ai seulement le fichier AVI.
    Il se trouve que lorsque j'ai essayé de lire ce fichier avec openCV, il y avait plantage, aucun frame n'a pu être lu.
    Alors, j'ai vite conclu que c'etait une histoire de compresseur ou de codec.
    J'ai donc utilisé virtualDub pour traiter l'AVI d'origine.

    j'ai choisi la profondeur couleur (888) pour le fichier et le "decompression format" j'ai mis autoscale. avec un filtre de desentrelacement.
    j'ai obtenu un AVI plus gros (en mémoire), logique, puisque j'ai décompressé ou alors augmenter la resolution couleur ???....

    maintenant, je suis coincé sur ça...

    merci par avance !

    loo.

  8. #8
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut du nouveau...
    après plusieurs recherches sur internet... pas grand chose de trouvé à propos de ce problème, pour ne pas dire RIEN.

    Je suis alors repassé par la case virtualDub pour essayer tous les codecs...
    je me suis rendu compte que certains codecs fonctionnaient et que mon prog tournait (enfin la lecture de l'AVI continuait au delà du seuil fatidique : 1711 frames)...

    conclusion 1 : quand j'utilise un compresseur (pour recompresser la video d'origine avec un codec compatible openCV), ma video compressée a l'air de fonctionner.

    j'ai été sur le site : http://opencv.willowgarage.com/wiki/VideoCodecs... j'ai ensuite téléchargé un soft : Gspot qui permet de donner plus de détails sur les vidéos. et bien, le soft m'a informé que mon avi à problème etait un avi "multipart openDML" en 3 parties et bien sur la première partie s'arrete au frame 1711 !!!

    conclusion2 : si je veux décompresser ma video d'origine pour travailler avec une video décompréssée, et bien : VirtualDub me génère une "multipart openDML" en plusieurs parties fusionnées en un seul fichier AVI.


    remarque : après le frame n° 1711, la fonction de lecture d'openCV renvoit un pointeur NULL quelque soit la position du frame >1711 (j'ai essayer de sauter des frames et ça ne marche pas).

    Gros problème !!! ... car pour mes traitement j'ai besoin d'images décompréssées.


    La QUESTION est :
    -> qui a déja eu ce genre de pb avec des AVI décompréssées ? comment gérer ce problème ?

    -> y t il un outil, autre que virtualDub, qui gère mieux les AVI ? et les vidéo décompréssées ?


    Merci !

  9. #9
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut source du problème connue
    Bonjour,

    j'ai trouvé pourquoi j'ai eu ce problème.
    parceque lorsqu'on décompresse des AVI de plus de 2 GO (ou peut etre 1Go) pour obtenir un fichier décompréssé en DIB (device independent bitmap, pas de codecs utilisés) virtualDub produit un fichier avi de type : OpenDML multipart AVI.

    comme son nom l'indique, c'est un avi mais multipart.
    ce qu'il faut retenir c'est que le fichier résultant de cette décompression consiste en 2 ou 3 (voire plus) parties avi fusionnés.

    la première partie est lue sans pb avec les outils openCV tel cvQueryFrame etc... et on obtient des images stockées dans des IplImages* le plus normalement du monde.

    mais dès que la lecture arrive à la 2eme partie (du fichier openDML multipart avi) openCV beugue.

    ceci est du à l'en-tête de l'image lue. En effet, pour la première partie, l'entete est normal (celle d'un bitmap) mais à partir de la 2eme partie de l'avi l'entete n'est plus comprise par openCV et ça plante.

    Solution (provisoire) : décompresser le fichier par parties tel que la vidéo décompréssée soit de taille inférieur à 2 GO (ou 1GO, j'ai oublié combien).

    Solution souhaité : trouver un outil pour décompresser des avi et obtenir un AVI en une seule partie et non pas en openDML multipart avi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POI] Problème de lecture des fichiers Word
    Par Dari dans le forum Documents
    Réponses: 9
    Dernier message: 05/07/2007, 14h08
  2. Problème de lecture sur fichier ini.
    Par braoru dans le forum Delphi
    Réponses: 2
    Dernier message: 28/07/2006, 15h34
  3. [DOM4J] Problème de lecture de fichier xml avec dom4j
    Par santana2006 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 05/04/2006, 16h52
  4. Problème de lecture de fichier Excel
    Par cocaetjusdorange dans le forum Langage
    Réponses: 4
    Dernier message: 08/02/2006, 11h08
  5. Problème de lecture de fichier Oracle 9.2
    Par fortlow dans le forum Oracle
    Réponses: 4
    Dernier message: 14/11/2005, 16h48

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