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 : 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;
[...]
}
je paramètre effectivement cvCaptureFromAVI avec mSrcAdr.

Voici donc mon cpp:

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++;		
	}
}
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!