Ensuite on va filtrer les parties claires de l’image pour ne garder les parties noires, pour cela, un filtre de seuillage est appliqué:
# Color thresholding
ret,thresh = cv2.threshold(blur,60,255,cv2.THRESH_BINARY_INV)
Détection de contours
Ensuite, on va utiliser openCV pour détecter les contours:
# Find the contours of the frame
contours,hierarchy = cv2.findContours(thresh.copy(), 1, cv2.CHAIN_APPROX_NONE)
Extraction du plus gros contour
Il nous faut ensuite extraire la ligne la plus large trouvée afin d’éliminer les fausses détections:
# Find the biggest contour (if detected)iflen(contours) >0:
c =max(contours, key=cv2.contourArea)
M = cv2.moments(c)
# Skip to avoid div by zeroifint(M['m00']) ==0:
continue
Calcul du milieu de la ligne
Une fois les contours de la ligne détectée, on calcul le centre de la ligne, c’est la que l’on veut que le robot aille:
# Get the line center
cx =int(M['m10']/M['m00'])
cy =int(M['m01']/M['m00'])
Contrôle des moteurs
Une correction proportionnelle à la différence entre la position de la ligne et le milieu de l’image est calculée. Les moteurs sont ensuite commandés pour ralentir un des moteurs et accélérer l’autre, ceci afin de faire tourner le robot en direction du centre de la ligne.
Le programme de lecture et d’affichage de la carte :
import numpy as npimport mathimport matplotlib.pyplot as pltimport numpy as npimport csvliste_distance = []liste_orientation = []fichier = open("carte.csv", "r")c = 0
# lecture fichierwhile True: ligne = fichier.readline() if ligne =='': break # fin fichier # lecture de la distance (capteur distance) distance = ligne.split(';')[0] # lecture orientation orientation = ligne.split(';')[1] # correction de la distance par rapport au centre du robot et la position du capteur distance = float(distance) + 50 # conversion en radian if float(orientation) > 0: orientation = (float(orientation)*3.14)/180 liste_distance.append(float(distance)) liste_orientation.append(float(orientation)) c = c + 1
ax = plt.subplot(111, projection='polar')ax.plot(liste_orientation, liste_distance)ax.grid(True)plt.show()