Problème code robot

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

C’est assez dur à dire, le message d’erreur semble pointer vers

def camera_forme_image(frame, sf_trigger_etoile, sf_trigger_carre, sf_trigger_rectangle, sf_trigger_triangle):

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

Vérifie que la conversion se fait bien ou qu’il n’y pas de problème par rapport au dimensionnement de l’image ou la détection des formes.

La fonction cvtColor n’a pas l’air de lui plaire, peut-être un problème de déclaration ?