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 06/11/2012, 17h54   #1
Fanuilos
Invité régulier
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 6
Points : 6
Par défaut Accès aux éléments d'une IplImage définie en float

Bonjour,

Je suis entrain de programmer un filtre sous OpenCV. Pour cela, j'utilise la fonction suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
IplImage * filter(IplImage * a){
	int width = a->width;
	int height = a->height;
	IplImage * b = cvCreateImage(cvSize(height,width),IPL_DEPTH_32F,1);
	int astep = a->widthStep;
	int bstep = b->widthStep;
	int achannels = a->nChannels;
	int bchannels = b->nChannels;
	float * bdata = (float*) b->imageData;
	float * adata = (float*) a->imageData;
	for(int i=0;i<height;i++)for(int j=0;j<width;j++)
		bdata[i*bstep+j*bchannels] = adata[i*astep+j*achannels]*VAL;
	return b;
}
(Ne vous inquiétez pas pour VAL qui n'est pas défini, j'ai juste simplifié mon code pour en venir à l'essentiel, VAL est un float)

Mon problème est que je n'accède visiblement pas aux éléments correctement, car j'ai une erreur de segmentation au cours de la boucle appliquant le filtre. Mon image "a" est elle aussi définie en float (IPL_DEPTH_32F)

Pourriez-vous me dire ce que je ne fais pas correctement?

Merci d'avance
Fanuilos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2012, 00h13   #2
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 198
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 198
Points : 12 744
Points : 12 744
Bonsoir,

Une petite inversion : cvSize(height,width) cvSize(width,height).

Il faut faire attention ici que tu effectues le parcours avec des pointeurs de type float, le "step" retourné par widthStep doit donc être divisé par 4.
Tu peux aussi effectuer un parcours "classique" :
Code :
1
2
3
for(i=0;i<height;i++)
    for(j=0;j<width;j++)
        data[i*width+j]
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2012, 09h49   #3
Fanuilos
Invité régulier
 
Inscription : avril 2009
Messages : 11
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 11
Points : 6
Points : 6
Merci beaucoup, c'était bien cela, il fallait utiliser width ou widthStep/4 pour les floats!
Fanuilos est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h47.


 
 
 
 
Partenaires

Hébergement Web