前提・実現したいこと
まずPythonを使用して動画をフレームごとに切り分けて保存します。
その後アスキーアート化し、ターミナル上で上書きし続けながら出力するというものです。
###発生している問題
フレーム全てをアスキーアートへと変えることはできましたが、ターミナル上で上書きしながら出力し続けることができません。
そのためアスキーアートがターミナル上で流れるように出力(1枚1枚新しく表示)されてしまい、見づらいものになってしまいました。
特にこの二行が思った通りに動きません。
・sys.stdout.write("\r" + ascii_image)
・sys.stdout.flush()
###該当のソースコード
Pyhon3.7
1#指定したファイルから画像を読み込み、アスキーアートに変換し出力するプログラム 2import PIL.Image 3import cv2 4import sys 5import time 6 7ASCII_CHARS = ["@","#","S","%","?","*","+",";",":",",","."] 8 9#リサイズ 10def resize_image(image,new_width=100): 11 width,height = image.size 12 ratio = height / width 13 new_height = int(new_width * ratio) 14 resized_image = image.resize((new_width,new_height)) 15 return(resized_image) 16 17#グレースケール化 18def convert_grayscale(image): 19 grayscale_image = image.convert("L") 20 return(grayscale_image) 21 22#変換 23def pixels_to_ascii(image): 24 pixels = image.getdata() 25 characters = ''.join([ASCII_CHARS[pixel//25] for pixel in pixels]) 26 return(characters) 27 28 29def main(new_width=100): 30 31 for index in range(6565): 32 path = "frame/frame_" + str(index).zfill(4) +".jpg" 33 34 image = PIL.Image.open(path) 35 36 37 new_image_data = pixels_to_ascii(convert_grayscale(resize_image(image))) 38 39 pixel_count = len(new_image_data) 40 ascii_image = "\n".join([new_image_data[i:(i+new_width)] for i in range(0,pixel_count,new_width)]) #ascii化 41 42 43 sys.stdout.write("\r" + ascii_image) 44 sys.stdout.flush() 45 46 time.sleep(0.033) 47 48 49main()
Python3.7
1#こちらは動画からフレームごことに切り出すプログラム 2import cv2 3import os 4 5def save_all_frames(video_path="動画の名前と拡張子", dir_path="frame", basename="frame", ext='jpg'): 6 cap = cv2.VideoCapture(video_path) 7 8 if not cap.isOpened(): 9 return 10 11 os.makedirs(dir_path, exist_ok=True) 12 base_path = os.path.join(dir_path, basename) 13 14 digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))#総フレーム数の桁を取得 15 16 n = 0 17 18 while True: 19 ret, frame = cap.read() 20 if ret: 21 cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame)#画像で出力 22 n += 1 23 else: 24 return 25 26save_all_frames()
####補足
・アスキーアート化させたい画像はカレントディレクトリの一つ下のファイルに保存しています
/frame/frame_0000.jpg (0000から6565までの6566枚)
・1フレームあたりおよそ0.033秒ほどの表示時間で約30fpsほどです。
・参考にした動画 : リンク内容
至らない点も多々あるかと思いますがよろしくお願いします。
しつもんはなんでしょうか
回答1件
あなたの回答
tips
プレビュー