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 :

cvSetImageROI ou cvResetImageROI


Sujet :

OpenCV

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut cvSetImageROI ou cvResetImageROI
    bonjour,
    je voudrais savoir quelle est la différence entre "cvResetImageROI", "cvSetImageROI"
    à mes connaissance la première est pour définir l'image comme une région d'intérêt mais le deuxième défini une région d'intérêt Cvrect
    mais j'ai pas compris comment ils ont travaillé et est ec qu'on peux travaillé avec les deux dans le même code ?

  2. #2
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    je voudrais savoir l'utilité de cette fct aussi "CV_IMAGE_ELEM" je sais quelle est utilisé pour accés à les coordonnais de l'image mais j'ai pas bien compris ces paramètre

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* get reference to pixel at (col,row),
       for multi-channel images (col) should be multiplied by number of channels */
    #define CV_IMAGE_ELEM( image, elemtype, row, col )       \
        (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
    En fait c'est qu'une macro pour aller chercher un pixel dans une image

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    En gros setImageROI definie une region d'interet dans l'image (comme tu dis a travers un cvRect). Donc ensuite tu peux travailler avec cette ROI comme si c'etait une image complete.
    resetImageROI c'est rien qu'une fonction pour annuler la selection d'une ROI et reconsiderer l'image toute entiere, en gros c'est la meme chose que le codesuivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cvSetImageROI( image, cvRect( 0, 0, image->width, image->height ));
    cvSetImageCOI( image, 0 );
    sauf qu'en plus il fait un release de la structure ROI precedemment definie.

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    merci glen
    j'ai compris bien cvSetImageROI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     float* pixel_coords = &CV_IMAGE_ELEM(pCoords, float, v, u*3);
    c à dire trouver les coordonnée du pixel (u,v) dans l'image pcoords?

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    ca te renvoie la valeur du channel du pixel correspondant, en gros tu lui demande la valeur du channel du pixel situé en x,y

    http://osdir.com/ml/lib.opencv/2006-03/msg00914.html

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    merci snowpy
    mais je n'ais pas compris bien l'explication du site

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    ta plusieurs moyen de récupérer les channels d'un pixel, ta le cvget2D mais tu as aussi ca CV_IMAGE_ELEM et ca I(x,y) ~ ((uchar*)(img->imageData + img->widthStep*y))[x]
    . Cela réalise la même fonction, récupérer le pixel et ses couleurs et séparer la couleur suivant le nombre de channel correspondant (BGR, HSV) selon le nombre de channel de ton image.

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    merci glen1789 et snowpy
    c'est résolu

  10. #10
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    bonjour,
    toujours j'ai un problème avec CV_IMAGE_ELEM
    j'ai trouvé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     IplImage* pCoords;
      pCoords = cvCreateImage(frame_size, IPL_DEPTH_32F, 3);
    //(u,v) coordonnée d'un pixel 
      float* pixel_coords = &CV_IMAGE_ELEM(pCoords, float, v, u*3);
            float x = pixel_coords[0]; 
            float y = pixel_coords[1];  
            float z = pixel_coords[2];
    dans ce code là , comment il a utilisé CV_IMAGE_ELEM malgré notre image pCoords est vide ????? en plus de ça il a récupérer 3 coordonnée ????

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    2 possibilités :

    - première possibilité, c'est faux et ca ne fonctionne pas
    - deuxième possibilité, quand on crée une image, il remplie celle-ci par defaut, en gros quand tu fais le create au lieu d'avoir un vide il mets une couleur uniforme pour créer une image par défaut.

    J'avoue ne jamais avoir testé, essaye de faire un create et d'afficher le résultat pour voir. Mais je pense que la deuxième possibilité sera la bonne.

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    bonjour snowpy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deuxième possibilité, quand on crée une image, il remplie celle-ci par defaut, en gros quand tu fais le create au lieu d'avoir un vide il mets une couleur uniforme pour créer une image par défaut.
    je ne pense pas si elle est en couleur uniforme par ce que il a travaillé ensuite par les valeur de X,Y,Z
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Set vector X with pixel 4D homogeneous coordinates (x, y, z, 1).
            SET_VECTOR_4D(m_X, x, y, z, 1);
     
            // Calculate eye coordinates Z = W * X. 
            cvGEMM(m_W, m_X, 1, 0, 0, m_Z);
    comment il a récupérer les X,Y,Z de chaque pixel
    le code se trouve ici merci de le voir et me dire est ce que il est en couleur uniforme ou non
    http://www.koders.com/cpp/fid21C089B...x?s=opencv#L45
    et dans ce lien il a crée l'image
    http://www.koders.com/cpp/fidC00B8EF....aspx?s=opencv
    j'ai pas trouvé où il a changé les paramètres de l'image

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    je ne pense pas si elle est en couleur uniforme par ce que il a travaillé ensuite par les valeur de X,Y,Z
    attention à ne pas confondre couleur et channel. On va prendre le cas d'une image RGB (pour HSV et le reste ca reste valable). Imaginons que je remplice mon image entièrement de blanc. La couleur est uniforme. Or les trois channels sont concerné à savoir que pour avoir du blanc RGB tu auras R > 223 , G > 223 , B > 223
    Table RGB
    La j'ai pris le cas d'une couleur constitué des trois mais si tu regarde dans la table si tu prends que du rouge par exemple les channels G et B sont à zéro mais ils existent quand même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(i=0; i<template_rect.width; i+=step)
        {
          int u = i + template_rect.x;
          //float Xw = u + 0.5f;
     
          for(j=0; j<template_rect.height; j+=step)
          {
            int v = j + template_rect.y;
    Début de boucle il va parcourir tous les pixels de l'image. Ensuite pour chaque pixel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Retrive stored eye coordinates (Xe;Ye;Ze) coordinates for current pixel.
            float* pixel_coords = &CV_IMAGE_ELEM(pCoords, float, v, u*3);
            float x = pixel_coords[0]; 
            float y = pixel_coords[1];  
            float z = pixel_coords[2];
    il récupère la valeur du channel 1 2 et 3 (RGB, HSV ca dépend du format de l'image)

    j'ai pas trouvé où il a changé les paramètres de l'image
    Que veux tu dire par paramètre ?

    edit: je ne sais pas à quoi correspond SET_VECTOR_4D, mais je pense savoir ce qui te choc. Il utilise la valeur des channels comme coordonnées, il réalise une modélisation des couleurs une sorte d'histogramme

  14. #14
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    il récupère la valeur du channel 1 2 et 3 (RGB, HSV ca dépend du format de l'image)
    mais X,Y,Z ce sont les coordonnées du pixel non?( les coordonnées c-à-d X: pour l'axe x ,Y : pour laxe Y et Z pour le z)

    Que veux tu dire par paramètre ?
    c-a-d où il a remplis l'image parce que normalement il faut faire un copy de l'image de frame ou quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define SET_VECTOR_4D(vector4d, x, y, z, w)\
      CV_MAT_ELEM(*(vector4d), float, 0, 0) = ( x ) ;\
      CV_MAT_ELEM(*(vector4d), float, 1, 0) = ( y ) ;\
      CV_MAT_ELEM(*(vector4d), float, 2, 0) = ( z );\
      CV_MAT_ELEM(*(vector4d), float, 3, 0) = ( w )
    ça le role de SET_VECTOR_4D

  15. #15
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    mais X,Y,Z ce sont les coordonnées du pixel non?
    Non, ce sont les valeurs des channels du pixel en cour.

    C'est un peu comme si tu fesais un histogramme en x tu aura une couleur et tu te sers de ca comme abscisse mais physiquement ca ne représente pas une coordonnée de pixel.

    autant pour moi j'avais pas vu la déclaration.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET_VECTOR_4D(m_X, x, y, z, 1);
    il ne fait que stocker les 3 channels récupéré dans une matrice pour pouvoir faire sa multiplication de matrice à la ligne suivante (il applique un filtre), il n'est pas question d'image ici. Tout ce que j'a dis avant n'été donc pas bon il ne fait que les stocker dans une matrice pour réaliser la multiplication (le pourquoi je ne sais pas )

  16. #16
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Non, ce sont les valeurs des channels du pixel en cour.
    je pense pas que sont des valeurs de channel
    parce que la multiplication doit être faite sur les coordonnées du pixel
    (il multiplié les coordonnées du pixels pour connaitre la nouvelle emplacement du pixel )
    par exemple
    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
    for(i=0; i<omega.width; i++)
       {
         u = i + omega.x;
     
         for(j=0; j<omega.height; j++)
         {
           v = j + omega.y;
     
           // Set vector X with pixel coordinates (u,v,1)
           SET_VECTOR(X, u, v);
     
           // Warp Z=W*X
           cvGEMM(W, X, 1, 0, 0, Z);
     
           // (u2,v2) - pixel coordinates in the coordinate frame of I.
           float u2, v2;
     
           // Get coordinates of warped pixel in coordinate frame of I.
           GET_VECTOR(Z, u2, v2);
     
           // Get the nearest integer pixel coords (u2i;v2i).
           int u2i = cvFloor(u2);
           int v2i = cvFloor(v2);
     
           if(u2i>=0 && u2i<pImgI->width && // check if pixel is inside I.
              v2i>=0 && v2i<pImgI->height)
           {
             pixel_count++;
    ...........
    ici il a travaillé en (u,v)
    mais dans le code du lien il a fait 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    for(i=0; i<template_rect.width; i+=step)
        {
          int u = i + template_rect.x;
     
          for(j=0; j<template_rect.height; j+=step)
          {
            int v = j + template_rect.y;
     
            // Now we have viewport coordinates of current pixel in (u;v).
     
     
            // Get pixel 3D coordinates (x;y;z).
            float* pixel_coords = &CV_IMAGE_ELEM(pCoords, float, v, u*3);
            float x = pixel_coords[0]; 
            float y = pixel_coords[1];  
            float z = pixel_coords[2];
     
            assert(z!=0);
     
            // Set vector X with pixel 4D homogeneous coordinates (x, y, z, 1).
            SET_VECTOR_4D(m_X, x, y, z, 1);
     
            // Transform Z = W * X. 
            cvGEMM(m_W, m_X, 1, 0, 0, m_Z);
     
            // Project X = P * Z.
            cvGEMM(m_P, m_Z, 1, 0, 0, m_X);
     
            // Get normalized device coordinates of the transformed pixel.
            float Xd, Yd, Zd, Wd;
            GET_VECTOR_4D(m_X, Xd, Yd, Zd, Wd);
     
            // Convert normalized device coordinates (Xd, Yd, Zd, Wd) to window coordinates (u2;v2). 
            // We ignore Zd, because we don't need it here.
            float u2 = fFrameWidth/2.0f * (1.0f + Xd/Wd);
            float v2 = fFrameHeight/2.0f * (1.0f - Yd/Wd);
     
            // Get the nearest integer pixel coords (u2i;v2i).
            int u2i = cvFloor(u2);
            int v2i = cvFloor(v2);
     
            // Check if pixel (u2i, v2i) is inside pImgI.
            if(u2i>=0 && u2i<pImgI->width && 
              v2i>=0 && v2i<pImgI->height)
            {
              pixel_count++; // Increase count 
    ..............
    la declaration de SET_VECTOR_4D se trouve ici
    http://www.koders.com/c/fid3B035BF58....aspx?s=opencv
    ma tête sera cassé et j'ai pas compris comment il a travaillé par X,Y,Z

  17. #17
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float x = pixel_coords[0]; 
            float y = pixel_coords[1];  
            float z = pixel_coords[2];
    tu parles bien de ceci en x,y,z ?

    oui pour la déclaration je l'ai vue après ma première réponse.

  18. #18
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float x = pixel_coords[0]; 
            float y = pixel_coords[1];  
            float z = pixel_coords[2];
    oui je parle sur ces coordonnées
    il a les utilisé dans la multiplication pour connaitre la nouvelle position du pixel ensuite il a fait la projection et la normalisation pour connaitre l'emplacement 2d du pixel

  19. #19
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    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
    Method 1: Using Inbuilt macro:
    CV_IMAGE_ELEM( image_header, elemtype, y, x_Nc )
     
    Suppose, we have 8-bit 1-channel image I (IplImage* img):
     
    I(x,y) ~ CV_IMAGE_ELEM( img, uchar, y, x);
     
    Suppose, we have 8-bit 3-channel image I (IplImage* img):
     
    I(x,y)blue ~ CV_IMAGE_ELEM( img, uchar, y, x*3);
    I(x,y)green ~ CV_IMAGE_ELEM( img, uchar, y, x*3+1);
    I(x,y)red ~ CV_IMAGE_ELEM( img, uchar, y, x*3+2);
    il récupère la valeur des channels

    hum ou pas je cherche et je poste quand j'ai résolu

  20. #20
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    mais quelle est l'utilité de récupérer les canaux de l'image ?
    je sais que son objectif de multiplication est de trouvé la nouvelle position du pixel qui est (u2,v2)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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