Problème de lecture de fichiers AVI : cvQueryFrame plante au bout d'un certain nombre de trames
Bonjour à tous :salut:,
j'ai un Pb que je n'arrive pas à résoudre depuis plusieurs jours.
J'ai cherché sur le net mais en vain... :cry:
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. 8-)
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(¤tFrame);
// wait for key
key = cvWaitKey(10);
//e. increment frame index
frameIndex++ ;
}
********************************
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.