はじまり
…. PiPiPiPi ….! PiPiPiPi …!!
うるせえなあ! ああ、もう朝か。 うわー今日も仕事めんどくせえなあ。
とりあえず、飯食うかあ。
・・・・・・
おはよー。
おはヨークシンシティ編はグリードアイランド編の前~。
おはようこそ実力至上主義の教室へのアニメの1期が放送されたのは4年前~。
もうそんな前になるのか・・・。
ところで、お前なんでそんな目がバキバキなんだ?
あー、徹夜してムフフなビデオを見ていたからなー。そりゃ充血するわな。
相変わらずだな・・・。おー、今日も天達は元気だなー。
最近さー、ムフフなビデオの見たいカットを探すのに時間が掛かって困ってるんだよねー。
「あのカットが見たいだけなのに!」って感じで。
ほー、画像で見たいってことなのか。
うん、恍惚とした表情が見たいだけなんだ。
はあ・・・。まあ、動画から画像を切り出すツールを以前に作ったことがあるなあ。
な!? それは本当か!? 是非提供して欲しいぞ!!
おー、じゃあ今回は、そのツールの紹介をするかあ。刮目せよ!
はい、目玉焼きできたよ~。
ツールの紹介
さて、今回使う機能は、ExtractImage()
という関数になります。
スクリプトを起動すると、ファイルを選択するダイアログが表示されます。今回は、このビデオを画像にします。
選択すると、画像を保存するフォルダの名前を入力します。※日本語(SJIS)は使えません!
そして、画像化が始まると順次保存されたファイルの名前を出力します。
画像化が終わると、保存したフォルダを確認するように促すメッセージが表示されて、スクリプトが終了します。
先程の動画があるフォルダを見ると、確かに先程入力したフォルダがあります。
そのフォルダの中を確認すると、確かに画像が入っています。おおよそ1秒毎に切り取っています。
スクリプトの紹介
こちらが今回のスクリプトです。そこまで複雑なスクリプトではないと思います。
ImageEditor.py
def ExtractImage(video_name):
'''
video_name : String absolutely path of selected file
extracted_dir : String absolutely path of directory has selected file
frame_count : Integer number of frame of selected video
fps : Integer number of fps of selected video
num_of_image : Integer number of extracted images from video
'''
# Error Handling
if video_name == '':
print("ERROR: No file is selected.")
sys.exit(0)
extracted_dir = DirEditor.MakeDirectory(video_name)
# Error Handling
basefilename_without_ext = os.path.splitext(os.path.basename(__file__))[0]
if InputController.CheckWhetherSjisExists(extracted_dir, basefilename_without_ext) == True:
sys.exit(0)
cap = cv2.VideoCapture(video_name)
# width
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# height
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# number of frame
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
# fps
fps = cap.get(cv2.CAP_PROP_FPS)
print("movie's width: ", width, ", height: ", height)
for num_of_image in range(1, int(frame_count), int(fps)):
# set a property, where frame in this case, in the VideoCapture
cap.set(cv2.CAP_PROP_POS_FRAMES, num_of_image)
# read the next video frame to extract image file ("cap.read()[1]" is arrays of image's pixels.)
cv2.imwrite("{dirname}{sep}image{num:0=3}.jpg".format(dirname=extracted_dir,sep=sep,num=int((num_of_image-1)/int(fps))), cap.read()[1])
# cv2.imwrite("{video_dir}image{:0=3}.jpg".format(int((num_of_image-1)/int(fps))), cap.read()[1])
print("saved: image{num:0=3}.jpg".format(num=int((num_of_image-1)/int(fps))))
print('Check directory "{dirname}"'.format(dirname=extracted_dir))
cap.release()
for文では、フレーム数をFPSで増分しているので、おおよそ1秒毎のフレームを出力する挙動になっています。解説する点はこれくらいですかね(笑)
おしまい
おお・・・、これで全て切り抜けるじゃねえか!
うーん、ムフフなビデオに使う意味があるのかは知らんが・・・、使い方次第だな。
へっへっへ、これは捗るなあ・・・! 今日は大変だなあ・・・!
まあ、ヨダレ拭けよ。
ズズズッ・・・。フーッ。
他の用途としては、今回みたいに問題集が動画として掲載されている場合に、その問題集を画像として持っておけるようになります。
なるほどねえ。 バリッボリッ。
ん? 俺は今何を食ったのだ?
煎餅じゃね? 僕の皿にもあるし。
う~ん、目玉焼きだねえ。
・・・・・・・・。
・・・・・・・・。
以上になります!
このツールで画像にした後は・・・
このツールで画像として出力した後は、以下のツールで切り出してみてはいかがでしょうか?
こちらのツールもPythonで動きます!
さらに、一気にトリミングした複数の画像の重複を除きたい場合は、以下のツールで重複を排除してみてはいかがでしょうか?
こちらのツールもPythonで動くものになっています!
おまけ
今回作ったソースは、以下のリポジトリのLandmasterLibraryに挙げています。
コメント