12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OpenCV の Video Capture で 任意のフレームレートで処理する

Posted at

動画をフレームごとに処理できる 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を使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

12
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?