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

Bibliothèques tierces Python Discussion :

GetTrackbarPos ? ?


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut GetTrackbarPos ? ?
    Voici mon petit problème:

    Je reprends ici un exemple qui est fourni avec opencv python. J'ai repris cet exemple que j'ai derivé pour faire d'autres traitement d'images. Mon problème est que je n'arrive pas à récupérer la position du trackbar! j'ai essayé la fonction GetTrackbarPos() ou d'autre stratégies mais je n'y arrive pas.. En reprenant l'exemple ci dessous, sauriez vous comment l'obtenir? je dois récupérer cette position pour faire d'autre traitements par la suite.Donc par exemple en fin de programme obtenir un trackpos= 2 ou peu importe la position sur laquelle se situe le trackbar.

    Merci d'avance!!!!
    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
     
    import sys
    import urllib2
    import cv
    # some definitions
    win_name = "Edge"
    trackbar_name = "Threshold"
     
    # the callback on the trackbar
     
    def on_trackbar(position):
     
      cv.Smooth(gray, edge, cv.CV_BLUR, 3, 3, 0)
      cv.Not(gray, edge)
     
    # run the edge dector on gray scale
      cv.Canny(gray, edge, position, position * 3, 3)
     
    # reset
      cv.SetZero(col_edge)
     
    # copy edge points
      cv.Copy(im, col_edge, edge)
     
    # show the im
      cv.ShowImage(win_name, col_edge)
     
     
    im = cv.LoadImage("Tv25.tif", cv.CV_LOAD_IMAGE_COLOR)
     
     
     
    # create the output im
    col_edge = cv.CreateImage((im.width, im.height), 8, 3)
    # convert to grayscale
    gray = cv.CreateImage((im.width, im.height), 8, 1)
    edge = cv.CreateImage((im.width, im.height), 8, 1)
    cv.CvtColor(im, gray, cv.CV_BGR2GRAY)
     
    # create the window
    cv.NamedWindow(win_name, cv.CV_WINDOW_AUTOSIZE)
     
    # create the trackbar
    cv.CreateTrackbar(trackbar_name, win_name, 1, 100, on_trackbar)
     
    # show the im
    on_trackbar(0)
     
    # wait a key pressed to end
    cv.WaitKey(0)

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    L'argument 'position' de 'def on_trackbar()' est la position que tu veux.

    Évidemment, au sortir de la fonction cet argument est perdu, tu dois le sauver dans une globale avant tout, ou mieux, utiliser une classe et y référencer 'self.position'.

    Si j'ai bien compris ta question, enfin.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Salut VinsS,

    C'est exactement ça, seulement je n'y arrive pas!

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Ok, un exemple en faisant de ton image une classe.

    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
     
    #!/usr/bin/python
     
    import sys
    import time
     
    from opencv.cv import *
    from opencv.highgui import *
     
    class Picture(object):
        def __init__(self, img):
            self.img = img.encode(sys.getfilesystemencoding())
            self.win_name = "Edge"
            self.trackbar_name = "Threshold"
            # create the window
            cvNamedWindow(self.win_name, CV_WINDOW_AUTOSIZE)
     
            # create the trackbar
            cvCreateTrackbar(self.trackbar_name, self.win_name, 1, 100, self.on_trackbar)
     
        def load_image(self):
            try:
                self.src_image = cvLoadImage(self.img, 1)
            except Exception, why:
                # opencv had inconsistent exception type
                "Image was not loaded, reason: ", why
                return
     
            # create the output im
            self.col_edge = cvCreateImage((self.src_image.width, self.src_image.height), 8, 3)
            # convert to grayscale
            self.gray = cvCreateImage((self.src_image.width, self.src_image.height), 8, 1)
            self.edge = cvCreateImage((self.src_image.width, self.src_image.height), 8, 1)
            cvCvtColor(self.src_image, self.gray, CV_BGR2GRAY)
            # show the im
            self.on_trackbar(0)
            cvWaitKey(0)
     
        def on_trackbar(self, position):
            self.position = position
            cvSmooth(self.gray, self.edge, CV_BLUR, 3, 3, 0)
            cvNot(self.gray, self.edge)
     
            # run the edge dector on gray scale
            cvCanny(self.gray, self.edge, position, position * 3, 3)
     
            # reset
            cvSetZero(self.col_edge)
     
            # copy edge points
            cvCopy(self.src_image, self.col_edge, self.edge)
     
            # show the im
            cvShowImage(self.win_name, self.col_edge)
     
            print "TrackBar value: ", self.get_pos()
     
        def get_pos(self):
            return self.position
     
    if __name__ == "__main__":
        file_name = "maPhoto.jpg"
        pict = Picture(file_name)
        pict.load_image()
    Normalement, j'ai repris la plupart de tes lignes de code.

    Tu remarqueras le "self" qui précède maintenant tes noms de variables, cvarrays, etc. considère simplement que "self" désigne "pict" qui est instancié à la fin du code, c'est donc ton objet Picture

    D'autre part je n'utilise pas les mêmes imports que toi et, donc, je dois faire cvLoadImage() au lieu de cv.LoadImage(), c'est une question de plate-forme, tu dois bien sur continuer à utiliser ta méthode. Moi, je suis sous Ubuntu.

    Si tu n'as besoin de l'image que en gamme de gris, tu peux aussi l'ouvrir avec "cvLoadImage(file_name, -1) elle sera ouverte en grayscale il ne faut plus la convertir avec cvCvtColor().

    Une remarque, la doc n'est pas très à jour, en général je google avec le message d'erreur comme clé de recherche et puis je fais des essais, ... avec patience.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup d'avoir pris le temps de réécrire le code et l'effort pour l'expliquer!
    Reste une petite chose, une fois la fenêtre contenant l'image fermée, comment puis-je récupérer la dernière position sur laquelle se trouvait la trackbar avant fermeture?C'est à dire comment je peux la stocker et la réutiliser même si la fenêtre image est fermée?

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Donc, si je comprend bien, le script avec opencv est appelé depuis un premier script principal et quand tu ferme la fenêtre opencv le script principal reprend la main.

    Ajoute deux lignes à la fin du script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if __name__ == "__main__":
        file_name = "maPhoto.jpg"
        pict = Picture(file_name)
        pict.load_image()
        print "Position: ", pict.get_pos()
        print pict
    Et tu verras qu'à la fermeture de la fenêtre, tu peux toujours récupérer la valeur du trackBar et surtout "print pict" te montrera que la fermeture de la fenêtre n'a pas détruit l'instance "pict".

    La durée de vie de ta classe Pict() est indépendante de celle de la fenêtre, celle-ci n'est qu'un sous-objet, si je puis dire, de ta classe.

    Autre chose, si tu passe le nom de fichier non pas à l'instanciation de la classe mais au chargement de l'image, tu peux réutiliser "pict" avec d'autres images.

    Donc, comme ceci:

    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
     
    class Picture(object):
        def __init__(self):
            self.win_name = "Edge"
            self.trackbar_name = "Threshold"
            # create the window
            cvNamedWindow(self.win_name, CV_WINDOW_AUTOSIZE)
     
            # create the trackbar
            cvCreateTrackbar(self.trackbar_name, self.win_name, 1, 100, self.on_trackbar)
     
        def load_image(self, img):
            self.img = img.encode(sys.getfilesystemencoding())
     
            # le reste ne change pas
     
     
    if __name__ == "__main__":
        pict = Picture()
        pict.load_image(monImage1)
        ...
        pict.load_image(monImag2)
        ...
        pict.load_image(monImage3)
        ...
    Maintenant, si ton script principal est aussi une classe, sache que celles-ci peuvent communiquer entre elles, s'échanger des données par exemple.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Génial!

    Très bien expliqué, maintenant il va falloir que j’apprenne les classes, objets et autre puisque je débute. En tout cas tu m'as bien rendu service!

    Merci encore

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

Discussions similaires

  1. GetTrackbarPos ?
    Par edding4 dans le forum OpenCV
    Réponses: 0
    Dernier message: 20/10/2011, 23h09

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