defrasti ArucoMarkers(vaizdas, žymeklio dydis =6, totalMarkers=250):
# Konvertuokite vaizdą į pilkus tonus
pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)

# Gaukite Aruco žodyną pagal žymeklio dydį ir bendrą žymeklį
dictionary_key = getattr (cv2.aruco, f'DICT_{markerSize}X'
f'{markerSize}_{totalMarkers}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (žodyno_raktas)

# Nustatykite Aruco detektoriaus parametrus
aruco_params = cv2.aruco. DetectorParameters()

# Aptikti Aruco žymeklius pilkų atspalvių vaizde
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (pilka, aruco_žodynas,
parametrai=aruco_params)

defsuperimposeImageOnMarkers(video_frame, aruco_markers, overlay_image,
video_width, video_height):
rėmo_aukštis, rėmo_plotis = video_frame.shape[:2]

jeigu len (aruco_markers[0]) != 0:
dėl aš, žymeklis_kampas in išvardinti (aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).astype (np.int32)

# Nubrėžkite daugiakampį aplink žymeklio kampus
cv2.polylines (video_frame, [marker_corners], Tiesa, (0, 255, 0), 2)

# Pridėkite žymeklio ID kaip tekstą viršutiniame kairiajame žymeklio kampe
cv2.putText (video_frame, str (aruco_markers[1][i]),
korta (marker_kampai[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)

# Raskite homografijos matricą, kad perdengimo vaizdas būtų priskirtas žymekliui
homografijos_matrica, _ = cv2.findHomography(
np.array([[0, 0], [vaizdo įrašo plotis, 0], [video_width, video_height],
[0, video_height]], dtype="Float32"), žymeklis_kampai)

# Iškreipkite perdangos vaizdą, kad jis būtų suderintas su žymekliu, naudojant homografinę matricą
warped_image = cv2.warpPerspective (overlay_image, homography_matrix,
(rėmo_plotis, rėmo_aukštis))

# Sukurkite kaukę, kad iškreiptą vaizdą pritaikytumėte tik žymeklio srityje
mask = np.zeros((rėmo_aukštis, rėmo_plotis), dtype="uint8")
cv2.fillConvexPoly (kaukė, marker_corners, (255, 255, 255), cv2.LINE_AA)

masked_warped_image = cv2.bitwise_and (iškreiptas_vaizdas, iškreiptas_vaizdas,
kaukė = kaukė)

# Taikykite atvirkštinę kaukę vaizdo kadrui
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
mask=cv2.bitwise_not (kaukė))

# Sujunkite užmaskuotą iškreiptą vaizdą ir užmaskuotą vaizdo kadrą
video_frame = cv2.add (masked_warped_image, masked_video_frame)

defprocesasVideoFeed(overlay_image):
# Nustatykite vaizdo įrašo sklaidos kanalo matmenis
vaizdo_aukštis = 480
video_width = 640

# Atidarykite vaizdo įrašą
video_capture = cv2.VideoCapture(0)

# Įkelkite perdangos vaizdą ir pakeiskite jo dydį
overlay_image = cv2.resize (overlay_image, (video_width, video_height))

kol video_capture.isOpened():
# Skaitykite kadrą iš vaizdo įrašo
ret, video_frame = video_capture.read()

jeigu ret:
# Vaizdo įrašo kadre raskite Aruco žymeklius
aruco_markers = rastiArucoMarkers (video_frame, totalMarkers=100)

# Uždėkite perdangos vaizdą ant žymeklių vaizdo įrašo kadre
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
overlay_image, video_width,
video_height)

# Rodyti vaizdo kadrą su perdanga
cv2.imshow(„Kameros tiekimas“, video_frame)

# Patikrinkite, ar nepaspaudžiamas klavišas „q“, kad išeitumėte iš ciklo
jeigu cv2.waitKey(1) & 0xFF == užsakymas('q'):
pertrauka