目的
私が研究している人工知能では、動画からフレームレートを抽出して大量の画像データを取得しています。そのフレームレートの抽出方法をPythonを用いてここに残しておきます。
ソースコード
import cv2
import os
save_dir="./hogehoge" #抽出した画像を保存するディレクトリを記載
cap=cv2.VideoCapture("./hugehuge.MP4") #読み込む動画のディレクトリ
if not cap.isOpened():
sys.exit()
n= 0
while True:
is_image,frame_img = cap.read()
if is_image:
# 画像を保存
outfile=save_dir+"/"+str(n)+".jpg"
cv2.imwrite(outfile, frame_img)
else:
# フレーム画像が読込なかったら終了
break
n += 1
cap.release()
print("ok")
解説
読み込み先と保存先の指定
save_dir="./hogehoge" #抽出した画像を保存するディレクトリを記載
cap=cv2.VideoCapture("./hugehuge.MP4") #読み込む動画のディレクトリ
./hogehogeと書かれているところにはフレームレートを抽出した画像を保存するディレクトリを指定します。
./hugehuge.MP4と書かれているところは、フレームレートを読み込むMP4動画のディレクトリを指定します。
if not cap.isOpened():
sys.exit()
エラーチェックみたいなものです。詳しくはしらないですが、動画をうまく読み込めない場合、
プログラムを終わらせるみたいな感じだと思います。(あいまいですみません)
is_image,frame_img = cap.read()
cap.read()は、フレーム画像が読み込めたかをbooleanで返す変数と、フレーム画像の配列ndarrayのタプルが返されます。
is_image,frame_imgにはそれぞれの戻り値を格納しています。
それ以降はis_imageがtrueかfalseかで条件分岐です。
画像ファイルは、各ピクセルの色の値を行列値で表すので、ndarrayで返されるというわけです。
outfile=save_dir+"/"+str(n)+".jpg"
cv2.imwrite(outfile, frame_img)
保存先としてoutfileを宣言し、抽出した画像に名前を付けます。
今回はn=0から始まる値を連番として名前付けします。
なので抽出した画像のファイル名は0.jpg~n.jpgとなります。
imwriteでは、保存したいファイル名で抽出した画像の行列を保存しています。
cap.release()
print("ok")
最後に読み込んだ動画をリリースして、フレームレートの抽出が終わったらokと出力させて確認です。
お疲れ様でした!