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 :

Détecter un feux tricolore


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 19
    Par défaut Détecter un feux tricolore
    Bonjour,

    Dans le cadre d'un projet de fin d'année, je dois réaliser une voiture miniature autonome. Cela fait plusieurs jours que je bloque sur la détection de feux tricolores. Suivant la luminosité ambiante, les valeurs HSV de mon feux tricolore changent. J'aimerais donc savoir si il est possible de faire en sorte que peu importe l'endroit ou l'on se situe, les valeurs HSV restent fixes. Mon deuxième problème est que je n'arrive pas à détecter seulement mon feux.

    Voici le 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
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    import numpy as np
    import cv2
    def nothing (x):
       pass
     
     
    cap = cv2.VideoCapture(0)
    cv2.namedWindow("Trackbars")
     
     
    cap.set(3,320)
    cap.set(4,240)
    #print (cap.get(5))
     
     
    cv2.createTrackbar("L - H","Trackbars",0,255,nothing)
    cv2.createTrackbar("L - S","Trackbars",0,255,nothing)
    cv2.createTrackbar("L - V","Trackbars",0,255,nothing)
    cv2.createTrackbar("U - H","Trackbars",0,255,nothing)
    cv2.createTrackbar("U - S","Trackbars",0,255,nothing)
    cv2.createTrackbar("U - V","Trackbars",0,255,nothing)
     
    while True:
     
     
        _, frame = cap.read()
     
        blurred = cv2.GaussianBlur(frame, (11, 11), 0)
        hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)
     
     
        l_h = cv2.getTrackbarPos("L - H","Trackbars")          
        l_s = cv2.getTrackbarPos("L - S","Trackbars")          
        l_v = cv2.getTrackbarPos("L - V","Trackbars")         
        u_h = cv2.getTrackbarPos("U - H","Trackbars")         
        u_s = cv2.getTrackbarPos("U - S","Trackbars")          
        u_v = cv2.getTrackbarPos("U - V","Trackbars")
     
     
     
        lower = {'red':(1, 220, 163), 'yellow':(l_h, l_s, l_v), 'green':(l_h, l_s, l_v)} #assign new item
        upper = {'red':(60, 255, 255), 'yellow':(u_h,u_s,u_v), 'green':(u_h,u_s,u_v)}
     
        # define standard colors for circle around the object
        colors = {'red':(0,0,255), 'yellow':(0, 255, 217), 'green':(0,255,0)}
     
        #for each color in dictionary check object in frame
        for key, value in upper.items():
            # construct a mask for the color from dictionary`1, then perform
            # a series of dilations and erosions to remove any small
            # blobs left in the mask
            kernel = np.ones((9,9),np.uint8)
            mask = cv2.inRange(hsv, lower[key], upper[key])
            mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
            mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
     
            # find contours in the mask and initialize the current
            # (x, y) center of the ball
            cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]
            center = None
     
            # only proceed if at least one contour was found
            #print(len(cnts))
            if len(cnts) > 0:
                # find the largest contour in the mask, then use
                # it to compute the minimum enclosing circle and
                # centroid
                c = max(cnts, key=cv2.contourArea)
                ((x, y), radius) = cv2.minEnclosingCircle(c)
                M = cv2.moments(c)
                cX = int(M["m10"] / M["m00"])
                cY = int(M["m01"] / M["m00"])
     
                # only proceed if the radius meets a minimum size. Correct this value for your object's size
                #print radius     
                if (radius > 0.5):
                    # draw the circle and centroid on the frame,
                    # then update the list of tracked points
                    cv2.circle(frame, (int(x), int(y)), int(radius), colors[key], 2)
                    cv2.putText(frame,key + " light", (cX+40, cY), cv2.FONT_HERSHEY_SIMPLEX, 0.6,colors[key],2)
     
     
        # show the frame to our screen
        cv2.imshow("Frame", frame)
        cv2.imshow("Mask", mask)
     
        key = cv2.waitKey(1) & 0xFF
        # if the 'q' key is pressed, stop the loop
        if key == ord("q"):
            break
     
    # cleanup the camera and close any open windows
    camera.release()
    cv2.destroyAllWindows()
    Images attachées Images attachées   

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par Quent91 Voir le message
    Cela fait plusieurs jours que je bloque sur la détection de feux tricolores. Suivant la luminosité ambiante, les valeurs HSV de mon feux tricolore changent.
    Comment font les daltoniens? Ils voient les feux (au sens 3 disques superposés) et si le feu en haut est "brillant", c'est rouge.
    Mais c'est plus un sujet d'algorithme que de programmation Python... le bon forum est dans cette rubrique.

    Bon courage,

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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 19
    Par défaut
    Bonjour wiztricks,

    Merci de ta réponse, je me suis donc dirigé dans cette direction mais je rencontre des problèmes. Avec la fonction cv2.HoughCircles() j'ai réussi à obtenir les coordonnées en y de mes 3 feux et j'ai cherché le max de ces valeurs pour savoir ou est le feux rouge par rapport au jaune et au vert. J'arrive ensuite à voir les LED allumées dans une fenêtre gray_treshed grâce à un seuil que je fixe mais je n'arrive pas à les détecter.

    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
     
    import cv2
    import numpy as np
     
    def nothing(x):
        pass
     
    cap = cv2.VideoCapture(0)
    cv2.namedWindow('Treshed')
     
    cap.set(3,320)
    cap.set(4,240)
     
    # create trackbars for treshold change
    cv2.createTrackbar('Treshold','Treshed',0,255,nothing)
     
    while(1):
     
        _, frame = cap.read()
     
        # Convert to gray
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     
        r = cv2.getTrackbarPos('Treshold','Treshed')
     
        ret,gray_treshed = cv2.treshold(gray,r,255,cv2.THRESH_BINARY)
        # detect circles in the image
        circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1, 30, param1=50, param2=42, minRadius=18, maxRadius=48)
        # ensure at least some circles were found
        if circles is not None:
            # convert the (x, y) coordinates and radius of the circles to integers
    	circles = np.round(circles[0, :]).astype("int")
    	for (x, y, r) in circles:
    	    if(len(circles) == 3):
                    #print("cercle 1 :",circles[0][1], "cercle 2 :",circles[1][1], "cercle 3 :",circles[2][1]) coordonnees y de chaque cercle
                    l = [circles[0][1], circles[1][1], circles[2][1]]
                    vert = max (l)    # en, python le y est vers le bas
     
                    l.remove (vert)
                    jaune = max (l)
     
                    l.remove (jaune)
                    rouge = max (l)
     
                    cv2.circle(frame, (x, rouge), r, (0, 0, 255), 2)
                    cv2.circle(frame, (x, jaune), r, (0, 255, 217), 2)
                    cv2.circle(frame, (x, vert), r, (0, 255, 0), 2)
     
        cv2.imshow('frame', frame)
        cv2.imshow('gray_treshed',gray_treshed)
     
        k = cv2.waitKey(1) & 0xFF
        if k == 27:
            break
     
    # close all open windows
    cv2.destroyAllWindows()
    J'espère que quelqu'un pourra m'aider.
    Images attachées Images attachées  

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par Quent91 Voir le message
    J'arrive ensuite à voir les LED allumées dans une fenêtre gray_treshed grâce à un seuil que je fixe mais je n'arrive pas à les détecter.
    C'est déjà mieux.

    Citation Envoyé par Quent91 Voir le message
    J'espère que quelqu'un pourra m'aider.
    Il faut un algorithme ou une heuristique avant de coder quoi que ce soit.
    Un peu de recherche sur Internet vous donnerait des idées (le forum Algorithmique sans doute aussi).
    Tout çà pour dire de demander de l'aide est une chose, la demander dans le bon forum, c'est mieux.

    - 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 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut
    Salut wiztricks,

    Pourquoi lui demander de changer de forum alors que son code est en python ?
    De plus vous parlez d'algorithme.
    Pourquoi?

    Salut Quent91,
    Vous faites du traitement d'image en python en gros si j'ai compris vous récupérez une image/ou une vidéo.
    Vous l'avez converti en gray puis vous encerclez les 3 couleurs du feux donc vous détectez les 3 couleurs mais je pense que la détection de l’éclairage de la LED ne fonctionne pas. avez vous essayé de modifier le niveau de seuil pour pouvoir détecter quand le feux s'allume.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par KleinBagel Voir le message
    Pourquoi lui demander de changer de forum alors que son code est en python ?
    De plus vous parlez d'algorithme.
    Pourquoi?
    Parce que si on ne sait pas quoi coder (i.e. l'algo. ou l'heuristique), on ne saura pas le coder avec Python (ni avec un autre langage).
    L'algo ou l'heuristique à utiliser est donc d'un autre niveau (et demande d'autres compétences) que simplement coder avec Python.
    C'est pour cela que sur le site de développez vous avez différentes rubriques: traitement d'images, base de données, réseau,... (et pas que programmation)
    Et les compétences dans ces domaines là n'iront pas particulièrement lire les questions de traitement d'images dans un forum de programmation.
    De plus, si la réponse à ce genre de question peut intéresser tout programmeur qui sera confronté à ce sujet, dommage de n'en faire profiter que les programmeurs Python.

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

Discussions similaires

  1. projet feux tricolores
    Par bajoi11 dans le forum C
    Réponses: 3
    Dernier message: 22/03/2012, 15h38
  2. Gestion de feux tricolores avec un PIC 16F877A
    Par mdh12 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/05/2010, 11h48
  3. régulation des feux tricolores de circulation
    Par azramiya dans le forum Automation
    Réponses: 0
    Dernier message: 13/04/2010, 19h38
  4. commande de feux tricolores de carrefours sous labview
    Par aloumds dans le forum LabVIEW
    Réponses: 1
    Dernier message: 07/12/2009, 17h31

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