How to correctly check if a camera is available?

后端 未结 4 387
情歌与酒
情歌与酒 2021-01-12 06:46

I am using OpenCV to open and read from several webcams. It all works fine, but I cannot seem to find a way to know if a camera is available.

I tried this code (cam

相关标签:
4条回答
  • 2021-01-12 07:15

    Using cv2.VideoCapture( invalid device number ) does not throw exceptions. It constructs a <VideoCapture object> containing an invalid device - if you use it you get exceptions.

    Test the constructed object for None and not isOpened() to weed out invalid ones.


    For me this works (1 laptop camera device):

    import cv2 as cv 
    
    def testDevice(source):
       cap = cv.VideoCapture(source) 
       if cap is None or not cap.isOpened():
           print('Warning: unable to open video source: ', source)
    
    testDevice(0) # no printout
    testDevice(1) # prints message
    

    Output with 1:

    Warning: unable to open video source:  1
    

    Example from: https://github.com/opencv/opencv_contrib/blob/master/samples/python2/video.py lines 159ff

    cap = cv.VideoCapture(source)
        if 'size' in params:
            w, h = map(int, params['size'].split('x'))
            cap.set(cv.CAP_PROP_FRAME_WIDTH, w)
            cap.set(cv.CAP_PROP_FRAME_HEIGHT, h)
    if cap is None or not cap.isOpened():
        print 'Warning: unable to open video source: ', source
    
    0 讨论(0)
  • 2021-01-12 07:17

    You can try this code:

    from __future__ import print_function
    import numpy as np
    import cv2
    
    # detect all connected webcams
    valid_cams = []
    for i in range(8):
        cap = cv2.VideoCapture(i)
        if cap is None or not cap.isOpened():
            print('Warning: unable to open video source: ', i)
        else:
            valid_cams.append(i)
    
    caps = []
    for webcam in valid_cams:
        caps.append(cv2.VideoCapture(webcam))
    
    while True:
        # Capture frame-by-frame
        for webcam in valid_cams:
            ret, frame = caps[webcam].read()
            # Display the resulting frame
            cv2.imshow('webcam'+str(webcam), frame)
        k = cv2.waitKey(1)
        if k == ord('q') or k == 27:
            break
    
    # When everything done, release the capture
    for cap in caps:
        cap.release()
    
    cv2.destroyAllWindows()
    
    0 讨论(0)
  • 2021-01-12 07:29

    Here is a "NOT working" solution to help you prevent tumbling over in this pitfall:

    import cv2 as cv
    import PySpin
    
    print (cv.__version__)
    
    # provided by Patrick Artner as solution to be working for other cameras than
    #                                                  those of Point Grey (FLIR).
    
    def testDevice(source):
       cap = cv.VideoCapture(source) 
       if cap is None or not cap.isOpened():
           print('Warning: unable to open video source: ', source)
    
    # ... PySpin / Spinnaker (wrapper/SDK libary) ...
    
    system   = PySpin.System.GetInstance()
    cam_list = system.GetCameras()
    
    cam = ''
    cam_num = 0
    
    for ID, cam in enumerate(cam_list):
        # Retrieve TL device nodemap
        if ID == cam_num:
            print ('Got cam')
            cam = cam
    
            cam.Init()
    
            # ... CV2 again ...
    
            for i in range(10):
                testDevice(i) # no printout
    
    0 讨论(0)
  • 2021-01-12 07:37

    Another solution, which is available in Linux is to use the /dev/videoX device in the VideoCapture() call. The devices are there when the cam is plugged in. Together with glob(), it is trivial to get all the cameras:

    import cv2, glob
    
    for camera in glob.glob("/dev/video?"):
        c = cv2.VideoCapture(camera)
    

    Of course a check is needed on c using isOpened(), but you are sure you only scan the available cameras.

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