Bonjour!
j'ai besoin de traiter les histogrammes de toutes les frames d'une vidéo dans l'espace HSV.
Pour cela, j'ai mon header:
je paramètre effectivement cvCaptureFromAVI avec mSrcAdr.
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 #ifndef DEF_PROCESSING #define DEF_PROCESSING #pragma comment(lib, "cv") #pragma comment(lib, "cvaux") #pragma comment(lib, "cxcore") #pragma comment(lib, "highgui") #include <highgui.h> #include <cv.h> #include <iostream> #include <string> #include <vector> class Processing { private: CvCapture* pVideo; // la vidéo originale CvSize mTaille; // résolution de la vidéo std::string mSrcAdr; // adresse source std::string mDestAdr; // adresse destination std::vector<IplImage*> pSrcImgVector; // vecteur des IplImage de toutes les frames d'une vidéo std::vector<IplImage*> pDestImgVector; // vecteur des IplImage qui composeront la nouvelle vidéo int mN_r = 5; [...] }
Voici donc mon cpp:
c'est à la ligne imBGR = cvRetrieveFrame(pVideo); que mon exécution plante.
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 #include "Processing.h" Processing::Processing(std::string srcAdr) : mSrcAdr(srcAdr) { pVideo = cvCaptureFromAVI( srcAdr.c_str() ); IplImage* pim = cvQueryFrame(pVideo); mTaille = cvGetSize(pim); std::vector<IplImage*> pSrcImgVector; std::vector<IplImage*> pDestImgVector; cvReleaseImage(&pim); } void Processing::Initialize() { IplImage* imBGR; IplImage* imHSV; double framerate = cvGetCaptureProperty(pVideo, CV_CAP_PROP_FPS); // acquisition du framerate int ratio = (int)(framerate / mN_r); // calcul du rapport afin d'avoir x fps int cpt = 0; while( cvGrabFrame(pVideo) ) { if (cpt % ratio == 0) { // je ne grab qu'un certain ratio de frames imBGR = cvRetrieveFrame(pVideo); // récupère en BGR imHSV = cvQueryFrame(pVideo); // pr tester les 2 fonctions cvCvtColor (imBGR, imHSV, CV_BGR2HSV); //convertit en HSV pSrcImgVector.push_back(imHSV); // met dans le vector cvReleaseData(imBGR); } cpt++; } }
Mon VS 2008 me dit : "bad argument (unrecognized or unsupported array type) in function cvReleaseData, .\cxarray.cpp(1171)"
retry et abort me mène alors vers dbgheap.c :/
J'ai lu différents topics qui disent qu'il faut initialiser les IplImage* imBGR et imHSV à NULL ou à un query quelconque de la vidéo mais ça ne change rien.
Le souci visiblement se situe dès que j'appelle les fonctions cvQueryFrame ou cvRetrieveFrame.
J'ai testé dans un autre petit main où j'ai déclaré mon pVideo et mes différents cvRetrieveFrame dans le même bloc et ça marche =___=;;;
Mais je ne veux pas opérer de cette façon!
je veux:
- déclarer mon pVideo dans mon constructeur
- empiler mes IplImage dans ma méthode Initialize()
Bref si une âme charitable veut bien s'attarder sur mon problème, je lui en serait reconnaissant!
Partager