Bonjour, pour un projet d’école je dois coder sur raspberry en python pour un robot qui ressemble à ça :
J’ai déjà un suivi de ligne ect mais je dois implementer du nouveau pour controler la caméra, lorsque je test mon code j’ai des messages d’erreur super tot au début du code :
Voici mon code :
import RPi.GPIO as GPIO
import time
import GUImove as move
import servo
import LED
import cv2
import numpy as np
def camera_stream(sf_trigger_etoile, sf_trigger_carre, sf_trigger_rectangle, sf_trigger_triangle, var_boucle):
# Ouvrir la capture vidéo
cap = cv2.VideoCapture(1)
while var_boucle:
# Lire une image depuis la caméra
ret, frame = cap.read()
# Appeler la fonction pour le traitement d'image et la détection de formes
camera_forme_image(frame, sf_trigger_etoile, sf_trigger_carre, sf_trigger_rectangle, sf_trigger_triangle)
# Attendre 1 milliseconde et vérifier si la touche 'q' est enfoncée pour quitter la boucle
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Libérer la capture vidéo et fermer la fenêtre
cap.release()
cv2.destroyAllWindows()
def camera_forme_image(frame, sf_trigger_etoile, sf_trigger_carre, sf_trigger_rectangle, sf_trigger_triangle):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
filtre_bas_rouge = np.array([0, 100, 100])
filtre_haut_rouge = np.array([10, 255, 255])
filtre_haut_rouge2 = np.array([170, 255, 255])
filtre_bas_jaune = np.array([20, 100, 100])
filtre_haut_jaune = np.array([40, 255, 255])
filtre_bas_vert = np.array([40, 100, 100])
filtre_haut_vert = np.array([80, 255, 255])
masque_rouge1 = cv2.inRange(hsv, filtre_bas_rouge, filtre_haut_rouge)
masque_rouge2 = cv2.inRange(hsv, filtre_bas_rouge, filtre_haut_rouge2)
masque_rouge3 = cv2.bitwise_or(masque_rouge1, masque_rouge2)
masque_jaune = cv2.inRange(hsv, filtre_bas_jaune, filtre_haut_jaune)
masque_vert = cv2.inRange(hsv, filtre_bas_vert, filtre_haut_vert)
masque_combine = cv2.bitwise_or(masque_rouge3, cv2.bitwise_or(masque_jaune, masque_vert))
resultat = cv2.bitwise_and(frame, frame, mask=masque_combine)
cv2.imshow('Camera Stream', resultat)
image_gray = cv2.cvtColor(resultat, cv2.COLOR_BGR2GRAY)
image_gray = cv2.Canny(image_gray, 50, 300)
image_blur = cv2.blur(image_gray, (5, 5))
ret, thresh = cv2.threshold(image_blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Parcourir tous les contours trouvés
for cnt in contours:
# Obtenez les coordonnées du premier point du contour
x1, y1 = cnt[0][0]
# Approximation du contour
approx = cv2.approxPolyDP(cnt, 0.01 * (cv2.arcLength(cnt, True) + 200), True)
# Calculer l'aire du contour
area = cv2.contourArea(cnt)
seuil_de_taille_min = 300
seuil_de_taille_triangle = seuil_de_taille_min
# Ignorer les contours trop petits
if area < seuil_de_taille_min:
continue
# Dessiner le contour sur l'image originale
cv2.drawContours(frame, [cnt], 0, (0, 255, 0), 2)
# Traitement des rectangles et carrés
if len(approx) == 4 and area > seuil_de_taille_min:
x, y, w, h = cv2.boundingRect(cnt)
ratio = float(w) / h
if 0.9 <= ratio <= 1.1:
cv2.putText(frame, 'Carre', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 1)
sf_trigger_carre = 1
else:
rect = cv2.minAreaRect(cnt)
angles = rect[-1]
if 85 < angles < 95:
cv2.putText(frame, 'Rectangle', (x1 - 50, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 1)
sf_trigger_rectangle = 1
# Traitement des étoiles
if len(approx) == 10 and area > seuil_de_taille_min:
is_star = False
for i in range(10):
angle = np.abs(np.degrees(
np.arctan2(approx[(i + 1) % 10][0][1] - approx[i][0][1],
approx[(i + 1) % 10][0][0] - approx[i][0][0])))
if angle > 80:
is_star = True
break
if is_star:
cv2.putText(frame, 'Etoile', (x1 - 50, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 1)
sf_trigger_etoile = 1
# Traitement des triangles
if len(approx) == 3 and area > seuil_de_taille_triangle:
cv2.putText(frame, 'Triangle', (x1 - 50, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 1)
sf_trigger_triangle = 1
# Appliquer le masque à l'image résultante
roi = cv2.bitwise_and(resultat, resultat, thresh)
# Calculer la moyenne de couleur uniquement dans la région d'intérêt
average_color = cv2.mean(roi)
# Déterminez la couleur dominante en fonction de la moyenne des valeurs HSV
h, s, v = average_color[:3]
if 0 <= h <= 10 or 160 <= h <= 180:
color_name = "Rouge"
elif 20 <= h <= 40:
color_name = "Jaune"
elif 40 <= h <= 80:
color_name = "Vert"
else:
color_name = "Autre"
#print(h,s,v)
print(f"La forme est de couleur {color_name}")
# Afficher l'image résultante
cv2.imshow('Resultat', frame)
return sf_trigger_triangle, sf_trigger_etoile, sf_trigger_carre, sf_trigger_rectangle
line_pin_right = 19
line_pin_middle = 16
line_pin_left = 20
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(line_pin_right,GPIO.IN)
GPIO.setup(line_pin_middle,GPIO.IN)
GPIO.setup(line_pin_left,GPIO.IN)
#motor.setup()
led = LED.LED()
turn_status = 0
speed = 60
angle_rate = 0.4
color_select = 1 # 0 --> white line / 1 --> black line
check_true_out = 0
backing = 0
last_turn = 0
def run():
global turn_status, speed, angle_rate, color_select, led, check_true_out, backing, last_turn
status_right = GPIO.input(line_pin_right)
status_middle = GPIO.input(line_pin_middle)
status_left = GPIO.input(line_pin_left)
#print('R%d M%d L%d'%(status_right,status_middle,status_left))
if status_right == color_select and status_left == color_select and status_middle == color_select :
sf_trigger_etoile, sf_trigger_carre, sf_trigger_rectangle, sf_trigger_triangle = 0, 0, 0, 0
var_boucle = 1
camera_stream(sf_trigger_etoile, sf_trigger_carre, sf_trigger_rectangle, sf_trigger_triangle, var_boucle)
if status_right == color_select:
check_true_out = 0
backing = 0
print('left')
led.colorWipe(0,255,0)
turn_status = -1
last_turn = -1
servo.turnLeft(angle_rate)
move.move(speed, 'forward')
elif status_left == color_select:
check_true_out = 0
backing = 0
print('right')
turn_status = 1
last_turn = 1
led.colorWipe(0,0,255)
servo.turnRight(angle_rate)
move.move(speed, 'forward')
elif status_middle == color_select:
check_true_out = 0
backing = 0
print('middle')
led.colorWipe(255,255,255)
turn_status = 0
servo.turnMiddle()
move.move(speed, 'forward')
# time.sleep(0.2)
else:
print('none')
led.colorWipe(255,0,0)
if not backing == 1:
if check_true_out == 1:
check_true_out = 0
if turn_status == 0:
if last_turn == 1:
servo.turnRight(angle_rate)
else:
servo.turnLeft(angle_rate)
move.move(speed, 'backward')
time.sleep(0.3)
elif turn_status == 1:
time.sleep(0.3)
servo.turnLeft(angle_rate)
else:
time.sleep(0.3)
servo.turnRight(angle_rate)
move.move(speed, 'backward')
backing = 1
# time.sleep(0.2)
else:
time.sleep(0.1)
check_true_out = 1
if __name__ == '__main__':
try:
setup()
move.setup()
while 1:
run()
pass
except KeyboardInterrupt:
move.destroy()
Merci de l’aide si vous prenez le temps de répondre