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 HSV] Accès aux elements d'une matrice


Sujet :

OpenCV

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut [Image HSV] Accès aux elements d'une matrice
    Bonjour à tous!

    Bon, j'utilise OpenCV depuis quelques semaines maintenant et je n’arrêterais pas de me laisser suprendre par la complexité de choses qui semblent banales.

    En bref, j'ai une Mat hsv qui représente une image HSV avec chacun des éléments de cette matrice : les pixels de mon image, codés sur 3 chaines : h, s, et v.

    Je veux tout simplement avoir accès aux valeurs contenues dans ma Mat. Simple non? ... Faut croire que non...

    Voici mon bout de 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
    static void onMouse( int event, int x, int y, int, void* )
    {
     
    	// Local variables
    	Mat hsv;
     
     
    	if(event == CV_EVENT_LBUTTONUP)	
    	{
    		// Get the hsv image
    		cvtColor(imRGB, hsv, CV_BGR2HSV);
     
    		// Get the selected pixel
     
                    //Premiere methode pour avoir acces aux cannaux h,s,v
    		//h = hsv.at<int>(y, x, 1);
                    //s = hsv.at<int>(y, x, 2);
    		//v = hsv.at<int>(y, x, 3);
     
                    //Deuxième méthode
    		//cout << hsv.at<int>(y,x) << " " << hsv.at<int>(y,x) << " " << hsv.at<int>(y,x) << endl;
     
    	}
     
    }
    Deux méthodes d'accès utilisant Mat.at<>() qui me renvoient un throw avec "OpenCv Error : Assertion failed"

    A noter qu'ici, il s'agit d'une fonction onMouse qui est appelée en cas de clic souris avec x, y étant les coordonnées de mon curseur dans ma matrice (fonction testée avec affichage des valeurs de x et y, et opérationnelle)

    Voilà, la question est donc simple : qu'est ce qui cloche? existe-t-il une autre méthode que Mat.at<>() pour accéder aux éléments d'une Mat? comment gérer le fait que la Mat soit de dimension 2D avec comme éléments des vecteurs 1D (h,s,v)?

    Merci de m'avoir lu et d'avance pour votre aide. J'espère avoir été clair dans l’énoncé de mon souci.

    Au plaisir de vous lire à mon tour.
    A.

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Points : 58
    Points
    58
    Par défaut
    Salut,
    Pour accéder à la valeur d'une composante il suffit d'ajouter des [] avec le chiffre de la composante.

    exemple en RGB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cv::Mat image = cv::imread("image_en_couleur.jpg");
    std::cout << "Composante Bleu = " << image.at<cv::Vec3b>(50,50)[0] << std::endl;
    std::cout << "Composante Verte = " << image.at<cv::Vec3b>(50,50)[1] << std::endl;
    std::cout << "Composante Rouge = " << image.at<cv::Vec3b>(50,50)[2] << std::endl;
    Pour le HSV c'est pareil mais attention, les bornes sont différentes
    H : 0-180
    S : 0-100
    V : 0-100
    Tu peux y accéder de la même façon.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Salut supernovagm et Merci beaucoup pour ta réponse!

    Le sujet à l'air plutôt simple mais j'ai l'impression qu'il intéressera pas mal de monde étant donné le nombre de vues de ce post

    Pour ce qui est du problème, j'y vois beaucoup plus clair grâce à ton explication. Cependant, il y a quelques petites choses que je ne saisi pas encore.

    Dans mon programme, mon image HSV est récuppérée via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cvtColor(imRGB, hsv, CV_RGB2HSV);
    avec imRGB capturée en CV_8UC3.

    Ensuite, mon but est d'accéder à la valeur des composantes H, S et V du pixel (x,y) sélectionné grâce à ma fonction "OnMouse".

    Mes interrogations sont donc les suivantes:
    - A quoi correspond les "bornes" que tu décris? Ne devrais-je pas plutôt mettre les coordonnées de mon pixel à la place? (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Composante H = " << hsv.at<Vec3b>(y,x)[0] << endl;
    )

    - Quand j'utilise ton code l'affichage fonctionne mais j'ai de jolies valeurs "ù, Ð, Ä, ... " En fait Mat.at renvoie l'adresse de la valeur qui m’intéresse? Comment donc y avoir réellement accès?

    - Pourquoi utiliser <Vec3b> alors que mon image HSV est codée avec des int? Ne devrais-je pas plutôt utiliser <Vec3i>?

    Voilà, j'espère ne pas être trop à côté de la plaque avec mes questions.
    Je te remercie d'avance pour tes lumières.
    A.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Points : 58
    Points
    58
    Par défaut
    Et oui j'ai fait une erreur, il faut cast le résultat pour qu'il soit affichable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Composante H = " << (int)hsv.at<Vec3b>(y,x)[0] << endl;
    Les bornes que je te décris, c'est celles fixées par openCV,
    si tu t'es renseigné sur le codage HSV, tu as pu voir que le Hue (H) correspondait à un degré (0-360°) et la Saturation (S) un pourcentage (0-100%) ainsi que la Value (0-100%).
    Sauf que openCV semble garder la mémoire allouée pour ton image en 8UC3 (8 bits, 256 valeurs) pour y affecter les valeurs de différentes composantes du HSV.
    Soit pour que 0-360 soit contenu dans 0-255, ils divisent par 2 => 0-180
    le S et V sont en fait calculés sur 0-1 flottant puis multipliés par 255 => 0-255

    C'est aussi pour ça que c'est Vec3b

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par supernovagm Voir le message
    Sauf que openCV semble garder la mémoire allouée pour ton image en 8UC3 (8 bits, 256 valeurs) pour y affecter les valeurs de différentes composantes du HSV.
    Soit pour que 0-360 soit contenu dans 0-255, ils divisent par 2 => 0-180
    le S et V sont en fait calculés sur 0-1 flottant puis multipliés par 255 => 0-255

    C'est aussi pour ça que c'est Vec3b

    Voilà ce que j'ignorais! (ps : aurais tu un lien ou une doc qui traite en détail ce genre de question de gestion? Merci)

    Merci beaucoup pour ton aide! surtout que je ne t'ai pas facilité la tache; à force de tourner et retourner le problème dans tous les sens j'avais pas pensé à la solution élémentaire du cast

    Maintenant, en unsigned int, j'ai les bonnes valeurs pour mes composantes!

    Merci encore!
    Bien cordialement,
    A.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 38
    Points : 58
    Points
    58
    Par défaut
    hum non j'ai pas vraiment >.<
    Tu l'as surement fait, mais n'hésite pas à parcourir la doc, c'est vraiment rempli d'info.

    http://docs.opencv.org/modules/imgpr...r2hsv#cvtcolor
    un peu plus bas tu as justement le cas du BGR2HSV

    de rien

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

Discussions similaires

  1. [Débutant] fonction appliquee aux elements d'une matrice
    Par nico888 dans le forum MATLAB
    Réponses: 16
    Dernier message: 21/08/2009, 11h12
  2. Accès aux pixels d'une Image
    Par PerpetualSnow dans le forum Silverlight
    Réponses: 3
    Dernier message: 10/11/2008, 18h39
  3. Accès aux éléments d'une image
    Par Nates dans le forum OpenCV
    Réponses: 24
    Dernier message: 01/08/2008, 14h56
  4. Réponses: 6
    Dernier message: 23/01/2007, 14h08
  5. acces aux pixels d'une image
    Par bassidi meryeme dans le forum Composants VCL
    Réponses: 2
    Dernier message: 05/10/2005, 11h20

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