defhitta ArucoMarkers(bild, markörStorlek=6, totalMarkers=250):
# Konvertera bilden till gråskala
grå = cv2.cvtColor (bild, cv2.COLOR_BGR2GRAY)

# Skaffa Aruco-ordboken baserad på markörstorleken och totalt antal markörer
dictionary_key = getattr (cv2.aruco, f'DICT_{markerSize}X'
f'{markerSize}_{totalMarkers}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (dictionary_key)

# Ställ in Aruco-detektorparametrarna
aruco_params = cv2.aruco. Detektorparametrar()

# Upptäck Aruco-markörer i gråskalebilden
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (grå, aruco_dictionary,
parameters=aruco_params)

defsuperimposeImageOnMarkers(video_frame, aruco_markers, overlay_image,
video_width, video_height):
frame_height, frame_width = video_frame.shape[:2]

om len (aruco_markers[0]) != 0:
för i, marker_corner i räkna upp (aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).astype (np.int32)

# Rita en polygon runt markörens hörn
cv2.polylines (video_frame, [marker_corners], Sann, (0, 255, 0), 2)

instagram viewer

# Lägg till markör-ID som text i det övre vänstra hörnet av markören
cv2.putText (video_frame, str (aruco_markers[1][i]),
tupel (markörhörn[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)

# Hitta homografimatrisen för att mappa överläggsbilden på markören
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [video_width, 0], [video_width, video_height],
[0, video_height]], dtype="float32"), markörhörn)

# Förvräng överläggsbilden för att passa in med markören med hjälp av homografimatris
warped_image = cv2.warpPerspective (overlay_image, homography_matrix,
(frame_width, frame_height))

# Skapa en mask för att applicera den skeva bilden endast på markörområdet
mask = np.zeros((frame_height, frame_width), dtype="uint8")
cv2.fillConvexPoly (mask, marker_corners, (255, 255, 255), cv2.LINE_AA)

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

# Applicera den omvända masken på videoramen
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
mask=cv2.bitwise_not (mask))

# Kombinera den maskerade skeva bilden och den maskerade videoramen
video_frame = cv2.add (masked_warped_image, masked_video_frame)

defprocessVideoFeed(overlay_image):
# Ställ in måtten på videoflödet
video_höjd = 480
video_width = 640

# Öppna videoinspelningen
video_capture = cv2.VideoCapture(0)

# Ladda och ändra storlek på överlagringsbilden
overlay_image = cv2.resize (overlay_image, (video_width, video_height))

medan video_capture.isOpened():
# Läs en ram från videoinspelningen
ret, video_frame = video_capture.read()

om röta:
# Hitta Aruco-markörer i videoramen
aruco_markers = findArucoMarkers (video_frame, totalMarkers=100)

# Lägg överläggsbilden på markörerna i videoramen
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
overlay_image, video_width,
video_height)

# Visa videoramen med överlägg
cv2.imshow("Kameraflöde", video_frame)

# Kontrollera om du trycker på 'q'-tangenten för att lämna slingan
om cv2.waitKey(1) & 0xFF == ord('q'):
ha sönder