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 :

Compréhension de cvReleaseImage


Sujet :

OpenCV

  1. #1
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut Compréhension de cvReleaseImage
    Bonjour,
    Je découvre OpenCV, et redécouvre par la même occasion C++ et Visual studio.
    Je cherche à convertir une vidéo en plusieurs fichier d'images.

    Et j'ai un souci sur le cvReleaseImage, celui-ci me lance une exception.

    Voici mon code

    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
    39
    40
    41
     
    int main(int argc,char** argv)
    {
       fprintf(stderr,"Start grabbing video\n");
        int index  = 1;
        char MonChemin[50];
        CvCapture *capture = 0; 
        cv::Mat img;
        IplImage *image = new IplImage(img);
     
       capture = cvCaptureFromAVI("----");
       if(!cvGrabFrame(capture))
       {
               fprintf(stderr,"Could not grab a frame\n\7");
               return -2;
       }
     
        while(cvGrabFrame(capture))
        {
    		image = cvRetrieveFrame(capture);
    		if(!image) break;
    		std::sprintf(MonChemin,"-----",index);
    		index+=1;
    		if (!cvSaveImage(MonChemin,image))
    		{
    			fprintf(stderr,"Don't save : %s\n",MonChemin);
    		}else 
    		{
    			fprintf(stderr,"Save in : %s\n",MonChemin);
    		}
     
    	}	
    	fprintf(stderr,"End grabbing n\n");
     
     
    	*MonChemin = 0;	
    	cvReleaseCapture(&capture);
    	cvReleaseImage(&image);
    	img.release();
    	return 0;
    }
    Mon appli plante sur cvReleaseImage(&image);
    Quelqu'un peut m'expliquer pourquoi ce plantage et comment le résoudre?
    Est ce que j'utilise correctement l'instance cv::Mat Img ?

    Merci de votre aide.
    Cordialement,
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  2. #2
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    En lisant la doc de OpenCV RetrieveFrame, m'indique que je dois supprimer le cvReleaseImage car je ne dois pas travailler sur l'image de CvRetrieveFrame.

    Est ce que j'ai bien compris le principe?
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Ton problème c'est que tu mélanges C et C++. Débarrasse-toi des fonctions qui commencent par "cv" et remplace les par celles qui commencent par "cv::". Non seulement l'interface C++ est plus clair, mais en plus elle s'occupe de la mémoire pour toi.
    Et même si c'est moins important, fprintf devrait être replacé par des std::cout ou std::cerr histoire d’être plus coherent.

  4. #4
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    Bonjour,

    Merci de ton aide. J'ai suivi ton conseil :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include "stdafx.h"
    #include <iostream>
    #include <Windows.h>
    #include <opencv2\highgui\highgui.hpp>
    #include <opencv2\core\core.hpp>
    #include "opencv2/opencv.hpp"
    #include <string.h>
     
    using namespace std;
    using namespace cv;
     
     
    int main(int argc, char** argv)
    {
    	[...]
    	VideoCapture *capture = 0; 
    	//Image to save
    	Mat image;
    	[...]
    	//Define a capture video    
    	capture = new VideoCapture(filename);
     
    	//Check opening
    	if(!capture->isOpened())
    	{
               //Could not open video
    		return -2;
    	}
    	//Launch a grabbing
    	while(!capture->grab())
        {
     
    			capture->retrieve(image,0);
    			if(!&image) break; //End if image = null 
    			sprintf_s(MonChemin,"%s\\Img_%03d.png",output,index); //Define  image filename
    			index+=1;
    			if (!cv::imwrite(MonChemin,image))
    			{
    				//Could not save a frame
    				return -1;
    			}
    			image.empty(); //Sanety check
    		} 	
    	}	
        //Clean data
    	[...]
    	capture->release();
    	return index;
    }
    Mon souci est que le "capture->isOpened() me renvoie toujours faux, alors que ma vidéo est présente ( test avec plusieurs vidéos). Tout cela fonctionne correctement avec le code en c.

    Est ce que j'ai oublié quelque chose qui bloque l'ouverture de la vidéo?
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Je me souviens avoir eu un problème de ce genre avec les dernières version d'OpenCV: il y a une dll du style ffmpeg.dll qui est nécessaire pour ouvrir les vidéos, mais OpenCV ne se plaint pas si elle n'est pas présente a coté de l’exécutable (alors que les autres, ça fait un message d'erreur direct), et le résultat est que les vidéos ne se chargent pas, même si tout a l'air de fonctionner.
    Sinon, pas besoin d'avoir cv::VideoCapture en pointeur, ca passe tres bien en variable 'normale' et ça permet de ne pas faire les grab/retrieve, et de tout simplement faire videoCapture >> image; dans une boucle.
    Et enfin, pour vérifier si la vidéo est terminée, il ne faut pas vérifier l'adresse de l'image, mais juste vérifier le image.isEmpty().

  6. #6
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    J'ai fais le test en copiant ffmpeg243.dll seul puis avec les librairies de ffmpeg (avcodec-54.dll, avdevice-54.dll,....)
    Je ne peux pas ouvrir les fichiers vidéos.
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

Discussions similaires

  1. Compréhension de fseek
    Par Argonz dans le forum C
    Réponses: 9
    Dernier message: 12/01/2004, 15h01
  2. compréhension du profil d'une fonction
    Par lor dans le forum MFC
    Réponses: 7
    Dernier message: 08/01/2004, 12h59
  3. [FLASH MX] Prob de compréhension des bouttons
    Par WriteLN dans le forum Flash
    Réponses: 13
    Dernier message: 16/10/2003, 17h01
  4. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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