python短视频提取关键帧,提取关键帧| Python | Opencv的

I am currently working on keyframe extraction from videos.

Code :

while success:

success, currentFrame = vidcap.read()

isDuplicate = False

limit = count if count <= 10 else (count - 10)

for img in xrange(limit, count):

previusFrame = cv2.imread("%sframe-%d.png" % (outputDir, img))

try:

difference = cv2.subtract(currentFrame, previusFrame)

except:

pass

This gives me huge amounts of frames.

Expected ouput: Calculate pixel difference between frames and then compare it with a threshold value and store unique keyframes.

Working on videos for the first time. please guide on how to proceed to achieve the expected output

解决方案

Here is a script to extract I-frames with ffprobe and OpenCV:

import os

import cv2

import subprocess

filename = '/home/andriy/Downloads/video.mp4'

def get_frame_types(video_fn):

command = 'ffprobe -v error -show_entries frame=pict_type -of default=noprint_wrappers=1'.split()

out = subprocess.check_output(command + [video_fn]).decode()

frame_types = out.replace('pict_type=','').split()

return zip(range(len(frame_types)), frame_types)

def save_i_keyframes(video_fn):

frame_types = get_frame_types(video_fn)

i_frames = [x[0] for x in frame_types if x[1]=='I']

if i_frames:

basename = os.path.splitext(os.path.basename(video_fn))[0]

cap = cv2.VideoCapture(video_fn)

for frame_no in i_frames:

cap.set(cv2.CAP_PROP_POS_FRAMES, frame_no)

ret, frame = cap.read()

outname = basename+'_i_frame_'+str(frame_no)+'.jpg'

cv2.imwrite(outname, frame)

print ('Saved: '+outname)

cap.release()

else:

print ('No I-frames in '+video_fn)

if __name__ == '__main__':

save_i_keyframes(filename)

You can change 'I' to 'P' if you need to extract P-frames.

你可能感兴趣的:(python短视频提取关键帧)