defencontrarArucoMarkers(imagem, marcadorSize=6, totalMarkers=250):
# Converte a imagem em tons de cinza
cinza = cv2.cvtColor (imagem, cv2.COLOR_BGR2GRAY)

# Obtenha o dicionário Aruco com base no tamanho do marcador e no total de marcadores
Dictionary_key = getattr (cv2.aruco, f'DICT_{markerSize}X'
f'{markerSize}_{totalMarkers}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (dictionary_key)

# Defina os parâmetros do detector Aruco
aruco_params = cv2.aruco. DetectorParameters()

# Detectar marcadores Aruco na imagem em tons de cinza
marcadores_cantos, marcadores_ids, _ = cv2.aruco.detectMarkers (cinza, aruco_dictionary,
parâmetros=aruco_params)

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

se len (aruco_markers[0]) != 0:
para eu, marcador_canto em enumerar (aruco_markers[0]):
marcador_cantos = marcador_canto.reshape((4, 2)).astype (np.int32)

# Desenhe um polígono ao redor dos cantos do marcador
cv2.polylines (video_frame, [marker_corners], Verdadeiro, (0, 255, 0), 2)

# Adicione o ID do marcador como texto no canto superior esquerdo do marcador
cv2.putText (video_frame, str (aruco_markers[1][eu]),
tupla (marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)

# Encontre a matriz de homografia para mapear a imagem de sobreposição no marcador
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [largura_do_vídeo, 0], [largura_do_vídeo, altura_do_vídeo],
[0, video_height]], dtype="flutuar32"), marcadores_cantos)

# Warp a imagem de sobreposição para alinhar com o marcador usando a matriz de homografia
warped_image = cv2.warpPerspective (overlay_image, homography_matrix,
(frame_width, frame_height))

# Crie uma máscara para aplicar a imagem distorcida apenas na área do marcador
máscara = 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,
máscara=máscara)

# Aplique a máscara inversa ao quadro de vídeo
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
máscara=cv2.bitwise_not (máscara))

# Combine a imagem distorcida mascarada e o quadro de vídeo mascarado
video_frame = cv2.add (masked_warped_image, masked_video_frame)

defprocessVideoFeed(overlay_image):
# Defina as dimensões do feed de vídeo
video_height = 480
video_width = 640

# Abra a captura de vídeo
video_capture = cv2.VideoCapture(0)

# Carregue e redimensione a imagem de sobreposição
overlay_image = cv2.resize (overlay_image, (video_width, video_height))

enquanto video_capture.isOpened():
# Leia um quadro da captura de vídeo
ret, video_frame = video_capture.read()

se ret:
# Encontre marcadores Aruco no quadro de vídeo
aruco_markers = encontrarArucoMarkers (video_frame, totalMarkers=100)

# Sobreponha a imagem de sobreposição nos marcadores no quadro de vídeo
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
overlay_image, video_width,
video_height)

# Exiba o quadro de vídeo com sobreposição
cv2.imshow("Alimentação da câmera", video_frame)

# Verifique se a tecla 'q' foi pressionada para sair do loop
se cv2.waitKey(1) & 0xFF == ordem('q'):
quebrar