Listing available devices in python-opencv

前端 未结 6 648
暖寄归人
暖寄归人 2020-12-03 14:32

I have two webcams attached to my laptop (one built in), both of which work. (If I use Cheese, a webcam thingy that comes with Ubuntu, it uses the external one). If I use

相关标签:
6条回答
  • 2020-12-03 15:04

    I have been able to work around this problem by iterating over the webcam indexes until reading that camera no longer returns anything:

    index = 0
    arr = []
    while True:
        cap = cv2.VideoCapture(index)
        if not cap.read()[0]:
            break
        else:
            arr.append(index)
        cap.release()
        index += 1
    return arr
    

    This method returns a list of all indexes that return something when read; I'm sure it can be improved upon, but there are hardly ever more than a few webcams and this runs pretty quickly.

    0 讨论(0)
  • 2020-12-03 15:06

    I think you should try this:

    import cv2
    
    cap = cv2.VideoCapture(1)
    
    while True:
        _, frame = cap.read()
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    0 讨论(0)
  • 2020-12-03 15:10

    I believe that under Linux the valid indices for video inputs are the numbers of the videoN devices in the /dev directory. Hence the following will give a list of valid indices:

    import os
    devs = os.listdir('/dev')
    vid_indices = [int(dev[-1]) for dev in devs 
                   if dev.startswith('video')]
    vid_indices = sorted(vid_indices)
    vid_indices
    
    0 讨论(0)
  • 2020-12-03 15:15

    This is a general problem of the OpenCV, as you can see below. It seems that only the builtin, or the first USB cam (only if you do not have a buildin cam) works in OpenCV:

    How to use a camera with OpenCV

    Cannot access usb webcam through OpenCV, Cygwin

    OpenCV capture from USB not iSight (OSX)

    Currently, there is no way to extract the number of cameras, as listed in this feature request:

    https://code.ros.org/trac/opencv/ticket/935

    0 讨论(0)
  • 2020-12-03 15:15

    Great answer by @Patrick, but I'd like to improve on it and can't comment yet.

    I think Patricks setup assumes that the cameras do not have empty indexes in between them. But in my case, my built-in camera was at index 0, and USB webcam was at index 2. So "if not cap.read()[0]" broke out of the while loop at index 1, never catching the others. We have to specify how many indexes we're willing to go over and check, and just not add the ones that are null.

    def returnCameraIndexes():
        # 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
    

    This successfully gave me the indexes I need. Again, thanks to Patrick for the layout!

    0 讨论(0)
  • 2020-12-03 15:17

    For windows, you can build a .pyd extension. https://github.com/yushulx/python-capture-device-list

    There isn't an easy crossplatform way yet; ideally someone collates a solution for each OS and then builds them into .pyd.

    0 讨论(0)
提交回复
热议问题