Problème avec cvReleaseData
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:
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
|
#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;
[...]
} |
je paramètre effectivement cvCaptureFromAVI avec mSrcAdr.
Voici donc mon cpp:
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
|
#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++;
}
} |
c'est à la ligne imBGR = cvRetrieveFrame(pVideo); que mon exécution plante.
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!