Повторяем Bad aplle на языке Python ASCII-графикой
Доброго времени суток, уважаемые обитатели Хабра! Для начала я расскажу Вам историю клипа 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
После этого у Вас запуститься сделанный код, но есть одна проблемка, видно как консоль либо медленно рисует, либо видно, как рисуются новые строчки и сдвигаются вверх старые. Это я решил исправить следующим образом:
После полной отрисовки кадра я очищал консоль при помощи встроенной библиотеки os
Я использовал ускорил работу отрисовки символов в консоли используя стандартный вывод (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-графикой и рассказать об это другим людям :))
Буду рад любым комментариям, большое спасибо, что прочитали мою статью!