Commit 3ae5aa43 authored by Roux Antoine's avatar Roux Antoine
Browse files

script_final.py fait l'apprentissage sur une bonne photo

parent 8262177e
......@@ -8,13 +8,14 @@ import numpy as np
start_radius = 35
start_radius = 30
step_radius = 3
number_of_radius_tested = 8
number_of_radius_tested = 20
def circle_finder(mat_cont, number_of_circles_to_find):
""" fonction qui trouve le cercle en testant différents rayons possibles
retourne les coordonnees du centre et le rayon de tous les cercles trouvés"""
retourne les coordonnees du centre et le rayon de tous les cercles trouvés
sous la forme : [x, y, rayon] """
length = len(mat_cont[1])
height = len(mat_cont)
mat_centre = np.zeros((number_of_radius_tested, height,length))
......@@ -31,7 +32,7 @@ def circle_finder(mat_cont, number_of_circles_to_find):
while (teta < 2*np.pi): #parcourt du paramètre teta de 0 à 2*pi
if(0 <= i+R*np.cos(teta) and i+R*np.cos(teta) < height and 0 <= j+R*np.sin(teta) and j+R*np.sin(teta) < length): #on vérifie qu'on est dans la matrice
if(0 <= i+R*np.cos(teta) and i+R*np.cos(teta) < height and 0 <= j+R*np.sin(teta) and j+R*np.sin(teta) < length and i != 0 and j != 0): #on vérifie qu'on est dans la matrice
#if(int(R*np.cos(teta))!= int(R*np.cos(teta)) or int(R*np.sin(teta))!= int(R*np.sin(teta-180/np.pi))): #on s'assure de ne pas incrémenter deux fois le même "centre"
mat_centre[r,i+int(R*np.cos(teta)),j+int(R*np.sin(teta))] += 1
......@@ -58,7 +59,7 @@ def circle_finder(mat_cont, number_of_circles_to_find):
vect_of_centers[2,k,i] = max_value_so_far
#on enleve maintenant le max qu'on vient de traiter
mat_centre[k, x_max-15:x_max+15, y_max-15:y_max+15] = 0
mat_centre[k, x_max-20:x_max+20, y_max-20:y_max+20] = 0
final_circles = np.zeros((3, number_of_circles_to_find))
......@@ -66,12 +67,12 @@ def circle_finder(mat_cont, number_of_circles_to_find):
k_ieme_circle = vect_of_centers[:,:,k]
index_of_max_value_found = np.argmax(k_ieme_circle[2,:])
x_center = int(vect_of_centers[0, index_of_max_value_found, k])
y_center = int(vect_of_centers[1, index_of_max_value_found, k])
y_center = int(vect_of_centers[0, index_of_max_value_found, k])
x_center = int(vect_of_centers[1, index_of_max_value_found, k])
radius = int(start_radius + step_radius * index_of_max_value_found)
final_circles[0, k] = y_center
final_circles[1, k] = x_center #attention, pour une raison inconnus, il faut les inverser à cet endroit là
final_circles[0, k] = x_center
final_circles[1, k] = y_center #attention, pour une raison inconnus, il faut les inverser à cet endroit là
final_circles[2, k] = radius
return final_circles
......
......@@ -21,12 +21,18 @@ black = 0
grey = 150
white = 255
images_names = ["unknown_0.JPG"]
#images_names = ["unknown_0.JPG", "unknown_1","unknown_2", "unknown_3","unknown_4"]
number_of_coins_to_identify = len(images_names)
""" Phase d'apprentissage : on apprend à reconnaitre les différentes pièces en fonction de leurs diamètres relatifs """
img = cv2.imread('1_euro_double.JPG', 0) #image noir et blanc de la pièce
img = cv2.imread('4_coins_moi.JPG', 0) #image noir et blanc de la pièce
img_resized = ir.image_resizer(img,0.1)
#img = cv2.imread('1_euro_double.JPG', 0) #image noir et blanc de la pièce
#img_resized = ir.image_resizer(img,0.1)
img_blurred = flt.blur_image(img_resized,13)
#on créé la matrice du gradient
......@@ -36,8 +42,6 @@ mat_grad = grd.force_grad(img_blurred)
length = len(img_blurred[1])
height = len(img_blurred)
#Détermination de la matrice des contours
print("Détermination de la matrice des contours")
......@@ -61,9 +65,14 @@ mat_cont = gpe.grey_pixel_eliminator(mat_cont, white, grey, black)
print("Affinage du trait")
mat_cont = lwr.line_width_reducer(mat_grad, mat_cont, img)
cv2.imshow('mat_cont', mat_cont)
cv2.waitKey(0)
cv2.destroyAllWindows()
#Recherche des cercle
print("Recherche des cercles")
number_of_circles_to_find = 2
number_of_circles_to_find = 4
final_circles = cf.circle_finder(mat_cont, number_of_circles_to_find)
#on les trie par ordre decroisant de TAILLE
......@@ -81,7 +90,8 @@ for k in range (number_of_circles_to_find) :
final_circles[2, indice_of_max_so_far] = 0 #sert a enlver le max de la liste
list_of_labels = ["2 euros", "50 cents", "1 euro", "20 cents", "10 cents"]
#list_of_labels = ["2 euros", "50 cents", "1 euro", "20 cents", "10 cents"]
list_of_labels = ["50 cents", "1 euro", "20 cents", "10 cents"]
for k in range (number_of_circles_to_find) :
x_center = int(sorted_x[k])
......@@ -93,6 +103,7 @@ for k in range (number_of_circles_to_find) :
cv2.imshow('img_resized with coins', img_resized)
cv2.imwrite('Resultat_apprentissage_11.png', img_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()
......@@ -100,9 +111,67 @@ cv2.destroyAllWindows()
""" Maintenant on reconnait des pieces """
for k in range (number_of_coins_to_identify) :
img = cv2.imread(images_names[k], 0) #image noir et blanc de la pièce inconnue
img_resized = ir.image_resizer(img,0.1)
img_blurred = flt.blur_image(img_resized,13)
#on créé la matrice du gradient
mat_grad = grd.force_grad(img_blurred)
#on calcule les dimensions de l'image
length = len(img_blurred[1])
height = len(img_blurred)
#Détermination de la matrice des contours
print("Détermination de la matrice des contours")
mat_cont = np.zeros((height,length))
for i in range (1, height):
for j in range (1, length):
if (mat_grad[i,j]<seuil_bas):
mat_cont [i,j] = white
elif (mat_grad[i,j]>seuil_haut):
mat_cont [i,j] = black
else :
mat_cont [i,j] = grey
#Elimination des pixels grisés
print("Elimination des pixels grisés")
mat_cont = gpe.grey_pixel_eliminator(mat_cont, white, grey, black)
#Affinage du trait
print("Affinage du trait")
mat_cont = lwr.line_width_reducer(mat_grad, mat_cont, img)
#Recherche des cercle
print("Recherche des cercles")
number_of_circles_to_find = 1
final_circles = cf.circle_finder(mat_cont, number_of_circles_to_find)
#on détermine sa valeur en regardant de quel rayon existant elle est le plus proche
x_center = final_circles[0]
y_center = final_circles[1]
radius = final_circles[2]
radius_differences = np.zeros(5)
for k in range (len(list_of_labels)) :
radius_differences[k] = (radius - sorted_radius[k])**2
label_of_coin = list_of_labels[np.argmin(radius_differences)]
cv2.circle(img_resized, (x_center, y_center), radius, (255,0,0))
cv2.putText(img_resized, label_of_coin, (x_center, y_center), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0))
cv2.imshow('identified coin', img_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment