Python. CV2. В видео не отображается текст бегущей строки
Всем доброго времени суток!
Выполняю задание, целью которого является создание видео-файла формата .mp4, в котором должна быть бегущая строка с текстом.
У меня на выходе получается пустое видео без текста.
Пробовал менять цвета фона и текста, менять шрифты. Результат один и тот же.
Мой код:
import cv2
import numpy as np
# Параметры видео
video_duration = 3 # Длительность видео в секундах
fps = 30 # Количество кадров в секунду
# Параметры текста
text = "скрипт для создания видео бегущей строки (100 на 100, длина 3 секунды)"
text_width = 100
text_height = 100
# Создание видеофайла
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_output = cv2.VideoWriter('output.mp4', fourcc, fps, (text_width, text_height))
# Создание кадров видео
for _ in range(video_duration * fps):
# Создание пустого кадра
frame = np.zeros((text_height, text_width, 3), dtype=np.uint8)
# Отображение текста на кадре
font_path = "C:/Python/projects/Roboto-Bold.ttf" # Путь к шрифтовому файлу "Roboto-Bold.ttf"
font_size = 36
font_color = (255, 255, 255) # Белый цвет текста
font_thickness = 2
# Загрузка шрифта
font = cv2.FONT_HERSHEY_SIMPLEX
# Расчет позиции текста
text_size, _ = cv2.getTextSize(text, font, font_size, font_thickness)
text_x = int((text_width - text_size[0]) / 2)
text_y = int((text_height + text_size[1]) / 2)
# Отображение текста на кадре
cv2.putText(frame, text, (text_x, text_y), font, font_size, font_color, font_thickness, cv2.LINE_AA)
# Запись кадра в видеофайл
video_output.write(frame)
# Закрытие видеофайла
video_output.release()
Подскажите, пожалуйста, что я не учел?
Ответы (1 шт):
Автор решения: Amgarak
→ Ссылка
Вариант 1)
import cv2
import numpy as np
# Функция для создания видео с бегущей строкой
def create_birthday_video_opencv():
# Текст поздравления
birthday_message = "Happy Birthday To You!!1"
# Размеры видео (ширина x высота)
width, height = 1920, 1080
# Задаём параметры - видеопоток с частотой 24 кадра в секунду
out = cv2.VideoWriter("birthday_video_opencv.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 24, (width, height))
# Создаем кадр с черным фоном
frame = np.zeros((height, width, 3), dtype=np.uint8)
# Начальные координаты для бегущей строки
x, y = width, height // 2
# Установим параметры шрифта
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
font_thickness = 2
font_color = (255, 255, 255) # Белый цвет текста
# Пройдемся по каждому кадру
for t in range(240): # 10 секунд с частотой 24 кадра/сек
# Очистка кадра
frame.fill(0)
# Новые координаты для бегущей строки
x -= 10 # Скорость бегущей строки
# Вот тут добавим текст
cv2.putText(frame, birthday_message, (x, y), font, font_scale, font_color, font_thickness)
# Тут запишем кадр
out.write(frame)
# Закроем тут видеопоток
out.release()
# Создаём видео
create_birthday_video_opencv()
Вариант 2)
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
def create_birthday_video_combined():
# Текст поздравления
birthday_message = "С Днем Рождения!!!"
width, height = 1920, 1080
out = cv2.VideoWriter("birthday_video_combined.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 24, (width, height))
frame = np.zeros((height, width, 3), dtype=np.uint8)
x, y = width, height // 2
# Путь к вашему .ttf файлу или .otf - может хавать оба формата на выбор
font_path = "timesnewromanpsmt.ttf"
# Грузим шрифт с помощью Pillow
pillow_font = ImageFont.truetype(font_path, size=40)
for t in range(240):
# Очистите кадр
frame.fill(0)
x -= 10
# Используем Pillow для рисования текста
img_pil = Image.fromarray(frame)
draw = ImageDraw.Draw(img_pil)
# Тут добавим текст на изображение
draw.text((x, y), birthday_message, font=pillow_font, fill=(255, 255, 255))
# Преобразуем обратно в массив NumPy
frame = np.array(img_pil)
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) - использовать, если будут неправильные цвета.
out.write(frame)
out.release()
create_birthday_video_combined()