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 :

Remplacer iplGetPixe par cvGet2D


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Par défaut Remplacer iplGetPixe par cvGet2D
    Bonjour,
    comment je peux remplacer les fonctions iplGetPixel et iplPutPixel par les fonctions cvGet2D/cvSet2D. dans ce code?

    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
    IplImage *src=cvLoadImage("PolyU_014_S_03.bmp");
    CvSize size_src=cvSize(src->width,src->height);
    IplImage *PlaneB=cvCreateImage(size_src,src->depth,1);
    IplImage *PlaneG=cvCreateImage(size_src,src->depth,1);
    IplImage *PlaneR=cvCreateImage(size_src,src->depth,1);
    cvCvtPixToPlane(src,PlaneB,PlaneG,PlaneR,0);
    IplImage *dst=cvCreateImage(size_src,IPL_DEPTH_8U,1);
    unsigned char pixel_mask[3];
    for(i=0;i<PlaneB->height;i++)
    {
        for(int j=0;j<PlaneB->width;j++)
    	{
     
    		iplGetPixel(PlaneB,j,i,&pixel_mask[0]);
    		iplGetPixel(PlaneG,j,i,&pixel_mask[1]);
    		iplGetPixel(PlaneR,j,i,&pixel_mask[2]);
    		samples[nvector]=(CvVect32f)malloc(3*sizeof(float));  
    		samples[nvector][0]=(float)pixel_mask[0];
    		samples[nvector][1]=(float)pixel_mask[1];
    		samples[nvector][2]=(float)pixel_mask[2];
    		nvector++;
    	}
    ......

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for(i=0;i<dst->height;i++)
    {
    	for(int j=0;j<dst->width;j++)
    	{
    		pixel[0]=(unsigned char)(step*cluster[nvector]);
    	iplPutPixel(dst,j,i,pixel);
    	nvector++;
    	}
    }
    merci pour votre attention

  2. #2
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Par défaut
    la veriable samples utilisée est de type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CvVect32f *samples;
    samples=(CvVect32f *)malloc((src->width)*(src->height)*sizeof(CvVect32f));

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 65
    Par défaut
    Salut,

    t'as plusieurs solution:

    1: avec cvSet2D, cvGet2D et CvScalar.

    CvScalar est le type de donné qui représente un scalaire d'une matrice.
    exemple: on a une image de taille 130x150 sur 3 canaux, et on veut modifier la valeur du pixel à l'emplacement 10x20 pour obtenir B=20, G=30, R=40
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IplImage* image=cvCreateImage(cvSize(130, 150), IPL_DEPTH_8U, 2);
    CvScalar pixel;	// représente un scalaire
    pixel.val[0] = 20 // valeur du 1er canal
    pixel.val[1] = 30 // valeur du 2nd canal
    pixel.val[2] = 40 // valeur du 3ème canal
    cvSet2D( image, 10, 20, pixel ); // on insère le pixel à l'emplacement voulu
    donc, ton code devient:
    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
    CvScalar pixel_mask;
     
    for(i=0;i<PlaneB->height;i++){
        for(int j=0;j<PlaneB->width;j++){
    		samples[nvector]=(CvVect32f)malloc(3*sizeof(float));  
     
    		cvGet2D( PlanB, i, j, pixel_mask )
    		samples[nvector][0]=pixel_mask.val[0];
    		cvGet2D( PlanG, i, j, pixel_mask )
    		samples[nvector][1]=pixel_mask.val[0];
    		cvGet2D( PlanR, i, j, pixel_mask )
    		samples[nvector][2]=pixel_mask.val[0];
     
    		nvector++;
    	}
    }
    ou en plus simple:
    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
    for(i=0;i<PlaneB->height;i++)
    {
        for(int j=0;j<PlaneB->width;j++)
    	{
    		samples[nvector]=(CvVect32f)malloc(3*sizeof(float));  
     
    		cvGet2D( src, i, j, pixel_mask )
    		samples[nvector][0]=pixel_mask.val[0];
    		samples[nvector][1]=pixel_mask.val[1];
    		samples[nvector][2]=pixel_mask.val[2];
    		// ba oui, pas la peine de séparer les cannaux pour
                    //acceder à une couleur :) 
    		nvector++;
    	}
    }
    le problème de cette solution est qu'elle est (très) lente à l'exécution.

    2: Un moyen plus compliqué (pour les débutant) est d'accéder directement aux données en mémoire, sans utiliser les fonctions cvSet2D et cvSet2D.
    Sur mon pc, cette méthode est 2x plus rapide. je t'envoie le code ce soir, je suis un pressé maintenant.

    A+

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 65
    Par défaut
    voici la 2nd méthode:

    Dans une structure de type IplImage, les valeurs des pixels sont stocké à partir de l'adresse IplImage::imageData. A partir de cette adresse, tu ajoutes le déplacement nécessaire pour arriver à la ligne voulut + le déplacement pour arriver à la colonne.

    donc, l'exemple que j'avais écrit dans mon post précédant devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int x=10;// numéro de ligne
    int y=20;// numéro de colonne
    IplImage* image=cvCreateImage(cvSize(130, 150), IPL_DEPTH_8U, 3);
     
    // on ajoute à l'adresse de base "image->widthStep*x" , puis "3*y" car on a 3 canaux
    (unsigned char *)(image->imageData + x*image->widthStep + 3*y)[0] = 20;
    (unsigned char *)(image->imageData + x*image->widthStep + 3*y)[1] = 30;
    (unsigned char *)(image->imageData + x*image->widthStep + 3*y)[2] = 40;
    n'oublie pas le cast! si ton image est de type IPL_DEPTH_8U, tu fais un cast vers (unsigned char *). si ton images est de type IPL_DEPTH_32F, le cast sera (float *), etc

    donc, ton code devient:
    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
    for(i=0;i<PlaneB->height;i++)
    {
        int x_shift = image->imageData + i*image->widthStep;
        for(int j=0;j<PlaneB->width;j++)
            {
                    samples[nvector]=(CvVect32f)malloc(3*sizeof(float));  
     
                    int y_shift = 3*j;
     
    		samples[nvector][0]=(unsigned char *)( x_shift + y_shift )[0]
    		samples[nvector][1]=(unsigned char *)( x_shift + y_shift )[1]
    		samples[nvector][2]=(unsigned char *)( x_shift + y_shift )[2]
     
    		nvector++;
    	}
    }

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Par défaut
    merci beaucoup de votre aide,
    j'ai bien utilisé vos solutions.
    mais il y en a d'autres erreurs que je n' ai pu pas les corriger.

    voici le code ou se trouve la premiere erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    float step=255/(float)ncluster;
    CvScalar pixel;
    nvector=0;
    for(i=0;i<dst->height;i++)
    {
    	for(int j=0;j<dst->width;j++)
    	{
    		pixel= step*cluster[nvector];
    	cvSet2D (dst,j,i,pixel);
    	nvector++;
    	}
    }

    et voilà la premiere erreur:

    error C2679: binary '=' : no operator found which takes a right-hand operand of type 'float' (or there is no acceptable conversion)
    1> c:\program files\opencv\cxcore\include\cxtypes.h(1114): could be 'CvScalar &CvScalar::operator =(const CvScalar &)'
    1> while trying to match the argument list '(CvScalar, float)'



    le code de la deuxieme erreur est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CvTermCriteria termcrit;
    termcrit.type=CV_TERMCRIT_ITER +CV_TERMCRIT_EPS;
    termcrit.maxIter=10; 
    termcrit.epsilon=1.0;
    l'erreur est:

    error C2039: 'maxIter' : is not a member of 'CvTermCriteria'
    1> c:\program files\opencv\cxcore\include\cxtypes.h(886) : see declaration of 'CvTermCriteria'

    s'il vous plait aider moi
    et merci de votre attention.

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    65
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 65
    Par défaut
    salut;
    d'abord, pour le 2nd problème, le paramètre est max_iter et non maxIter(regardes la doc). donc ton code devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CvTermCriteria termcrit;
    termcrit.type=CV_TERMCRIT_ITER +CV_TERMCRIT_EPS;
    termcrit.max_iter=10; 
    termcrit.epsilon=1.0;
    sinon, pour cvSet2D, je t'ai montré un exemple ici,
    CvScalar représente un pixel d'une image (ou un scalaire d'une matrice)

    tu utilises sa propriété val pour modifier la valeur du pixel.
    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CvScalar pixel;
    pixel.val[0] = 10; // valeur du 1er canal
    pixel.val[1] = 12; // valeur du 2nd canal
    pixel.val[2] = 20; // valeur du 3ème canal
    pixel.val[3] = 22; // valeur du 4ème canal
    cvSet2D(dst, i, j, pixel);
    donc, ton code devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    float step=255/(float)ncluster;
    CvScalar pixel;
    nvector=0;
    for(i=0;i<dst->height;i++)
    {
        for(int j=0;j<dst->width;j++)
        {
            pixel.val[0]= step*cluster[nvector];   // on insère la valeur voulu
                   // dans le 1er canal (les autres ont une valeur de 0 par défaut)
            cvSet2D (dst,i,j,pixel);
            nvector++;
        }
    }
    ok?

    ps: peux-tu chercher dans la doc avant de poser tes questions? car pour le max_iter, tu aurais rapidement trouver la source du problème en voyant le message d'erreur et en cherchant dans la doc.
    Après avoir chercher dans la doc, si tu ne trouves toujours pas de réponse, n'hésites pas à poster sur le forum!

    A+

  7. #7
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Par défaut
    bonjour merci bien pour votre aide,
    maintenant je n'ai plus des erreurs dans le code mais au niveau de l'exécution. Lorsque j'exécute le code une fenêtre apparaît.
    la voilà :
    Nom : Capture02.jpg
Affichages : 235
Taille : 18,2 Ko

    et voilà tout le code:

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include "main.h"
    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <cxcore.h>
    #include "cxcore.h"
    #include "highgui.h"
    #include <algorithm>
    using namespace std;
    int main()
    {
     
    IplImage *src=cvLoadImage("PolyU_014_S_03.bmp");
     
    CvSize size_src=cvSize(src->width,src->height);
    IplImage *PlaneB=cvCreateImage(size_src,src->depth,1);
    IplImage *PlaneG=cvCreateImage(size_src,src->depth,1);
    IplImage *PlaneR=cvCreateImage(size_src,src->depth,1);
    cvCvtPixToPlane(src,PlaneB,PlaneG,PlaneR,0);
    IplImage *dst=cvCreateImage(size_src,IPL_DEPTH_8U,1);
    int* cluster,nvector=0, i, ncluster=2;
    CvVect32f *samples;
    cluster=(int*)malloc((src->width)*(src->height)*sizeof(int));
    samples=(CvVect32f *)malloc((src->width)*(src->height)*sizeof(CvVect32f));
     
    CvTermCriteria termcrit;
    termcrit.type=CV_TERMCRIT_ITER +CV_TERMCRIT_EPS;
    termcrit.max_iter=10; 
    termcrit.epsilon=1.0;
     
    CvScalar pixel_mask;
    for(i=0;i<PlaneB->height;i++)
    {
        for(int j=0;j<PlaneB->width;j++)
    	{samples[nvector]=(CvVect32f)malloc(3*sizeof(float));
    		pixel_mask =cvGet2D( PlaneB, j, i);
    		samples[nvector][0]=pixel_mask.val[0];
    		pixel_mask =cvGet2D( PlaneG, j, i);
    		samples[nvector][1]=pixel_mask.val[0];
    		pixel_mask =cvGet2D( PlaneR, j, i);
    		samples[nvector][2]=pixel_mask.val[0];
     
    		nvector++;
    	}
    }
     
    cvKMeans(ncluster,samples,(src->width)*(src->height),3,termcrit,cluster);
    float step=255/(float)ncluster;
    CvScalar pixel;
    nvector=0;
    for(i=0;i<dst->height;i++)
    {
        for(int j=0;j<dst->width;j++)
        {
            pixel.val[0]= step*cluster[nvector];   // on insère la valeur voulu
                   // dans le 1er canal (les autres ont une valeur de 0 par défaut)
            cvSet2D (dst,j,i,pixel);
            nvector++;
        }
    }
    cvSaveImage("km.bmp",dst);
    cvWaitKey(0);
    cvNamedWindow("window src",CV_WINDOW_AUTOSIZE);
    cvShowImage("window src",src);
    cvNamedWindow("window dst",CV_WINDOW_AUTOSIZE);
    cvShowImage("window dst",dst); 
     
    nvector=0;
    for(i=0;i<PlaneB->height;i++)
    {
    	for(int j=0;j<PlaneB->width;j++)
    	{
    		free(samples[nvector]);
    		nvector++;
    	}
    }
    free(samples);
    free(cluster);
    cvDestroyWindow("window src");
    cvDestroyWindow("window dst");
    cvReleaseImage(&src);
    cvReleaseImage(&dst);
    }
    mon but de ce code est d'appliquer la méthode de segmentation K_Means sur une image puis afficher l'image résultante après cette segmentation.
    s'il vous plait aider moi.
    et encore merci bien de votre aide ;

  8. #8
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Par défaut
    merci beaucoup c'est bien marché.
    S'il vous plaît, est ce que vous pouvez m'expliquer les paramètres de la fonction cvKMeans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void  cvKMeans( int num_clusters, CvVect32f* samples, int num_samples, int vec_size, CvTermCriteria termcrit, int* cluster  );

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2006, 12h02
  2. Remplacer null par...
    Par HichamK dans le forum Oracle
    Réponses: 4
    Dernier message: 17/01/2006, 13h56
  3. Réponses: 2
    Dernier message: 14/11/2005, 13h33
  4. [Configuration] remplacement des é par des i
    Par illegalsene dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/10/2005, 16h37
  5. [ASP] include remplacer chemin par variable
    Par damn dans le forum ASP
    Réponses: 3
    Dernier message: 01/10/2004, 15h27

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