Повторяем Bad aplle на языке Python ASCII-графикой

f7af166d53adc217899c4a1af109d28a.jpg

Доброго времени суток, уважаемые обитатели Хабра! Для начала я расскажу Вам историю клипа Bad Apple, который многие повторяют на всем, на чем только можно.

«Bad Apple!» — это популярная японская песня и клип, который стал известен благодаря проекту Touhou Project. История «Bad Apple!» начинается с создания музыкального арранжирования для одного из уровней игры Touhou Project, разработанной командой ZUN. Этот уровень называется «Lotus Land Story» и является шестой игрой в серии.

Ремикс «Bad Apple!» был создан японским музыкантом Masayoshi Minoshima, также известным как Alstroemeria Records. Он решил сделать аранжировку на основе музыки из Touhou Project, чтобы она звучала в стиле электронной музыки. Миндзёши использовал вокал Nomico, чтобы добавить голос к своему ремиксу. Таким образом, «Bad Apple!» стала известной как трек в стиле «electro house» с четким вокалом.

Однако настоящей популярностью песне и клипу «Bad Apple!» стал благодаря тому, что кто-то создал впечатляющий анимированный клип, используя компьютерную графику (CGI). Этот клип представляет собой визуальное шоу, в котором персонажи из игры Touhou Project плавно двигаются и танцуют в такт музыке «Bad Apple!».

Этот анимационный клип, сопровождающий песню, быстро стал вирусным и завоевал огромную популярность в интернете. Видео было оценено за свою красочность, синхронизацию с музыкой и внимание к деталям в анимации персонажей.

С тех пор «Bad Apple!» стала настоящим явлением в интернет-культуре, став синонимом креативности и таланта сообщества фанатов. Различные версии и переработки песни и клипа появились в сообществах по всему миру, продолжая приносить удовольствие и вдохновлять людей.

А сейчас я приложу ссылку на одну из реализаций этого клипа, которую я и попытался повторить: ТЫК

Теперь начнем думать над реализацией! Так как я уже уже писал код для перевода картинки в ASCII-арт, то я буду использовать небольшую его часть. Код будет немного доработанным, так как в комментариях мне предложили лучший способ, чем бы у меня. (Почитать предыдущую статью по ASCII-артам: ТЫК). Еще мне предлагали использовать сторонние библиотеки по типу aalib, libcaca, art, но когда я пытался их освоить, возникали разнообразные проблемы. Например aalib не работает на винде из-за отсутствия библиотеки libaa.so.1, которая обычно присутствует в Unix-подобных системах (на линуксе я не стал пробовать использовать эту библиотеку, так как хочу, чтобы мою программу можно было запустить на любом компьютере с минимальным набором сторонних библиотек). Libcaca вообще отказалась работать, а art переводит в ASCII-графику только текст. Именно по этому я и решил оставить свой первоначальный код, но немного переработанный.

Как и в прошлый раз, сначала я расскажу о измененном алгоритме, а уже потом покажу свой код.

Так как мы хотим повторить клип Bad apple в ASCII-графике, то сначала нужно скачать его. В этом нам поможет ютуб с ссылкой на видео: Bad Apple и сайт, который позволит его скачать в формате mp4: https://y2mate.mx/ru51 (клип можно скачивать в самом «шакальном» качестве ╰(*°▽°*)╯ это ни на что не повлияет)

После того как мы скачали видео, надо задуматься о том, как его покадрово обрабатывать и переводить пиксели в символы ASCII, в этом нам поможет библиотека OpenCV, которую мы использовали в прошлый раз. И если вы вдохновитесь ASCII-графикой, то в аргументах функции VideoCapture можно будет прописать не путь к .mp4 файлу, а указать 0, и в результате мы получим видеопоток с веб-камеры (только надо будет немного подождать, она включается примерно через 30 секунд, не особо понимаю, почему так).

Далее мы разбиваем видео на кадры и применяем код из прошлой статьи, только не записывая его в блокнот, а выводя строку с символами сразу же (Почитать предыдущую статью по ASCII-артам: ТЫК)

И после того, как мы написали код, возникает вопрос, а как же его запустить, ведь в среде разработки получается не очень? Для этого нам надо открыть Командную строку и проверить, работает ли в ней Python, для этого просто прописываем:

python

И если у Вас он не был установлен для командной строки, то у скорее всего на Вашем компьютере откроется окно Microcoft Store, в котором он предложит установить Python. Устанавливаем его и возвращаемся в командную строку. В ней сейчас пишем:

pip install opencv-python

После того как у Вас установилась библиотека OpenCV, то все еще остаемся в командной строке и при помощи команды «cd» перемещаемся в ту директорию, в которой у нас находится исполняемый .py файл. (Чтобы не прописывать имена папок полностью, то нажимаем TAB и имя допишется само. И если случайно перешли не в ту директорию, то пишем «cd …», где »…» — это жесткая ссылка на предыдущую директорию). После того, как мы перешли к нашему .py файлу, то пишем следующее:

python "имя файла".py

После этого у Вас запуститься сделанный код, но есть одна проблемка, видно как консоль либо медленно рисует, либо видно, как рисуются новые строчки и сдвигаются вверх старые. Это я решил исправить следующим образом:

  1. После полной отрисовки кадра я очищал консоль при помощи встроенной библиотеки os

  2. Я использовал ускорил работу отрисовки символов в консоли используя стандартный вывод (stdout), который есть во встроенной библиотеке sys

Ну вот и все нововведения, которые и добавил к коду для создания ASCII-артов.

И вот полученный результат:

import os
import cv2
import sys

string = " `.,-':<>;+!*/?%&98#"
coef = 255 / (len(string) - 1)
cap = cv2.VideoCapture('img/BadApple.mp4')

while True:
    ret, frame = cap.read()
    gray_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    height, width, channels = frame.shape
    for y in range(0, height - 1, 5):
        s = ""
        for x in range(0, width - 1, 3):
            s += string[len(string) - int(gray_image[y, x] / coef) - 1]
        if len(s) != 0:
            sys.stdout.write(s + '\n')
            sys.stdout.flush()
    os.system('cls')


И далее я приложу видео с тем, как работает мой код:

Да, к сожалению, поддержки музыки в моем коде нету, но для меня главным было повторить сам клип в ASCII-графикой и рассказать об это другим людям :))

Буду рад любым комментариям, большое спасибо, что прочитали мою статью!

© Habrahabr.ru