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()