deffindArucoMarkers(gambar, ukuran penanda=6, totalMarker=250):
# Ubah gambar menjadi skala abu-abu
abu-abu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)

# Dapatkan kamus Aruco berdasarkan ukuran penanda dan total penanda
kunci_kamus = getattr (cv2.aruco, f'DICT_{markerSize}X'
F'{markerSize}_{totalMarker}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (kunci_kamus)

# Atur parameter detektor Aruco
aruco_params = cv2.aruco. DetektorParameter()

# Mendeteksi penanda Aruco pada gambar skala abu-abu
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (abu-abu, kamus_aruco,
parameter=aruco_params)

defmenempatkan ImageOnMarkers(video_frame, aruco_markers, overlay_image,
lebar_video, tinggi_video):
tinggi_bingkai, lebar_bingkai = video_frame.bentuk[:2]

jika len (aruco_markers[0]) != 0:
untuk saya, marker_corner di dalam menghitung (aruco_markers[0]):
marker_corners = marker_corner.membentuk ulang((4, 2)).astipe (np.int32)

# Gambar poligon di sekitar sudut penanda
cv2.polylines (video_frame, [marker_corners], BENAR, (0, 255, 0), 2)

instagram viewer

# Tambahkan ID penanda sebagai teks di sudut kiri atas penanda
cv2.putText (video_frame, str (aruco_markers[1][Saya]),
tupel (marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)

# Temukan matriks homografi untuk memetakan gambar overlay ke marker
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [lebar_video, 0], [lebar_video, tinggi_video],
[0, video_height]], dtype="float32"), marker_corners)

# Warp gambar overlay agar sejajar dengan penanda menggunakan matriks homografi
warped_image = cv2.warpPerspective (overlay_image, homography_matrix,
(lebar_bingkai, tinggi_bingkai))

# Buat topeng untuk menerapkan gambar yang dibengkokkan hanya pada area penanda
topeng = 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,
topeng = topeng)

# Terapkan topeng terbalik ke bingkai video
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
topeng=cv2.bitwise_not (topeng))

# Gabungkan gambar melengkung bertopeng dan bingkai video bertopeng
video_frame = cv2.tambahkan (masked_warped_image, masked_video_frame)

defprocessVideoFeed(overlay_image):
# Atur dimensi umpan video
video_height = 480
lebar_video = 640

# Buka pengambilan video
video_capture = cv2.VideoCapture(0)

# Muat dan ubah ukuran gambar overlay
overlay_image = cv2.resize (overlay_image, (video_width, video_height))

ketika video_capture.isOpened():
# Baca bingkai dari pengambilan video
ret, video_frame = video_capture.read()

jika membasahi:
# Temukan penanda Aruco di bingkai video
aruco_markers = findArucoMarkers (video_frame, totalMarkers=100)

# Tempatkan gambar overlay pada penanda di bingkai video
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
hamparan_gambar, lebar_video,
video_height)

# Tampilkan bingkai video dengan overlay
cv2.imshow("Umpan Kamera", video_frame)

# Periksa tombol 'q' tekan untuk keluar dari loop
jika cv2.waitKey(1) & 0xFF == ord('Q'):
merusak