Tu ne peux pas faire variable = cvCopy(src,dst) car cvCopy ne retourne rien. La fonction cvCopy se suffit à elle-même car elle copie src dans dst.
Prend exemple sur mon code où la destination a un seul canal, il est fonctionnel.
Edit : Passe par une image temporaire pour la copie i.e. copie du plan rouge d'une image RVB dans une image avec un canal puis recopie de l'image à un canal vers le plan rouge de ta destination (cf. le code ci-dessous)
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
33
34
35
36
37
38
39
40
41 #include <iostream> #include "highgui.h" #include "cv.h" void main() { IplImage* src; IplImage* dst1, *dst2; src=cvLoadImage("c://temp/test.bmp",1); //destination à un canal (dst1) cvSetImageCOI(src,3); //se fixe sur le canal rouge dst1 = cvCreateImage(cvGetSize(src),8,1); // création de la destination (1 canal) dst2 = cvCreateImage(cvGetSize(src),8,3); // création de la destination (3 canaux) cvSet(dst1,cvScalar(0,0,0)); //remplissage de l'image dst1 à noir cvSet(dst2,cvScalar(0,0,0)); //remplissage de l'image dst2 à noir cvCopy(src,dst1); //copie du plan rouge de src vers dst1 cvSetImageCOI(dst2,3); //se fixe sur le canal rouge cvCopy(dst1,dst2); //copie de l'image dst1 (copie du plan rouge de src) vers le plan rouge de dst2 cvSetImageCOI(src,0); //on considère de nouveau tous les plans de src cvSetImageCOI(dst2,0); cvNamedWindow("source",1);// affichage cvShowImage("source",src); cvNamedWindow("destination1",1); cvShowImage("destination1",dst1); cvNamedWindow("destination2",1); cvShowImage("destination2",dst2); cvWaitKey(); cvDestroyWindow("source"); cvDestroyWindow("destination1"); cvDestroyWindow("destination2"); cvReleaseImage(&src); cvReleaseImage(&dst1); cvReleaseImage(&dst2);
A+
Hunta
newbie un jour, newbie toujours
n'oubliez pas le
je vous remercie pour votre aide encore
mais je suis persuader qu'il ne faut pas autant se prendre la tete car
c'est ma premeire année de programmation. Notre evaluation ne demande pas des codes si chargés. Je pense etre pas loin de la verité
j'ai fait quelque chose en 1 seule ligne
résultat j'ai inverser les couleurs
je pense que sa doit etre presque sa.
Il ne me fodra pas quelque chose de tro long je dois l'apprendre par coeur et j'en ai 2 autres a apprendre aussi
se sera un tirage au sort!
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
33 #include "highgui.h" #include "cv.h" main() { IplImage* src; IplImage* src3; char * data; int i; src=cvLoadImage("C:/Documents and Settings/Admin/Bureau/imag1.jpg",1); src3=cvLoadImage("C:/Documents and Settings/Admin/Bureau/imag1.jpg",1); cvNamedWindow("fenetre",1); cvNamedWindow("fenetre3",1); cvSetImageCOI(src,3); src3 = cvCloneImage(src); for (i=0;i<src3->imageSize;i++) { src3->imageData[i]=abs(src->imageData[i+3]); } cvShowImage("fenetre", src); cvShowImage("fenetre3",src3); cvWaitKey(0); }
enfait j'ai une autre idée
y a t'il une fonction qui extrait ce que l'on veut de l'image
par exemple
je veux extraire les pixels rouge
j'ai entendu parler de buffer
Salut,
Tu as l'air décidé pour accéder aux données en direct. Dans ce cas, tu peux utiliser le code ci-dessous (c'est peut-être pas le plus élégant mais je t'ai fait ça vite):
Le code fonctionne mais il y a nettement plus de risque niveau décalage à faire comme ça qu'en utilisant cvGet2D et CvSet2D.
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
33 #include "highgui.h" #include "cv.h" void main() { IplImage* src; IplImage* dst; src=cvLoadImage("c://temp/test.bmp",1); dst = cvCreateImage(cvGetSize(src),8,3); // création de la destination (3 canaux) cvSet(dst,cvScalar(0,0,0)); //remplissage de l'image dst à noir //copie du plan rouge par accès direct aux données CvSize taille=cvGetSize(src); for (int i=0; i<taille.height; i++) { for (int j=0; j<taille.width; j++) { ((uchar *)(dst->imageData + i*dst->widthStep))[j*dst->nChannels + 2]=((uchar *)(src->imageData + i*src->widthStep))[j*src->nChannels + 2]; } } cvNamedWindow("source",1);// affichage cvShowImage("source",src); cvNamedWindow("destination",1); cvShowImage("destination",dst); cvWaitKey(); cvReleaseImage(&src); cvReleaseImage(&dst);
Edit : Pour ta question d'extraire les pixels rouges, je suis pas sûr de bien comprendre ce que tu as en tête mais c'était l'idée en utilisant cvSetImageCOI+cvCopy. On considère le plan rouge puis on le copie.
A+
Hunta
newbie un jour, newbie toujours
n'oubliez pas le
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager