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()
→ Ссылка