How to read mp4 video to be processed by scikit-image? How to read mp4 video to be processed by scikit-image? numpy numpy

How to read mp4 video to be processed by scikit-image?


Imageio python package should do what you want. Here is a python snippet using this package:

import pylabimport imageiofilename = '/tmp/file.mp4'vid = imageio.get_reader(filename,  'ffmpeg')nums = [10, 287]for num in nums:    image = vid.get_data(num)    fig = pylab.figure()    fig.suptitle('image #{}'.format(num), fontsize=20)    pylab.imshow(image)pylab.show()

enter image description hereenter image description here

You can also directly iterate over the images in the file (see the documentation ):

for i, im in enumerate(vid):    print('Mean of frame %i is %1.1f' % (i, im.mean()))

To install imageio you can use pip:

pip install imageio

An other solution would be to use moviepy (which use a similar code to read video), but I think imageio is lighter and does the job.


response to first comment

In order to check if the nominal frame rate is the same over the whole file, you can count the number of frame in the iterator:

count = 0try:    for _ in vid:        count += 1except RuntimeError:    print('something went wront in iterating, maybee wrong fps number')finally:    print('number of frames counted {}, number of frames in metada {}'.format(count, vid.get_meta_data()['nframes']))In [10]: something went wront in iterating, maybee wrong fps number         number of frames counted 454, number of frames in metada 461

In order to display the timestamp of each frame:

try:    for num, image in enumerate(vid.iter_data()):        if num % int(vid._meta['fps']):            continue        else:            fig = pylab.figure()            pylab.imshow(image)            timestamp = float(num)/ vid.get_meta_data()['fps']            print(timestamp)            fig.suptitle('image #{}, timestamp={}'.format(num, timestamp), fontsize=20)            pylab.show()except RuntimeError:    print('something went wrong')


You could use scikit-video, like this:

from skvideo.io import VideoCapturecap = VideoCapture(filename)cap.open()while True:    retval, image = cap.read()    # image is a numpy array containing the next frame    # do something with image here    if not retval:        break

This uses avconv or ffmpeg under the hood. The performance is quite good, with a small overhead to move the data into python compared to just decoding the video in avconv.

The advantage of scikit-video is that the API is exactly the same as the video reading/writing API of OpenCV; just replace cv2.VideoCapture with skvideo.io.VideoCapture.


An easy way to read video in python is using skviode. A single line code can help to read entire video.

import skvideo.io  videodata = skvideo.io.vread("video_file_name")  print(videodata.shape)

http://mllearners.blogspot.in/2018/01/scikit-video-skvideo-tutorial-for.html