дефfindArucoMarkers(изображение, markerSize=6, totalMarkers=250):
# Преобразувайте изображението в скала на сивото
сиво = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)

# Вземете речника на Aruco въз основа на размера на маркера и общия брой маркери
речников_ключ = getattr (cv2.aruco, f'DICT_{markerSize}Х'
е'{markerSize}_{totalMarkers}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (dictionary_key)

# Задайте параметрите на детектора Aruco
aruco_params = cv2.aruco. DetectorParameters()

# Откриване на Aruco маркери в изображението в сивата скала
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (сив, aruco_dictionary,
параметри=aruco_params)

дефsuperimposeImageOnMarkers(video_frame, aruco_markers, overlay_image,
video_width, video_height):
frame_height, frame_width = video_frame.shape[:2]

ако len (aruco_markers[0]) != 0:
за i, маркер_ъгъл в изброяване (aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).astype (np.int32)

# Начертайте многоъгълник около ъглите на маркера
cv2.polylines (video_frame, [marker_corners], Вярно, (0, 255, 0), 2)

instagram viewer

# Добавяне на идентификатор на маркер като текст в горния ляв ъгъл на маркера
cv2.putText (video_frame, str (aruco_markers[1][i]),
кортеж (marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)

# Намерете хомографската матрица, за да нанесете насложеното изображение върху маркера
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [ширина_видео, 0], [ширина_видео, височина_видео],
[0, video_height]], dtype="float32"), маркер_ъгли)

# Изкривете насложеното изображение, за да го подравните с маркера, като използвате хомографска матрица
изкривено_изображение = cv2.warpPerspective (наслагване_изображение, homography_matrix,
(ширина_на_рамка, височина_на_кадър))

# Създайте маска, за да приложите изкривеното изображение само върху областта на маркера
mask = np.zeros((frame_height, frame_width), dtype="uint8")
cv2.fillConvexPoly (маска, маркер_ъгли, (255, 255, 255), cv2.LINE_AA)

masked_warped_image = cv2.bitwise_and (изкривено_изображение, изкривено_изображение,
mask=маска)

# Приложете обратната маска към видео рамката
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
mask=cv2.bitwise_not (маска))

# Комбинирайте маскираното изкривено изображение и маскираната видео рамка
video_frame = cv2.add (masked_warped_image, masked_video_frame)

дефprocessVideoFeed(насложено_изображение):
# Задайте размерите на видео емисия
видео_височина = 480
video_width = 640

# Отворете заснемането на видео
video_capture = cv2.VideoCapture(0)

# Заредете и преоразмерете насложеното изображение
overlay_image = cv2.resize (overlay_image, (видео_ширина, видео_височина))

докато video_capture.isOpened():
# Прочетете кадър от заснемането на видео
ret, video_frame = video_capture.read()

ако ret:
# Намерете маркери Aruco във видео рамката
aruco_markers = findArucoMarkers (video_frame, totalMarkers=100)

# Наслагване на насложеното изображение върху маркерите във видео рамката
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
overlay_image, video_width,
video_height)

# Показване на видео рамката с наслагване
cv2.imshow(„Емисия на камерата“, video_frame)

# Проверете за натискане на клавиша 'q', за да излезете от цикъла
ако cv2.waitKey(1) & 0xFF == ред('q'):
прекъсвам