简体   繁体   中英

How can I extract frames from a video at a certain FPS?

I am able to extract the frames of a certain test.mp4 file using the following code:

import cv2
def get_frames():
    cap = cv2.VideoCapture('test.mp4')
    i = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        cv2.imwrite('test_'+str(i)+'.jpg', frame)
        i += 1

    cap.release()
    cv2.destroyAllWindows()

A lot of the frames that are extracted are useless (they're nearly identical). I need to be able to set a certain rate at which the frame extraction can be done.

I think you need to just skip frames based on a fixed cycle.

import cv2


def get_frames():
    cap = cv2.VideoCapture('test.mp4')
    i = 0
    # a variable to set how many frames you want to skip
    frame_skip = 10
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        if i > frame_skip - 1:
            cv2.imwrite('test_'+str(i)+'.jpg', frame)
            i = 0
            continue
        i += 1

    cap.release()
    cv2.destroyAllWindows()

Try below logic. Here, we are waiting for a period of time(based on frame rate) and reading the last frame.

def get_frames():
    cap = cv2.VideoCapture('test.mp4')
    frame_rate = 10
    prev = 0
    i = 0
    while cap.isOpened():
        time_elapsed = time.time() - prev
        ret, frame = cap.read()
        if not ret:
            break

        if time_elapsed > 1./frame_rate:
            # print(time_elapsed)
            prev = time.time()
            cv2.imwrite('./data/sample1/test_'+str(i)+'.jpg', frame)
            i += 1

    cap.release()
    cv2.destroyAllWindows()

As an alternative to writing your own code to do this, have you considered using FFMPEG? FFMPEG has the ability to extract all frames from a video and save them as images, it also can extract frames at a lower frame rate than the source video.

See here for a demonstration of what I think you're trying to do, and the arguments to give ffmpeg to do so.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM