Pythonコピペプログラミング #005 動画フレーム切り出し

Pythonコピペ用 code は以下の通り。 既存のソースコードに入れる場合には変数名が重複しないように注意すること。
メカエンジニアは製品の挙動解析の際に動画を取り、パソコン上のメディアプレイヤーなどでコマ送りにして解析を行っている人がほとんどだが、Pythonを使用することで動画の各フレームをわずか数秒で切り出すことができる。30[fps]の動画であれば1秒間で30枚の画像が出力される。下記に動画を添付しておくので、実行テストはこれでできるはず。ちなみに、画面の動画キャプチャは”Win + G”でできる。

# -*- coding: utf-8 -*-
"""
    author: serpent
    creation datetime: 2021-12-18 18:08:13.375911
    filename: movie_frame_cut_copipe.py
    function: 動画ファイルの各フレームを切り出して画像として保存 
                + 動画のfps, フレーム数, 長さ[s]をターミナルに表示
    explanation: 
        1   file_path に動画ファイルのパスをフルパスで入れる。
        2   save_path に切り出したファイルを保存したいフォルダーのパスを入れる。
        3   base_name に切り出した画像の名前を設定する。
        4   このプログラムを実行するとsave_pathの直下にbase_path_001.jpgというような名前の画像ファイルがフレーム数分だけ生成される。
        5   ターミナルに動画のfps, フレーム数, 長さ[s]をターミナルが表示されて終了。
"""
# ------------------------------------------------------------------- #
# --- 設定 ---------------------------------------------------------- #
# ------------------------------------------------------------------- #
import cv2
import datetime
import sys
import os

# ---アプリ実行時間計測用--------------------------------------------- #
time_start = datetime.datetime.now()
print(f"start:{time_start}")
# ---機能上のメイン処理----------------------------------------------- #
file_path = r'C:\Users\serpenrt\Document\PythonScripts\movie_demo.mp4'
save_path = r'C:\Users\serpenrt\Document\PythonScripts\cap\\'
base_name = r'frame'

cap = cv2.VideoCapture(file_path)                           # 動画を読み込む

if not cap.isOpened():
    sys.exit()                                              # 動画をプログラム上で読み込めなければ、プログラムを終了する。
os.makedirs(save_path,exist_ok=True)                        # 保存先フォルダーが存在しているかを確認する。なければ作成する。
base_path = os.path.join(save_path, base_name)              # 切り出した画像のファイルパスを結合する
digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))    # 動画のフレーム数からファイル名に使用する何番目のフレームかを示す数値の桁を確認する
n = 0

while True:
    ret, frame = cap.read()                                 
    if ret:
        cv2.imwrite('{}_{}_.{}'.format(base_path,str(n).zfill(digit),'jpg'), frame) # ファイル名をつける: base_path_001.jpg
        n = n + 1
    else:
        break

# - - - - - - - - - - - - - - - - - - - - - - - - - -
# ---オマケ機能---------------------------------------
cap = cv2.VideoCapture(file_path)            # 動画を読み込む
video_frame = cap.get(cv2.CAP_PROP_FRAME_COUNT) # フレーム数を取得する
video_fps = cap.get(cv2.CAP_PROP_FPS)           # FPS を取得する
video_len_sec = video_frame / video_fps                     # 長さ(秒)を計算する
print('fps:{0}, frmame:{1}, sec:{2}'.format(video_fps,video_frame,video_len_sec))     
# - - - - - - - - - - - - - - - - - - - - - - - - - -

# ------------------------------------------------------------------- #
time_end = datetime.datetime.now()
print(f"start:{time_start}")
print(f"running_time:{time_end - time_start}")
print('done!')

# end_of_file: this line is 63th

実行結果(ターミナル上の表記例)


(base) C:\Users\serpent\Documents>C:/Users/serpent/Anaconda3/python.exe c:/Users/serpent/Documents/PythonScripts/study/studypyautogui_copipe.py
start:2021-12-26 18:30:50.305977
fps:30.463618189318694, frmame:224.0, sec:7.353033333333333
start:2021-12-26 18:30:50.305977
running_time:0:00:06.341560
done!
movie_demo.mp4

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

トップに戻る