pokznajdźArucoMarkers(obraz, rozmiar znacznika =6, suma znaczników=250):
# 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)

poknałóż obraz na znaczniki(klatka_wideo, znaczniki_aruco, obraz_nakładki,
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)

instagram viewer

# 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)

pokprzetwarzać kanał wideo(obraz_nakładki):
# 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