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

Python Discussion :

[PYTHON 2.X] [POO] Récupération d'une variable dans une fonction après initialisation


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut [PYTHON 2.X] [POO] Récupération d'une variable dans une fonction après initialisation
    Bonjour, pour un projet scolaire de fin d'étude j'ai à réaliser un programme de détection de rond rouge ou vers avec la librairie opencv. Afin de rendre un projet aussi propre et fonctionnel que possible, j'utilise la syntaxe objet mais je me retrouve ici bloqué, je possède 3 fichiers python :
    -Un main
    -Un fichier contenant une classe DetectColor
    -Un fichier contenant une classe Camera

    L'objectif étant de lancé 2 instances de DetectColor ( pour le rouge et le vert ), et chaque instance doit accéder à la caméra et faire une copie de la matrice de cette dernière pour pouvoir la réutiliser afin de détecter la couleur.

    Voici le main.py

    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
    import logging
    from DetectGreen import DetectGreen
    from camera import Camera
    import sys
    from time import sleep
    import threading
    LOGGER = logging.getLogger(__name__)
     
     
    class Main(object):
     
        camera = Camera()
        detectred = DetectGreen(hLower=0, uLower=0, vLower=0,
                                hUpper=255, uUpper=255, vUpper=255)
     
        detectgreen = DetectGreen(hLower=154, uLower=66, vLower=250,
                                  hUpper=179, uUpper=132, vUpper=255)
     
        logging.basicConfig(level=logging.DEBUG,
                            format="%(levelname)s %(asctime)s [%(process)d] %(name)s %(filename)s:%(lineno)d %(message)s",
                            )
     
        def __init__(self):
            """Initialize MyClassManager instance."""
            LOGGER.debug("Create instance of MyClassManager")
            super(Main, self).__init__()
            self._worker = None
            LOGGER.info("End of init...")
     
        camera.start()
        sleep(5)
        detectred.start()
        detectgreen.start()
    Le Camera.py

    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
    import cv2
    import numpy as np
    import threading
    from time import sleep
    import logging
     
    LOGGER = logging.getLogger(__name__)
     
     
    class Camera(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.end = False
            self.ret = True
            self.frame = ["", ""]
     
        def run(self):
            self.instantiate()
            while not self.end:
                # Read image
                self.ret, self.frame = self.cam.read()
                cv2.imshow('frame', self.frame)
                if cv2.waitKey(1) & 0xFF == ord('q'):
                    self.end = True
                    LOGGER.info("Clean before finish working...")
     
        def afficher(self):
            print("Resultat methode affichage")
     
        def instantiate(self):
            self.cam = cv2.VideoCapture(0)
    Le ColorGreen.py Je le renommerai en ColorDetect.py en fin de projet ( oui c'est mal )

    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
    import cv2
    import numpy as np
    import threading
    from time import sleep
    import logging
    from camera import Camera
     
    LOGGER = logging.getLogger(__name__)
     
     
    class DetectGreen(threading.Thread):
        def __init__(self,
                     hLower, uLower, vLower,
                     hUpper, uUpper, vUpper):
            self._camera = Camera()
            threading.Thread.__init__(self)
            # self._stopper = threading.Event()
            LOGGER.info("Create thread DetectGreen")
            self._hLower = hLower
            self._hUpper = hUpper
            self._uLower = uLower
            self._uUpper = uUpper
            self._vLower = vLower
            self._vUpper = vUpper
     
        def run(self):
            mask = (0, 0, 0)
            end = False
            print("lancement")
            LOGGER.info("DetectGreen Start worker...")
            while not end:
                LOGGER.info("DetectGreen Working...")
                sleep(1)
                # Read image
                # cam = cv2.VideoCapture(0)
     
                while(1):
                    if not self._camera.ret:
                        break
     
                    canvas = self._camera.frame.copy()
                    print("132")
                    hsv = cv2.cvtColor(self._camera.frame, cv2.COLOR_BGR2HSV)
                    lower = (self._hLower, self._uLower, self._vLower)  # 130,150,80
                    upper = (self._hUpper, self._uUpper, self._vUpper)  # 250,250,120
                    mask = cv2.inRange(hsv, lower, upper)
                    mask = cv2.erode(mask, None, iterations=6)
                    mask = cv2.dilate(mask, None, iterations=4)
                    cv2.imshow('frame', self.frame)
                    try:
                        # NB: using _ as the variable name for two of the outputs, as they're not used
                        _, contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
                        blob = max(contours, key=lambda el: cv2.contourArea(el))
                        M = cv2.moments(blob)
                        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
     
                        cv2.circle(canvas, center, 10, (0, 0, 255), -1)
                    except (ValueError, ZeroDivisionError):
                        pass

    L'erreur actuelle c'est que je n'arrive pas a obtenir la matrice "frame" que j'ai "overwritten", j'ai essayé de résoudre le problème en utilisant un get mais j'obtiens la même chose, je n'ai pas réussi a construire un héritage ( c'est peut-être la solution ) Toutes les idées sont les bienvenues

    Merci de votre aide.


    Edit : Petite précision, j'utilise OpenCV 3.2 ce n'est pas très important mais je préfère le préciser.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 740
    Par défaut
    Salut,

    Lorsque vous dites:
    Citation Envoyé par Howek Voir le message
    L'objectif étant de lancé 2 instances de DetectColor ( pour le rouge et le vert ), et chaque instance doit accéder à la caméra et faire une copie de la matrice de cette dernière pour pouvoir la réutiliser afin de détecter la couleur.
    vous vous interdisez "implicitement" de créer plusieurs instances de Camera (i.e. on ne veut pas voir plus d'un Camera()) dans le code.
    Sinon, camera.frame ne sera mis à jour que pour l'instance de Camera dont le thread a été démarré.
    Ce qui vous impose de passer l'instance de Camera à l'appel des DetectGreen(camera=camera,....)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    vous vous interdisez "implicitement" de créer plusieurs instances de Camera (i.e. on ne veut pas voir plus d'un Camera()) dans le code.
    Sinon, camera.frame ne sera mis à jour que pour l'instance de Camera dont le thread a été démarré.
    Ce qui vous impose de passer l'instance de Camera à l'appel des DetectGreen(camera=camera,....)
    Tout à fait, le soucis étant qu'il m'est absolument impossible de lancer Camera() 2fois. Je pense donc que l'instanciation à l'appel des DetectGreen ( ce que j'utilise actuellement ) n'est pas la bonne méthode. Car au lieu d'obtenir une matrice j'obtiens le tableau donné lors de l'initialisation de caméra ( self.frame = ["", ""] ).

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 740
    Par défaut
    Citation Envoyé par Howek Voir le message
    Tout à fait, le soucis étant qu'il m'est absolument impossible de lancer Camera() 2fois. Je pense donc que l'instanciation à l'appel des DetectGreen ( ce que j'utilise actuellement ) n'est pas la bonne méthode. Car au lieu d'obtenir une matrice j'obtiens le tableau donné lors de l'initialisation de caméra ( self.frame = ["", ""] ).
    Et ben vous passez l'instance qui a été créée... ou vous apprenez le pattern Singleton.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et ben vous passez l'instance qui a été créée... ou vous apprenez le pattern Singleton.

    - W
    Qu'entendez-vous par passez l'instance qui a été créée ? Car quand j'essaie un print(self._camera.frame) le résulatat obtenue est toujours un : ["", ""]
    Merci de votre aide

  6. #6
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Ce qu'il veut dire, c'est que tu instancies une fois ta classe Camera (je suppose dans ton main), et que ton objet, tu dois le passer en argument de toutes méthodes ou fonction en ayant besoin pour travailler.

    C'pas dur.

    Et si ça te pose problème de réussir à passer cette instance dans ton script, en profondeur dans ton application, l'option du singleton est le meilleur choix à faire.

Discussions similaires

  1. Récupération de la valeur d'une variable dans une procédure
    Par guerzan22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/06/2015, 12h26
  2. Récupérer le nom d'une colonne d'une table dans une variable
    Par mimi51340 dans le forum Général Java
    Réponses: 4
    Dernier message: 13/03/2008, 14h23
  3. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  4. Réponses: 1
    Dernier message: 15/02/2007, 00h24
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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