# Konwertuj obraz na skalę szarości
szary = cv2.cvtColor (obraz, cv2.COLOR_BGR2GRAY)
# Pobierz słownik Aruco na podstawie rozmiaru znacznika i całkowitej liczby znaczników
klucz_słownika = getattr (cv2.aruco, f'DICT_{rozmiar znacznika}X'
F'{rozmiar znacznika}_{całkowita liczba znaczników}')
aruco_dictionary = cv2.aruco.getPredefinedDictionary (klucz_słownika)
# Ustaw parametry detektora Aruco
aruco_params = cv2.aruco. DetectorParameters()
# Wykryj znaczniki Aruco na obrazie w skali szarości
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (szary, aruco_dictionary,
parametry=parametry_aruco)
szerokość_wideo, wysokość_wideo):
wysokość_klatki, szerokość_klatki = klatka_wideo.kształt[:2]
Jeśli len (aruco_markers[0]) != 0:
Do i, znacznik_narożnik W wyliczyć (aruco_markers[0]):
narożniki_znacznika = narożnik_znacznika.zmiana kształtu((4, 2)).astype (np.int32)
# Narysuj wielokąt wokół rogów znaczników
cv2.polilinie (klatka_wideo, [narożniki_znaczników], PRAWDA, (0, 255, 0), 2)
# Dodaj identyfikator znacznika jako tekst w lewym górnym rogu znacznika
cv2.putText (klatka_wideo, str (aruco_markers[1][I]),
krotka (marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)
# Znajdź macierz homograficzną, aby odwzorować obraz nakładki na znacznik
homography_matrix, _ = cv2.findHomography(
np.tablica([[0, 0], [szerokość_wideo, 0], [szerokość_wideo, wysokość_wideo],
[0, wysokość_wideo]], dtype=„pływak32”), narożniki_znaczników)
# Wypacz obraz nakładki, aby wyrównać go ze znacznikiem za pomocą macierzy homografii
obraz_warped = cv2.warpPerspective (obraz_nakładki, macierz_homografii,
(szerokość_ramki, wysokość_ramki))
# Utwórz maskę, aby zastosować wypaczony obraz tylko na obszarze znacznika
maska = np.zeros((wysokość_ramki, szerokość_ramki), dtype="uint8")
cv2.fillConvexPoly (maska, marker_corners, (255, 255, 255), cv2.LINE_AA)
masked_warped_image = cv2.bitwise_and (warped_image, warped_image,
maska=maska)
# Zastosuj odwróconą maskę do klatki wideo
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
maska=cv2.bitwise_not (maska))
# Połącz zamaskowany wypaczony obraz i zamaskowaną klatkę wideo
video_frame = cv2.add (masked_warped_image, masked_video_frame)
# Ustaw wymiary kanału wideo
wysokość_wideo = 480
szerokość_wideo = 640
# Otwórz przechwytywanie wideo
przechwytywanie_wideo = cv2.Przechwytywanie wideo(0)
# Załaduj i zmień rozmiar obrazu nakładki
obraz_nakładki = cv2.resize (obraz_nakładki, (szerokość_wideo, wysokość_wideo))
chwila video_capture.isOpened():
# Przeczytaj klatkę z przechwytywania wideo
ret, klatka_wideo = przechwytywanie_wideo.odczyt()
Jeśli gnić:
# Znajdź znaczniki Aruco w klatce wideo
aruco_markers = znajdźArucoMarkers (klatka_wideo, totalMarkers=100)
# Nałóż obraz nakładki na znaczniki w klatce wideo
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
obraz_nakładki, szerokość_wideo,
wysokość_wideo)
# Wyświetl klatkę wideo z nakładką
cv2.imshow(„Przekaz z kamery”, klatka_wideo)
# Sprawdź, czy naciśnij klawisz „q”, aby wyjść z pętli
Jeśli cv2.waitKey(1) & 0xFF == rząd ('Q'):
przerwa