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!