Skip to content

Instantly share code, notes, and snippets.

@byxor
Last active November 28, 2018 06:39
Show Gist options
  • Save byxor/2b4906cc4d04dcb8544978f370d08a84 to your computer and use it in GitHub Desktop.
Save byxor/2b4906cc4d04dcb8544978f370d08a84 to your computer and use it in GitHub Desktop.
Quickly extract N keyframes from a video (requires python2 and opencv)
from __future__ import division
import sys
import cv2
import contextlib
def main(num_keyframes, filepath):
print("Extracting {} keyframes from '{}'...".format(num_keyframes, filepath))
with video_file(filepath) as video:
for title, keyframe in get_keyframes(video, num_keyframes):
cv2.imwrite(title, keyframe)
print("Done.")
@contextlib.contextmanager
def video_file(path):
v = cv2.VideoCapture(path)
yield v
v.release()
def get_keyframes(video, num_keyframes):
num_frames = int(video.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
for i in range(num_keyframes):
title = "{}.png".format(i)
keyframe = get_keyframe(video, num_frames, num_keyframes, i)
yield title, keyframe
def get_keyframe(video, num_frames, num_keyframes, index):
percentage = (index + 1)/(num_keyframes + 2)
frame_index = int(percentage * num_frames)
print("Extracting keyframe {}/{} (frame {})...".format(index + 1, num_keyframes, frame_index))
video.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, frame_index)
return video.read()[1]
if __name__ == "__main__":
if len(sys.argv) == 3:
main(int(sys.argv[2]), sys.argv[1])
else:
print("Please specify the arguments: <video_file> <number_of_keyframes>")
sys.exit(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment