deffindArucoMarkers(immagine, markerSize=6, totalMarkers=250):
# Converti l'immagine in scala di grigi
grigio = cv2.cvtColor (immagine, cv2.COLOR_BGR2GRAY)

# Ottieni il dizionario Aruco in base alla dimensione del marcatore e ai marcatori totali
dictionary_key = getattr (cv2.aruco, f'DICT_{markerSize}X'
F'{markerSize}_{totalMarkers}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (dictionary_key)

# Impostare i parametri del rivelatore Aruco
aruco_params = cv2.aruco. DetectorParameters()

# Rileva i marcatori Aruco nell'immagine in scala di grigi
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (gray, aruco_dictionary,
parametri=aruco_params)

defsovrapporreImmagineSuMarcatori(video_frame, aruco_markers, overlay_image,
larghezza_video, altezza_video):
frame_height, frame_width = video_frame.shape[:2]

Se len (aruco_markers[0]) != 0:
per io, marker_corner In enumerare (aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).astype (np.int32)

# Disegna un poligono intorno agli angoli del marcatore
cv2.polylines (video_frame, [marker_corners], VERO, (0, 255, 0), 2)

# Aggiungi l'ID marcatore come testo nell'angolo in alto a sinistra del marcatore
cv2.putText (video_frame, str (aruco_markers[1][io]),
tupla (marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)

# Trova la matrice di omografia per mappare l'immagine di sovrapposizione sul marcatore
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [larghezza_video, 0], [larghezza_video, altezza_video],
[0, altezza_video]], dtype="galleggia32"), marker_corners)

# Deforma l'immagine di sovrapposizione per allinearla con il marcatore usando la matrice di omografia
warped_image = cv2.warpPerspective (overlay_image, homography_matrix,
(larghezza_telaio, altezza_telaio))

# Crea una maschera per applicare l'immagine deformata solo sull'area del marker
mask = np.zeros((frame_height, frame_width), dtype="uint8")
cv2.fillConvexPoly (maschera, marker_corners, (255, 255, 255), cv2.LINE_AA)

masked_warped_image = cv2.bitwise_and (warped_image, warped_image,
maschera=maschera)

# Applica la maschera inversa al fotogramma video
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
mask=cv2.bitwise_not (maschera))

# Combina l'immagine deformata mascherata e il fotogramma video mascherato
video_frame = cv2.add (masked_warped_image, masked_video_frame)

defprocessVideoFeed(overlay_image):
# Imposta le dimensioni del feed video
altezza_video = 480
larghezza_video = 640

# Apri l'acquisizione video
video_capture = cv2.VideoCapture(0)

# Carica e ridimensiona l'immagine di sovrapposizione
overlay_image = cv2.resize (overlay_image, (video_width, video_height))

Mentre video_capture.isOpened():
# Leggi un fotogramma dall'acquisizione video
ret, video_frame = video_capture.read()

Se re:
# Trova i marcatori Aruco nel fotogramma video
aruco_markers = findArucoMarkers (video_frame, totalMarkers=100)

# Sovrapponi l'immagine sovrapposta ai marcatori nel fotogramma video
video_frame = sovrapposizioneImageOnMarkers (video_frame, aruco_markers,
immagine_overlay, larghezza_video,
altezza_video)

# Visualizza il fotogramma video con sovrapposizione
cv2.imshow("Feed della fotocamera", frame_video)

# Verifica la pressione del tasto 'q' per uscire dal ciclo
Se cv2.waitKey(1) & 0xFF == ord('Q'):
rottura