defgăsiți ArucoMarkers(imagine, markerSize=6, totalMarkers=250):
# Convertiți imaginea în tonuri de gri
gri = cv2.cvtColor (imagine, cv2.COLOR_BGR2GRAY)

# Obțineți dicționarul Aruco bazat pe dimensiunea markerului și marcatorii totale
Dictionary_key = getattr (cv2.aruco, f'DICT_{markerSize}X'
f'{markerSize}_{totalMarkers}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (cheie_dicționar)

# Setați parametrii detectorului Aruco
aruco_params = cv2.aruco. DetectorParameters()

# Detectați markerii Aruco în imaginea în tonuri de gri
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (gri, aruco_dictionary,
parametri=aruco_params)

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

dacă len (aruco_markers[0]) != 0:
pentru i, marker_corner în enumera (aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).astype (np.int32)

# Desenați un poligon în jurul colțurilor marcatorului
cv2.polylines (cadru_video, [marker_corners], Adevărat, (0, 255, 0), 2)

instagram viewer

# Adăugați ID-ul marcatorului ca text în colțul din stânga sus al marcatorului
cv2.putText (cadru_video, str (marcatori_aruco[1][i]),
tuplu (marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)

# Găsiți matricea de omografie pentru a mapa imaginea de suprapunere pe marker
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [video_width, 0], [video_width, video_height],
[0, înălțimea_video]], dtype="float32"), marker_corners)

# Deformați imaginea de suprapunere pentru a se alinia cu markerul folosind matricea de omografie
warped_image = cv2.warpPerspective (imagine_suprapunere, matrice_omografie,
(lățime_cadru, înălțime_cadru))

# Creați o mască pentru a aplica imaginea deformată numai pe zona markerului
mask = np.zeros((frame_height, frame_width), dtype="uint8")
cv2.fillConvexPoly (mască, colțuri_marker, (255, 255, 255), cv2.LINE_AA)

masked_warped_image = cv2.bitwise_and (imagine_deformată, imagine_deformată,
mască = mască)

# Aplicați masca inversă cadrului video
masked_video_frame = cv2.bitwise_and (cadru_video, cadru_video,
mask=cv2.bitwise_not (mască))

# Combinați imaginea deformată mascată și cadrul video mascat
video_frame = cv2.add (masked_warped_image, masked_video_frame)

defprocessVideoFeed(overlay_image):
# Setați dimensiunile fluxului video
video_height = 480
video_width = 640

# Deschideți captura video
video_capture = cv2.VideoCapture(0)

# Încărcați și redimensionați imaginea suprapusă
overlay_image = cv2.resize (overlay_image, (video_width, video_height))

in timp ce video_capture.isOpened():
# Citiți un cadru din captura video
ret, video_frame = video_capture.read()

dacă ret:
# Găsiți markeri Aruco în cadrul video
aruco_markers = findArucoMarkers (cadru_video, totalMarkers=100)

# Suprapuneți imaginea suprapusă pe marcatorii din cadrul video
video_frame = suprapuneImageOnMarkers (video_frame, aruco_markers,
overlay_image, video_width,
video_height)

# Afișați cadrul video cu suprapunere
cv2.imshow(„Feed camera”, cadru_video)

# Verificați dacă apăsați tasta „q” pentru a ieși din buclă
dacă cv2.waitKey(1) & 0xFF == ord('q'):
pauză