İbrahim Uğur ABA
İbrahim Uğur ABA

Reputation: 150

Python: How to get some images from a video in Python3?

How can I extract frames from a video file using Python3?

For example, I want to get 16 picture from a video and combine them into a 4x4 grid.

I don't want 16 separate images at the end, I want one image containing 16 frames from the video.

----Edit----

import av

container = av.open('/home/uguraba/Downloads/equals/equals.mp4')
video = next(s for s in container.streams)
for packet in container.demux(video):
    for frame in packet.decode():
        if frame.index %3000==0:
            frame.to_image().save('/home/uguraba/Downloads/equals/frame-%04d.jpg' % frame.index)

By using this script i can get frames. There will be lots of frames saved. Can i take specific frames like 5000-7500-10000 ?

Also my question is how can i see the total frame number ?

Upvotes: 1

Views: 4153

Answers (2)

Hamlett
Hamlett

Reputation: 400

You can do that with OpenCV3, the Python wrapper and Numpy. First you need to do is capture the frames then save them separately and finally paste them all in a bigger matrix.

import numpy as np
import cv2

cap = cv2.VideoCapture(video_source)

# capture the 4 frames
_, frame1 = cap.read()
_, frame2 = cap.read()
_, frame3 = cap.read()
_, frame4 = cap.read()

# 'glue' the frames using numpy and vertigal/horizontal stacks
big_frame = np.vstack((np.hstack((frame1, frame2)),
                       np.hstack((frame3, frame4))))

# Show a 4x4 unique frame
cv2.imshow('result', big_frame)

cv2.waitKey(1000)

To compile and install OpenCV3 and Numpy in Python3 you can follow this tutorial.

You can implement a kind of "control panel" from 4 different video sources with something like that:

import numpy as np
import cv2

cam1 = cv2.VideoCapture(video_source1)
cam2 = cv2.VideoCapture(video_source2)
cam3 = cv2.VideoCapture(video_source3)
cam4 = cv2.VideoCapture(video_source4)

while True:
    more1, frame_cam1 = cam1.read()
    more2, frame_cam2 = cam2.read()
    more3, frame_cam3 = cam3.read()
    more4, frame_cam4 = cam4.read()

    if not all([more1, more2, more3, more4]) or cv2.waitKey(1) & 0xFF in (ord('q'), ord('Q')):
        break

    big_frame = np.vstack((np.hstack((frame_cam1, frame_cam2)),
                           np.hstack((frame_cam3, frame_cam4))))

    # Show a 4x4 unique frame
    cv2.imshow('result', big_frame)

print('END. One or more sources ended.')

Upvotes: 0

Dalen
Dalen

Reputation: 4236

Use PyMedia or PyAV to access image data and PIL or Pillow to manipulate it in desired form(s).

These libraries have plenty of examples, so with basic knowledge about the video muxing/demuxing and picture editing you should be able to do it pretty quickly. It's not so complicated as it would seem at first.

Essentially, you demux the video stream into frames, going frame by frame.

You get the picture either in its original (e.g. JPEG) or raw form and push it into PIL/Pillow.

You do with it what you want, resizing etc... - PIL provides all necessary stuff.

And then you paste it into one big image at desired position.

That's all.

Upvotes: 1

Related Questions