【Python】動画をフレームごとの画像にして出力するスクリプトを作った話
606 語
3 分
【Python】動画をフレームごとの画像にして出力するスクリプトを作った話
はじまり

135ml
動画から画像を切り出したいな。

リサちゃん
はい、目玉焼きができたよ~。
ツールの紹介
さて、今回使う機能は、ExtractImage()という関数になります。

スクリプトを起動すると、ファイルを選択するダイアログが表示されます。今回は、このビデオを画像にします。

選択すると、画像を保存するフォルダの名前を入力します。※日本語(SJIS)は使えません!

そして、画像化が始まると順次保存されたファイルの名前を出力します。

画像化が終わると、保存したフォルダを確認するように促すメッセージが表示されて、スクリプトが終了します。

先程の動画があるフォルダを見ると、確かに先程入力したフォルダがあります。

そのフォルダの中を確認すると、確かに画像が入っています。おおよそ1秒毎に切り取っています。

スクリプトの紹介
こちらが今回のスクリプトです。そこまで複雑なスクリプトではないと思います。
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秒毎のフレームを出力する挙動になっています。解説する点はこれくらいですかね(笑)
おしまい

135ml
動画から画像を切り出せたぞ。

リサちゃん
はい、目玉焼きができているよ~。
このツールで画像にした後は・・・
このツールで画像として出力した後は、以下のツールで切り出してみてはいかがでしょうか? こちらのツールもPythonで動きます!
【Python】複数の画像を一気にトリミングするスクリプトを作った話
複数の画像を一気にトリミングするツールをPythonで作りました。使い方としては、最初に切り出したい範囲を選んで確定したら、そのエリアで後続の画像も切り出します。利用したモジュールは、OpenCVやTkinter、matplotlibになります。
www.endorphinbath.com

さらに、一気にトリミングした複数の画像の重複を除きたい場合は、以下のツールで重複を排除してみてはいかがでしょうか? こちらのツールもPythonで動くものになっています!
【Python】同じような画像が色々な組み合わせで存在する場合に重複分を削除するスクリプトを作った話
同じような画像が色々な組み合わせ・グループで出来てしまった場合に、重複している分を削除するツールをPythonで作りました。OpenCVやTkinterを利用しています。
www.endorphinbath.com

以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!
【Python】動画をフレームごとの画像にして出力するスクリプトを作った話
https://endorphinbath.com/posts/extract-movie-to-image/ 関連記事 スマート
1
【Python】複数の画像を一気にトリミングするスクリプトを作った話
Code 複数の画像を一気にトリミングするツールをPythonで作りました。使い方としては、最初に切り出したい範囲を選んで確定したら、そのエリアで後続の画像も切り出します。利用したモジュールは、OpenCVやTKinter、matplotlibになります。
2
【Python】同じような画像が色々な組み合わせで存在する場合に重複分を削除するスクリプトを作った話
Code 同じような画像が色々な組み合わせ・グループで出来てしまった場合に、重複している分を削除するツールをPythonで作りました。OpenCVを利用しています。
3
【Python】cronを生成するモジュールを作った
Code Pythonでcron時間を生成するモジュールを作りました。タイムゾーンを引数にして生成できます。
4
【Python】複数の区切り文字を指定して文字列を配列に分割する
Code Pythonで文字列を配列に分割するスクリプトを掲載します。分割文字は配列で指定するように作っています。
5
【Python】シェル上で出力した文字列で濁点が分かれてしまった文字(結合文字)を濁音に直すスクリプト
Code シェル上でファイル名などを出力した際に、バがバになってしまう場合があります。それをいちいち手作業で直すのがしんどいので、直してくれるスクリプトを作りました。テストコードもあります。
ランダム記事 ランダム