When switching from the legacy camera stack under Raspberry Pi OS with debian 10 to the new libcamera camera stack (in Raspberry Pi OS with debian 11 it is standard), I cannot use OpenCV any longer.

Even if I try a very simple example like this one:

import cv2

cap = cv2.VideoCapture(0)

# Capture frame
ret, frame = cap.read()
if ret:
    cv2.imwrite('image.jpg', frame)


With the legacy camera stack it works without any issue and when I add the line


in the file /boot/config.txt and do a reboot, I get this error message:

python3 cv2test.py 
[ WARN:0] global /tmp/pip-wheel-2c57qphc/opencv-python_86774b87799240fbaa4c11c089d08cc3/opencv/modules/videoio/src/cap_v4l.cpp (890) open VIDEOIO(V4L2:/dev/video0): can't open camera by index

Often read recommendations like modify cv2.VideoCapture(0) into cv2.VideoCapture(cv2.CAP_V4L2) or cv2.VideoCapture(1) or cv2.VideoCapture(-1) did not help.

The camera works well. I can run this without trouble:

libcamera-vid -t 0

This is the output of v4l2-ctl:

$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):

bcm2835-isp (platform:bcm2835-isp):

unicam (platform:fe801000.csi):

I also gave /dev/video* full permissions (777) just to ensure that it is not a permission issue. But this does not help.

My user (pi) is also a member of the group video:

$ whoami
$ groups
pi adm dialout cdrom sudo audio video plugdev games users input netdev lpadmin gpio i2c spi

I installed OpenCV via pip:

$ pip3 list | grep cv

$ uname -a
Linux raspberrypi 5.10.63-v7l+ #1496 SMP Wed Dec 1 15:58:56 GMT 2021 armv7l GNU/Linux

Has anyone here an idea of how to get /dev/video? with opencv working with the libcamera camera stack?

2 Answers 2


I got the same issue and after some research I found that in Debian 11 Bullseye, you can only capture live video with a streaming framework, like gstreamer or ffmpeg.

So you will have to compile OpenCV and OpenCV-Python with the gstreamer support then you have to tell to OpenCV to capture the video from gstreamer.

This is the gstreamer command using libcamera as source, try and see if it works out of OpenCV.

$ gst-launch-1.0 libcamerasrc ! video/x-raw, width=1280, height=720, framerate=30/1 ! videoconvert ! videoscale ! clockoverlay time-format="%D %H:%M:%S" ! video/x-raw, width=640, height=360 ! autovideosink

Then in your Python code, you do this:

import cv2
pipeline = "libcamerasrc ! video/x-raw, width=640, height=480, framerate=15/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink"

cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)

I hope it helps, let me know if it works for you.


This issue is due to the interruption. Try to end the execution with the key 'q' for example, don't close the window suddenly.

I solved the same issue by opening terminal again and execute the same script again.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.