OpenCV 3.0 にアップグレードする場合は、次の 2 つのユース ケースが役立つ場合があります。これは以前のバージョンでも機能する可能性がありますが、試していません。フレーム a とフレーム b の間のすべてのフレームをキャプチャする場合は、2 番目の使用例を参照して、「desired_frames」を次のように置き換えます。
desired_frames = range(a,b)
まず、いくつかのパッケージをインポートします
import cv2
import math
import numpy as np
n 秒ごとにキャプチャ (ここでは n = 5)
#################### Setting up the file ################
videoFile = "Jumanji.mp4"
vidcap = cv2.VideoCapture(videoFile)
success,image = vidcap.read()
#################### Setting up parameters ################
seconds = 5
fps = vidcap.get(cv2.CAP_PROP_FPS) # Gets the frames per second
multiplier = fps * seconds
#################### Initiate Process ################
while success:
frameId = int(round(vidcap.get(1))) #current frame number, rounded b/c sometimes you get frame intervals which aren't integers...this adds a little imprecision but is likely good enough
success, image = vidcap.read()
if frameId % multiplier == 0:
cv2.imwrite("FolderSeconds/frame%d.jpg" % frameId, image)
vidcap.release()
print "Complete"
または、n フレームごとにキャプチャします (ここでは、n = 10)
#################### Setting up the file ################
videoFile = "Jumanji.mp4"
vidcap = cv2.VideoCapture(videoFile)
success,image = vidcap.read()
#################### Setting up parameters ################
#OpenCV is notorious for not being able to good to
# predict how many frames are in a video. The point here is just to
# populate the "desired_frames" list for all the individual frames
# you'd like to capture.
fps = vidcap.get(cv2.CAP_PROP_FPS)
est_video_length_minutes = 3 # Round up if not sure.
est_tot_frames = est_video_length_minutes * 60 * fps # Sets an upper bound # of frames in video clip
n = 5 # Desired interval of frames to include
desired_frames = n * np.arange(est_tot_frames)
#################### Initiate Process ################
for i in desired_frames:
vidcap.set(1,i-1)
success,image = vidcap.read(1) # image is an array of array of [R,G,B] values
frameId = vidcap.get(1) # The 0th frame is often a throw-away
cv2.imwrite("FolderFrames/frame%d.jpg" % frameId, image)
vidcap.release()
print "Complete"
それだけです。
いくつかの残念な警告...opencv のバージョン (これは opencv V3 用にビルドされています) によっては、fps 変数を別の方法で設定する必要がある場合があります。詳しくは
こちらをご覧ください。バージョンを確認するには、次の手順を実行します。
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
major_ver