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 :

Améliorer son code en utilisant OpenCV


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 2
    Par défaut Améliorer son code en utilisant OpenCV
    Bonjour à tous !

    J'aurai besoin de conseil et d'un peu d'aide s'il vous plaît, je fais de la détection d'image avec OpenCV et comme vous le savez c'est assez gourmand quand le code est mal agencé. Actuellement c'est mon cas, en effet, mon code fonctionne pour certaines parties mais pour la partie détection de cercle c'est plus compliqué. Le code ne marche que sur des ordis plus puissant que le mien (et encore pas tout le temps). Je sais qu'un des problèmes qui causent ces erreurs est l'optimisation de mon code, il y a forcément d'autres erreurs mais je l'améliorerai plus tard, j'aimerai déjà le rendre plus rapide à exécuter et à fonctionner. C'est pour cela que je me tourne vers vous, je ne suis vraiment pas bon en optimisation, et dans mon cas précis (code ci-dessous), auriez-vous des conseils ou des solutions pour améliorer cela s'il vous plaît ?

    N'hésitez pas à me poser des questions si cela n'est pas clair ?

    Voici mon 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
     
    import tkinter as tk 
    from tkinter import ttk
    from tkinter.messagebox import showinfo
    from tkinter import *
    import cv2 
    import numpy as np 
     
     
    def callbackVision(event):
        forms = ''
        forms = event.widget.get()
        cascadeClassifierPath = 'haarcascade_frontalface_alt2.xml' # Chemin du Classifier
        cascadeClassifier = cv2.CascadeClassifier(cascadeClassifierPath)
        video = cv2.VideoCapture(0) # On récupère la vidéo
        #video.set(3,600)
        #video.set(3,500)
        if forms == "Visage":
            while(True):
                _,frame = video.read() # Conversion N/B
                detectedFaces = cascadeClassifier.detectMultiScale(frame)# Détection
                for (x,y, width, height) in detectedFaces:
                    cv2.rectangle(frame, (x, y), (x+width, y+height), (0,255,0), 3) # Dessin d'un rectangle
     
                cv2.imshow("result", frame)
                if cv2.waitKey(1) == ord('q'):
                    break
        if forms == "Cercle":
            while(True):
                ret, frame = video.read()
                gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     
        	# La fonction GaussionBlur ici va permettre de réduire le bruit. Le MedianBlur va lisser le bruit pour également le réduire
                gray = cv2.GaussianBlur(gray,(5,5),0);
                gray = cv2.medianBlur(gray,5)
     
        	# AdaptativeThreshold Gaussian permet de calculer la taille de la forme de l'image 
                gray = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,3.5)
                kernel = np.ones((2,2), np.uint8)
                gray = cv2.erode(gray,kernel,iterations = 1)
            #On dilate l'image pour permettre d'identifier ensuite notre cercle en "grossissant" la forme du cercle 
                #gray = erosion
                gray = cv2.dilate(gray,kernel,iterations = 1)
            #gray = dilation
            #On identifie le centre de notre possible cercle ainsi que son diamètre 
                circles = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1 ,260, param1= 30, param2 = 65, minRadius = 0, maxRadius = 0)
     
                if circles is not None:
                    circles = np.round(circles[0,:]).astype("int")
                    for (x,y,r) in circles:
                        cv2.circle(frame, (x,y), r, (0,0,255), 4)
                        cv2.rectangle(frame, (x-5, y-5 ), (x+5, y +5), (0,128,255), -1)
                        print("Column Number: ")
                        print(x)
                        print("Row Number: ")
                        print(y)
                        print("Radius is : ")
                        print(r)
                    cv2.imshow('frame', frame)
                    if cv2.waitKey(1)==ord('q'):
                        break    
     
    video = cv2.VideoCapture(0)
    window = tk.Tk()
    text = tk.Label(window, text = 'Choisi la forme qui vous intresse : ')
    text.pack()
    onglet = ttk.Combobox(window)
    onglet['values'] = ['Cercle', 'Triangle', 'Visage']
    forms = ""
    onglet.bind("<<ComboboxSelected>>", lambda event:callbackVision(event))
    video.release()
    cv2.destroyAllWindows()
     
    #-------------------------Gestion de l'évènement-------------------------------------------------------
     
    #Cercle = 1365490862336
     
    onglet.pack()
    window.title('My Application')
    window.geometry('300x300')
     
    window.mainloop()
    video.release()
    cv2.destroyAllWindows()

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

    callbackVision est, comme son nom l'indique, un callback (appelé par tkinter).
    Dans les callback on ne met pas de while True qui attendent une entrée clavier.

    Pour ce qui est de l'optimisation dans la détection de cercles avec OpenCV, je commence toujours par m'informer de l'état de l'art (ce qu'on déjà fait les autres).
    C'est pas difficile de chercher sur Internet. S'il y a plusieurs solutions et que je ne vois pas trop laquelle appliquer, je teste sur un jeu d'essai pour voir ce qui marche le mieux.

    - 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
    Juin 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 2
    Par défaut
    Salut !

    Merci de ta réponse, en effet mais je n'ai pas trouvé d'autres moyens que celui là pour appliquer ma boucle while.

    J'ai en effet regardé sur internet mais je ne trouvais pas forcément des choses applicables dans ces conditions, pour ce qui est de l'état de l'art c'est à peu près ce que j'ai fait de base puis à partir de ça j'ai pu "construire" ma propre fonction, je n'ai pas trouvé, à ce jour, de meilleur solution. Je continue de faire des recherches sur ce sujet.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Citation Envoyé par Juprost Voir le message
    Je continue de faire des recherches sur ce sujet.
    A défaut, vous avez un forum traitement d'images dans la rubrique algorithmique.

    note: les algorithmes à appliquer dépendent aussi de l'image.

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

Discussions similaires

  1. Réponses: 25
    Dernier message: 26/06/2015, 13h12
  2. [FAQ] Retrait de l'entrée "Comment utiliser le mot-clé 'with' pour clarifier son code"
    Par SylvainPV dans le forum Contributions JavaScript / AJAX
    Réponses: 2
    Dernier message: 14/11/2013, 13h21
  3. Réponses: 0
    Dernier message: 30/03/2012, 17h26
  4. [JavaScript] [Correction] Comment utiliser le mot-clé 'with' pour clarifier son code ?
    Par Bisûnûrs dans le forum Contribuez
    Réponses: 4
    Dernier message: 08/04/2010, 17h48

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