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. #1
    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 Image rouge et en relief
    Bonjour,
    voila j'ai 2 questions


    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




    après je voudrais afficher une image en relief

  2. #2
    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
    merci à vous

  3. #3
    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,

    Le plus simple si tu es débutant est peut-être d'utiliser les fonctions cvGet2D et cvSet2D pour accéder aux différents pixels de ton image. Après tu peux accéder assez facilement à chaque composante (cvScalar).
    Je te conseille d'aller faire un tour là :
    http://www.cs.iit.edu/~agam/cs512/le...ncv-intro.html

    A+

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

  4. #4
    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
    Il te suffit de te placer sur le bon channel (rouge) de ton image avec cvSetImageCOI. Tu pourras en suite copier l'ensemble du canal rouuge dans ton autre image.
    =>
    OpenCv Addict

  5. #5
    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
    merci bcp pour vos réponses. J'ai deja commencer mon code mais pour acceder au pixel
    je fais comment?

    idée repris du lien:
    j'ai changer K++ par K+3 car je ne veux que la couleur rouge
    est ce que c'est bien?

    for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k=k+3)
    data[i*step+j*channels+k]=255-data[i*step+j*channels+k];

  6. #6
    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
    bon aller je me lance
    je met mon code que j'ai fait

    #include "highgui.h"
    #include "cv.h"

    main()
    {
    IplImage* src;
    IplImage* src2;
    IplImage* src3;

    src=cvLoadImage("adresse image1.jpg",1);
    src2=cvLoadImage("adresse image2.jpg",1);

    cvNamedWindow("fenetre",1);
    cvNamedWindow("fenetre2",1);

    cvShowImage("fenetre", src);
    cvShowImage("fenetre2", src2);

    jusque la mon programme affiche bien les 2 images dans les 2 fenetres

    mais alors comment y ajouter une boucle qui ne copie que le rouge de l'image 1


    je crée une autre fenetre ac dedans un src3
    mais la formule je ne vois vraiment pas pour le rouge

  7. #7
    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
    Essaye qqc comme ça

    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
    #include "highgui.h"
    #include "cv.h"
     
    main()
    {
    IplImage* src;
    IplImage* src2;
    IplImage* src3;
     
    src=cvLoadImage("adresse image1.jpg",1);
    src2=cvLoadImage("adresse image2.jpg",1);
     
    cvNamedWindow("fenetre",1);
    cvNamedWindow("fenetre2",1);
     
    cvShowImage("fenetre", src);
    cvShowImage("fenetre2", src2);
     
      cvSetImageCOI(src,3);
    src
    src3 = cvCreateImage(cvGetSize(src),8,3);
    cvSet(src3,cvScalar(255,255,255));
    cvSetImageCOI(src3,3);
    cvCopy(src,src3);
    \\Reset Image COI
    cvSetImageCOI(src,0);
    cvSetImageCOI(src3,0);
    cvNamedWindow("fenetre3",1);
    cvShowImage("fenetre3",src3);
    =>
    OpenCv Addict

  8. #8
    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,

    La solution de Vinsss84 est bien plus simple. J'avais oublié qu'il existait ces petites fonctions toutes faites

    Sinon, pour les accès aux pixels, c'est du genre (sous reserve, j'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
     
    cvSize taille=cvGetSize(src);
     
    IplImage* dst=cvCreateImage(taille,IPL_DEPTH_8U,1);
     
    for (int i=0; i<taille.height; i++)
    {
       for (int j=0; j<taille.width; j++)
       {
          CvScalar pixVal=cvGet2D(src,i,j);
          cvSet2D(dst,i,j,pixVal[2]);
       }
    }
    A+,

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

  9. #9
    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
    merci bcp
    mais je n'ai rien compris
    il affiche une erreur au niveau de
    cvSet(src3,cvScalar(255,255,255));

    pourrais tu m'expliquer ce que fait le programme enfait

  10. #10
    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,

    La fonction cvSet2D(dst,i,j,Val) met la valeur Val à la position (i, j) dans l'image dst. Je te conseille quand même le code de Vinsss84 qui est plus simple et plus efficace pour récupérer un canal.

    A+

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

  11. #11
    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
    mais y a quand meme un truc bizard dans le code de vinsss84

    cvSetImageCOI(src,3);
    src
    src3 = cvCreateImage(cvGetSize(src),8,3);
    le compilateur ne reconnait pas
    src
    "syntaxe error before src3"

  12. #12
    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
    cvSet(src3,cvScalar(255,255,255));
    pb aussi

    " too few arguments to function `cvScalar' "

  13. #13
    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 me rappelle aussi que mon prof ma dit de faire un tableau pour trouver la solution

  14. #14
    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,

    Pour la fonction dans mon exemple, c'est cvSet2D (n'oublie pas le 2D à la fin sinon ce n'est pas la même chose). Après, il faut indiquer la position (i,j) du pixel dont tu veux modifier la valeur entre l'image que tu modifies (src3) et la valeur du pixel que tu mets (pixVal dans mon exemple).
    Pour le code de Vinss, essaie de remplacer cvScalar(255,255,255) par CV_RGB(255,255,255). Pour le cvSet qu'il utilise, je ne sais pas exactement ce que ça doit faire, initialiser tous les pixels à blanc ? (je suis pas un super pro en opencv ). Je regarde ça.

    Edit : le cvSet sert bien à initialiser toute l'image à (255,255,255) et fonctionne aussi bien avec cvScalar(255,255,255) que CV_RGB(255,255,255) (il me semble que la différence se situe dans l'ordre des canaux BVR et RVB).
    Sinon, cvCopy ne veut pas prendre mes deux images à trois cannaux même avec le cvSetImageCoi donc je te conseille de déclarer ton image de destination avec un canal (src3=cvCreateImage(cvGetSize(src),8,1) et d'enlever le cvSetImageCoi(src3,3); pour l'instant. Peut-être que Vinsss aura une idée.

    A+,

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

  15. #15
    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
    Hello, j'avais pas eu le temps de commenter le code proprememnt, et tout ça c'est de tête donc tu te retrouve forcément avec des petites erreurs de compilation. Mais hunta a bien decortiqué mon code

    Pour l'ordre des canaux, c'est bien BGR et non RGB dans une IplImage *
    Maintenant que je me rappelle, le cvScalar prend un 4eme argument, a mettre a 1 je crois, à voir dans LA DOCUMENTATION Open Cv
    CV_RGB est une constante prédefinie pour l'image blanche qui marche donc très bien.

    Pour cvCopy c'est une fonction qui normalement prend très bien les COI, c'est d'ailleurs une des seules d'opencv, le cvcopy devrait marché du moment qu'un COI est set sur l'image d'origine et l'image finale. Après peut etre que mes souvenirs me font defaut
    =>
    OpenCv Addict

  16. #16
    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,

    Pour ce qui est du cvCopy, je l'ai déjà utilisé avec des cvSetImageRoi sur deux images (source et destination) et le tout fonctionnait très bien. Je pense qu'avec cvSetImageCOI, ça devrait fonctionner de la même manière mais je n'ai pas vu le souci dans le code... Donc bon pour l'instant ça fonctionne avec une destination avec un canal, il suffirait de refaire une copie dans une image à trois canaux ensuite mais c'est quand même bizarre...

    Bref, il reste à attendre des nouvelles de debutinfo.

    A+

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

  17. #17
    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
    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
    void Tools::Add_Calque(IplImage *src, IplImage *calque, IplImage *result)
    {
        if (result->nChannels != 3)
        {
            printf("result must be 3 channels, 8depth IplImage");
            exit(0);
        }
        //Copy src (1-channel w/b image) to result (3-channels color image (BGR))
        cvSetImageCOI(result,1);
     
        cvResize(calque,result,1);
     
        //cvCopy(src,result);
        cvSetImageCOI(result,2);
        cvCopy(src,result);
        cvSetImageCOI(result,3);
        cvCopy(src,result);
     
        cvSetImageCOI(result,0);
    }
    J'avais ecrit ce code qui marchait très bien
    MAis en effet calque et src sont 1 channel ;
    étrange que cvCopy ne marche qu'avec une seul image avec le COI activé mais ça doit bel et bien être le cas
    =>
    OpenCv Addict

  18. #18
    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
    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
    newbie un jour, newbie toujours
    n'oubliez pas le

  19. #19
    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
    j'essaye tant bien que mal mais je ne trouve toujours pas
    pourtant le prof m'a dit qu'il ne fallait pas en mettre des lignes et des lignes pour faire ca
    mais je ne trouve toujours pas
    en compilant on dit qu'il y a trop peu d'argument pour cvCopy

    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 "highgui.h"
    #include "cv.h"
     
    main()
    {
    	IplImage* src;
    	IplImage* src2;
    	IplImage* src3;
     
        int i, taille;
     
     
    	src=cvLoadImage("C:/Documents and Settings/Admin/Bureau/imag1.jpg",1);
        src2=cvLoadImage("C:/Documents and Settings/Admin/Bureau/imag21.jpg",1);
        src3=cvLoadImage("C:/Documents and Settings/Admin/Bureau/imag1.jpg",1);
     
        cvNamedWindow("fenetre",1);
    	cvNamedWindow("fenetre2",1);
    	cvNamedWindow("fenetre3",1);
     
    	cvShowImage("fenetre",	src);
    	cvShowImage("fenetre2",	src2);
    	for(i=3;i<src->imageSize;i+3)
        cvSetImageCOI(src,3);/* se fixe sur le canal rouge*/
        src3->imageData[i]= cvCopy(src,src3);
    }
     
     
    cvShowImage("fenetre3",src3);
     
    	cvWaitKey(0);
    }

  20. #20
    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 dois trouver la solution ce soir car je passe en epreuve demain et si je tombe decu vu le mal que je mets pour comprendre j'aimerai y arriver
    en + fo que j'apprenne par coeur car on a pas le droit aux docs
    merci à vous en tout cas
    je reviendrai ce soir voir si on peux s'en sortir

Discussions similaires

  1. Webcam m'affiche image rouge
    Par java2dev dans le forum Périphériques
    Réponses: 3
    Dernier message: 04/05/2011, 21h49
  2. Eviter la croix rouge sur une image absente
    Par zooffy dans le forum ASP.NET
    Réponses: 4
    Dernier message: 17/11/2008, 15h55
  3. Binariser une image RVB sur la couleur rouge
    Par deathsceythe dans le forum OpenCV
    Réponses: 0
    Dernier message: 25/09/2008, 21h53
  4. Réponses: 3
    Dernier message: 16/01/2008, 07h12
  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, 18h40

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