дефнайтиArucoMarkers(изображение, markerSize=6, общее количество маркеров =250):
# Преобразование изображения в оттенки серого
серый = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)

# Получить словарь Aruco на основе размера маркера и общего количества маркеров
словарь_ключ = getattr (cv2.aruco, f'DICT_{размер маркера}ИКС'
ж'{размер маркера}_{всего маркеров}')

aruco_dictionary = cv2.aruco.getPredefinedDictionary (ключ_словаря)

# Установить параметры детектора Aruco
aruco_params = cv2.aruco. ДетекторПараметры()

# Обнаружение маркеров Aruco на изображении в градациях серого
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (серый, aruco_dictionary,
параметры = aruco_params)

дефсуперимпосеимажеонмаркерс(video_frame, aruco_markers, overlay_image,
видео_ширина, видео_высота):
высота_кадра, ширина_кадра = видео_кадр.форма[:2]

если лен (aruco_markers[0]) != 0:
для я, marker_corner в перечислить (aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).astype (np.int32)

# Нарисовать многоугольник вокруг углов маркера

instagram viewer

cv2.polylines(video_frame, [marker_corners], Истинный, (0, 255, 0), 2)

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

# Найдите матрицу гомографии, чтобы сопоставить оверлейное изображение с маркером
гомография_матрица, _ = cv2.findHomography(
np.массив([[0, 0], [видео_ширина, 0], [видео_ширина, видео_высота],
[0, высота_видео]], dtype="поплавок32"), маркер_углы)

# Деформируем оверлейное изображение, чтобы выровнять его по маркеру, используя матрицу гомографии
warped_image = cv2.warpPerspective (overlay_image, homography_matrix,
(frame_width, кадр_высота))

# Создайте маску, чтобы применить деформированное изображение только к области маркера
маска = np.zeros((frame_height, frame_width), dtype="uint8")
cv2.fillConvexPoly (маска, marker_corners, (255, 255, 255), cv2.LINE_AA)

masked_warped_image = cv2.bitwise_and (warped_image, warped_image,
маска = маска)

# Применяем обратную маску к кадру видео
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
маска=cv2.bitwise_not (маска))

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

дефпроцессвидеофид(оверлей_изображение):
# Установите размеры видеопотока
видео_высота = 480
видео_ширина = 640

# Открыть захват видео
video_capture = cv2.VideoCapture(0)

# Загрузите и измените размер оверлейного изображения
overlay_image = cv2.resize (overlay_image, (video_width, video_height))

пока video_capture.isOpened():
# Читаем кадр из видеозахвата
рет, video_frame = video_capture.read()

если рет:
# Найдите маркеры Aruco в кадре видео
aruco_markers = findArucoMarkers (video_frame, totalMarkers=100)

# Накладываем оверлейное изображение на маркеры в кадре видео
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
оверлейное_изображение, ширина_видео,
видео_высота)

# Отображение кадра видео с наложением
cv2.imshow ("Подача камеры", видео_кадр)

# Проверить нажатие клавиши 'q' для выхода из цикла
если cv2.waitKey(1) & 0xFF == порядок('к'):
перерыв