動画をフレームごとに処理できる cv2.VideoCapture ですが、ffmpeg とちがって切り出すfps(1秒あたりに切り出すフレーム数)を引数で指定できません。
動画によって1秒あたりの読み込む枚数が自動で決定されるからです。
(もしできたら僕の不勉強ですのでコメントお願いします)
そこで以下のコードで、任意のfpsで処理することができます。
import cv2
cap = cv2.VideoCapture('./video.mp4') #読み込む動画のパス
read_fps= cap.get(cv2.CAP_PROP_FPS) #cv2.VideoCaptureが動画1秒あたり何枚を読み込むのかを取得(これは自動で設定される)
print("もとのfps" + str(read_fps))
fps = 5 #希望のfps(動画1秒あたり何枚切り出して処理したいか)
thresh = read_fps / fps #フレーム何枚につき1枚処理するか
frame_counter = 0
while True:
# 1フレームずつ取得する。
ret, frame = cap.read()
if not ret:
break
frame_counter += 1
print("frame_count" + str(frame_counter))
if (frame_counter >= thresh): #フレームカウントがthreshを超えたら処理する
print("処理")
frame_counter = 0 #フレームカウントを0に戻す
key = cv2.waitKey(30)
if key == 27:
break
cap.release()
もとのfps30.0
frame_count1
frame_count2
frame_count3
frame_count4
frame_count5
frame_count6
処理
frame_count1
frame_count2
frame_count3
frame_count4
frame_count5
frame_count6
処理
frame_count1
frame_count2
frame_count3
frame_count4
frame_count5
frame_count6
処理
frame_count1
frame_count2
frame_count3
....
....
もとのfpsが30なので、6枚に1枚の割合で、1秒に5フレーム処理されています。
🐣
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。