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 :

Accéder aux valeurs des éléments d'une matrice


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Accéder aux valeurs des éléments d'une matrice
    Bonjour,

    Je travaille sur un outil de segmentation d'images médicales codé en C++ avec Visual Studio 2010.
    Comme la segmentation requiert énormément la manipulation de matrices j'utilise la bibliothèque OpenCV que je trouve idéale pour cette utilité.
    En revanche je n'arrive pas à récupérer la valeur d'un élément de la matrice (qui correspond ici à la valeur d'un pixel d'une image).
    Le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string path = "C:/img.jpg";
        Mat img = imread (path);
    	cout<< img.at<uchar>(209,209)<<endl;
    n'affiche rien, quelque soit les valeurs (i,j).
    Si je remplace uchar par int j'obtient des valeurs du type -1886417025.
    Est-ce que matrice.at<type_variable>(i,j) est bien employé ici? Faut-il utilisé autre chose pour récupérer cette valeur?
    Je précise que je travaille sur des images jpg (Dicom par la suite) en niveaux de gris de dimensions 512*512 pixels.

    Merci d'avance

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Dans la doc de imread il est précisé que l'argument flag doit être mis à 0 pour des images grayscale.
    C'est peut-être l'origine du problème.

    Un conseil : dès que possible, utiliser une spécialisation Mat_<Type> au lieu d'un Mat basique, pour contraindre le type des éléments de la matrice, donc connaitre le type exact des pixels qu'on manipule et s'épargner des erreurs de "cast".
    Exemple : cv::Mat_<uchar> pour une matrice 8bits en niveau de gris, cv::Mat_<cv::Vec3b> pour une matrice 8 bits en BGR.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Dans la doc de imread il est précisé que l'argument flag doit être mis à 0 pour pour des images grayscale.
    C'est peut-être l'origine du problème.

    Un conseil : dès que possible, utiliser une spécialisation Mat_<Type> au lieu d'un Mat basique, pour contraindre le type des éléments de la matrice, donc connaitre le type exact des pixels qu'on manipule et s'épargner des erreurs de "cast".
    Exemple : cv::Mat_<uchar> pour une matrice 8bits en niveau de gris, cv::Mat_<cv::Vec3b> pour une matrice 8 bits en BGR.
    Merci pour l'info concernant l'utilisation des spécialisations.
    J'ai donc mis l'argument flags à 0 ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string path = "C:/img.jpg";
    Mat_<uchar> img = imread (path,0);
    cout<<img.at<uchar>(350,350)<<endl;
    Maintenant suivant la valeur (i,j) cela me retourne un i tréma, rien du tout, voir même un smiley! Lorsque j'utilise int à la place de uchar, j'ai toujours des valeurs aberrantes.
    J'ai également remarqué que le fait d'utiliser une spécialisation me permet de récupérer la valeur du pixel par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    img(i,j) et non plus img.at<uchar>(i,j)
    Mais cela ne change rien aux valeurs retournées.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    L’intérêt de ce petit code est uniquement de pouvoir tester si je récupère correctement la valeur des pixels afin de pouvoir effectuer des opérations plus complexes comme modifier les valeurs de ces pixels.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Attention, au moment d'afficher img.at<uchar>(350,350), std::cout considère qu'il s'agit d'un caractère. Il faut le recaster en int pour l'afficher comme une valeur numérique : (int)img.at<uchar>(350,350)
    J'ai également remarqué que le fait d'utiliser une spécialisation me permet de récupérer la valeur du pixel par
    img(i,j) et non plus img.at<uchar>(i,j)
    En effet, le choix d'un type spécialisé cv::Mat_ permet aussi d'alléger le reste du code en évitant de répéter le type template. Et comme chacun sait, moins de répétitions = moins de bugs.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Attention, au moment d'afficher img.at<uchar>(350,350), std::cout considère qu'il s'agit d'un caractère. Il faut le recaster en int pour l'afficher comme une valeur numérique : (int)img.at<uchar>(350,350)
    En effet, le choix d'un type spécialisé cv::Mat_ permet aussi d'alléger le reste du code en évitant de répéter le type template. Et comme chacun sait, moins de répétitions = moins de bugs.
    Merci beaucoup, cela fonctionne parfaitement!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string path = "C:/img.jpg";
    Mat_<uchar> img = imread (path,0);
    cout<<(int)img(i,j)<<endl;
    Ce code retourne bien des valeurs de ng.
    Sujet résolu donc, merci de ton aide cob59.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/03/2009, 18h30
  2. Comment accéder aux valeurs des champs de DetailsView?
    Par insane_80 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 06/07/2008, 22h12
  3. somme des éléments d'une matrice
    Par virginie999 dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/06/2008, 22h14
  4. Les valeurs des tableaux dans une matrice
    Par fatma hamdi dans le forum Fortran
    Réponses: 1
    Dernier message: 31/03/2008, 00h33
  5. Somme récursive des éléments d'une matrice
    Par lo_pascal dans le forum Pascal
    Réponses: 4
    Dernier message: 18/01/2008, 12h08

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