IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Image rouge et en relief


Sujet :

OpenCV

  1. #21
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par hunta_kirua Voir le message
    Voilà le code que j'ai écrit à partir du premier code que tu avais proposé :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #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)
    cvSet(dst1,cvScalar(0,0,0)); //remplissage de l'image dst1 à noir
    cvCopy(src,dst1); //copie du plan rouge de src vers dst1
    cvSetImageCOI(src,0); //on considère de nouveau tous les plans de src
    cvNamedWindow("source",1);// affichage
    cvShowImage("source",src);
    cvNamedWindow("destination1",1);
    cvShowImage("destination1",dst1);
    cvWaitKey();
     
    cvDestroyWindow("source");
    cvDestroyWindow("destination1");
     
     
    //destination à trois canaux (dst2)
    cvSetImageCOI(src,3); //se fixe sur le canal rouge
    dst2 = cvCreateImage(cvGetSize(src),8,3); // création de la destination (3 canaux)
    cvSet(dst2,cvScalar(0,0,0)); //remplissage de l'image dst2 à noir
    cvSetImageCOI(dst2,3); //se fixe sur le canal rouge
    std::cout<<"canal sélectionné : "<<cvGetImageCOI(dst2)<<std::endl;
    //cvCopy(src,dst2); //copie du plan rouge de src vers le plan rouge de dst2 (bad number of channels dans cvSplit)
    cvSetImageCOI(src,0); //on considère de nouveau tous les plans de src
    cvSetImageCOI(dst2,0); //on considère de nouveau tous les plans de dst2
    cvNamedWindow("source",1); // affichage
    cvShowImage("source",src);
    cvNamedWindow("destination2",1);
    cvShowImage("destination2",dst2);
    cvWaitKey();
     
    cvDestroyWindow("source");
    cvDestroyWindow("destination2");
     
    cvReleaseImage(&src);
    cvReleaseImage(&dst1);
    cvReleaseImage(&dst2);
    }
    Tout se passe bien pour la destination à un canal et erreur sur le cvCopy si la destination à 3 canaux (pb cvSplit => bad number of channels). Si tu vois l'erreur Vinsss...

    D'après le code que tu as fourni, on peut donc faire avec cvSetImageCOI + cvCopy :

    - source 1 canal vers destination 3 canaux (ton code)
    - source 3 canaux vers destination 1 canal (mon code)

    La question que je me pose est la suivante : est-il possible d'utiliser cvCopy quand il y a un COI sur la source ET la destination ?

    A+

    Hunta
    La réponse est donc non, ça ne fonctionne pas, il faut donc passer par une image intermédiaire....

    Si j'ai le temps cette après midi je vais essayer de rentrer dans le code de la fonction pour modifier ça, c'est moche de ne ps pouvoir le faire directement
    =>
    OpenCv Addict

  2. #22
    Membre régulier Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Points : 123
    Points
    123
    Par défaut
    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

  3. #23
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    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);
    }

  4. #24
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    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

  5. #25
    Membre régulier Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Points : 123
    Points
    123
    Par défaut
    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):

    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);
    Le code fonctionne mais il y a nettement plus de risque niveau décalage à faire comme ça qu'en utilisant cvGet2D et CvSet2D.

    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

  6. #26
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Citation Envoyé par debutinfo Voir le message
    Bonjour,
    je voudrais construire une image qui n'affiche que la couleur rouge de l'image précédente.
    J'ai lu et afficher une image
    je veux créer une autre image qui ne comporte que la couleur rouge de la précédente.
    je ne sais pas comment faire
    Il suffisait peut être simplement de faire un
    cvSplit (src, NULL, NULL, dest, NULL);

Discussions similaires

  1. Webcam m'affiche image rouge
    Par java2dev dans le forum Périphériques
    Réponses: 3
    Dernier message: 04/05/2011, 22h49
  2. Eviter la croix rouge sur une image absente
    Par zooffy dans le forum ASP.NET
    Réponses: 4
    Dernier message: 17/11/2008, 16h55
  3. Binariser une image RVB sur la couleur rouge
    Par deathsceythe dans le forum OpenCV
    Réponses: 0
    Dernier message: 25/09/2008, 22h53
  4. Réponses: 3
    Dernier message: 16/01/2008, 08h12
  5. [W3C] mettre une image en relief
    Par pit9.76 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 31/01/2006, 19h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo