1

I want to detect all cameras pluged to a linuxbox.

The best I found is this:

import cv2

def test_open_cam():
    connected_cam = []
    for port in range(0, 10):
        try:
            cam = cv2.VideoCapture(port)
            if cam.isOpened():
                connected_cam.append(port)
            cam.release()
            cv2.destroyAllWindows()
        except:
            cam.release()
            cv2.destroyAllWindows()
    print(f'=> list of found cameras: {connected_cam}')
    return(connected_cam)

When I run it I get it but with a lot of [ WARN:0]:

start
==> test port: 0
==> test port: 1
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video1): can't open camera by index
==> test port: 2
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video2): can't open camera by index
==> test port: 3
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video3): can't open camera by index
==> test port: 4
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video4): can't open camera by index
==> test port: 5
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video5): can't open camera by index
==> test port: 6
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video6): can't open camera by index
==> test port: 7
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video7): can't open camera by index
==> test port: 8
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video8): can't open camera by index
==> test port: 9
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video9): can't open camera by index
=> list of found cameras: [0]

How can I avoid all this [ WARN:0] ... and by the way avoid the ugly try: except ?

Note: using the proposition of Patrick Yeadon https://stackoverflow.com/a/61768256/3313834 from: Listing available devices in python-opencv

def test_open_cam():
    # checks the first 10 indexes.
    index = 0
    arr = []
    i = 10
    while i > 0:
        cap = cv2.VideoCapture(index)
        if cap.read()[0]:
            arr.append(index)
            cap.release()
        index += 1
        i -= 1
    return arr

I still get the same [ WARN:0] on cv2.VideoCapture (after the first one)

[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video1): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video2): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video3): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video4): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video5): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video6): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video7): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video8): can't open camera by index
[ WARN:0] global /tmp/pip-req-build-99ib2vsi/opencv/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video9): can't open camera by index

Following Christoph Rackwitz ideas I've try to replace cam = cv2.VideoCapture(port) with cam = cv2.VideoCapture(port, apiPreference=cv2.CAP_FFMPEG), no more WARN message ! but cam.isOpened() return False for all port ;(

>>> print(cv2.getBuildInformation()) 
...
  Video I/O:
    DC1394:                      NO
    FFMPEG:                      YES
      avcodec:                   YES (58.109.100)
      avformat:                  YES (58.61.100)
      avutil:                    YES (56.60.100)
      swscale:                   YES (5.8.100)
      avresample:                NO
    GStreamer:                   NO
    v4l/v4l2:                    YES (linux/videodev2.h)
user3313834
  • 7,327
  • 12
  • 56
  • 99

0 Answers0