Schematic diagram of the resulting architecture with Nginx and Auth0.

Published: March 6, 2021

Webcam Capture in Python (without OpenCV)

Did you know that there is a python library that allows you to capture both a webcam stream or a single webcam image? Did you know that this works on every OS? This is what I want to share in this post: A tutorial on how to use ImageIO to access your webcam on Linux, Windows, or MacOS that works in either a Python script or a Jupyter Notebook. No OpenCV needed :)

Before we begin, a caveat for Jupyter: While the notebook is displayed on your current machine, and widgets run locally, your kernel (that runs the python code) may be hosted on a remote server, docker container, virtual machine, … depending on your setup. If this is the case for you, please note that IPython can only access the remote server’s webcam, not your local one.

Installation

pip install imageio[ffmpeg]

Get a single Image/Screenshot

import imageio as iio
import matplotlib.pyplot as plt

camera = iio.get_reader("<video0>")
screenshot = camera.get_data(0)
camera.close()

plt.imshow(screenshot)

Get a Video as a Sequence of Frames

import imageio as iio
import matplotlib.pyplot as plt
import time

camera = iio.get_reader("<video0>")
meta = camera.get_meta_data()
delay = 1/meta["fps"]
for frame_counter in range(15):
    frame = camera.get_next_data()
    time.sleep(delay)
camera.close()
plt.imshow(frame)

Full example (record a short MP4)

import imageio as iio
import matplotlib.pyplot as plt
import time

camera = iio.get_reader("<video0>")
meta = camera.get_meta_data()
num_frames = 5 * int(meta["fps"])
delay = 1/meta["fps"]

buffer = list()
for frame_counter in range(num_frames):
    frame = camera.get_next_data()
    buffer.append(frame)
    time.sleep(delay)

camera.close()

iio.mimwrite("frames.mp4", buffer, macro_block_size=8, fps=meta["fps"])

That’s it.

Thanks for reading and Happy Coding!