Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > OpenCV
OpenCV Vos questions sur l'API de traitement d'images OpenCV.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/11/2012, 21h05   #1
Masmeta
Membre habitué
 
Avatar de Masmeta
 
Homme
Ing. R&D informatique industrielle
Inscription : mai 2006
Messages : 358
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 : 358
Points : 129
Points : 129
Envoyer un message via MSN à Masmeta
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 :
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
Masmeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 09h02   #2
Masmeta
Membre habitué
 
Avatar de Masmeta
 
Homme
Ing. R&D informatique industrielle
Inscription : mai 2006
Messages : 358
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 : 358
Points : 129
Points : 129
Envoyer un message via MSN à Masmeta
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
Masmeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 11h53   #3
math_lab
Membre chevronné
 
Homme
Chercheur en informatique
Inscription : avril 2008
Messages : 328
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Chercheur en informatique

Informations forums :
Inscription : avril 2008
Messages : 328
Points : 620
Points : 620
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.
math_lab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 14h19   #4
Masmeta
Membre habitué
 
Avatar de Masmeta
 
Homme
Ing. R&D informatique industrielle
Inscription : mai 2006
Messages : 358
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 : 358
Points : 129
Points : 129
Envoyer un message via MSN à Masmeta
Bonjour,

Merci de ton aide. J'ai suivi ton conseil :
Code :
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
Masmeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2012, 16h14   #5
math_lab
Membre chevronné
 
Homme
Chercheur en informatique
Inscription : avril 2008
Messages : 328
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Chercheur en informatique

Informations forums :
Inscription : avril 2008
Messages : 328
Points : 620
Points : 620
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().
math_lab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2012, 14h29   #6
Masmeta
Membre habitué
 
Avatar de Masmeta
 
Homme
Ing. R&D informatique industrielle
Inscription : mai 2006
Messages : 358
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 : 358
Points : 129
Points : 129
Envoyer un message via MSN à Masmeta
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
Masmeta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h56.


 
 
 
 
Partenaires

Hébergement Web