Capturing video from two cameras in OpenCV at once

前端 未结 7 1162
别跟我提以往
别跟我提以往 2020-11-30 04:27

How do you capture video from two or more cameras at once (or nearly) with OpenCV, using the Python API?

I have three webcams, all capable of video streaming, locate

相关标签:
7条回答
  • 2020-11-30 04:42

    Yes you're definitely limited by the USB bandwidth. Attempting to read from both devices at full-rez you probably got error:

    libv4l2: error turning on stream: No space left on device
    VIDIOC_STREAMON: No space left on device
    Traceback (most recent call last):
      File "p.py", line 7, in <module>
        assert ret1 # fails?!
    AssertionError
    

    And then when you reduce the res to 160x120:

    import cv2
    cap0 = cv2.VideoCapture(0)
    cap0.set(3,160)
    cap0.set(4,120)
    cap1 = cv2.VideoCapture(1)
    cap1.set(3,160)
    cap1.set(4,120)
    ret0, frame0 = cap0.read()
    assert ret0 # succeeds
    ret1, frame1 = cap1.read()
    assert ret1 # fails?!
    

    now it seems to work! I bet you have both cams connected on the same USB card. You can run lsusb command to make sure, and it should indicate something like:

    Bus 001 Device 006: ID 046d:081b Logitech, Inc. Webcam C310
    Bus 001 Device 004: ID 0409:005a NEC Corp. HighSpeed Hub
    Bus 001 Device 007: ID 046d:0990 Logitech, Inc. QuickCam Pro 9000
    Bus 001 Device 005: ID 0409:005a NEC Corp. HighSpeed Hub
    Bus 001 Device 003: ID 0409:005a NEC Corp. HighSpeed Hub
    Bus 001 Device 002: ID 1058:0401 Western Digital Technologies, Inc. 
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    

    (Note both cameras on same bus.) If possible, you can add another USB card to your machine to gain more bandwidth. I've done this before in order to run multiple cams at full resolution on a single machine. Albeit that was a tower workstation with available motherboard slots, and unfortunately you may not have that option on a MacBook laptop.

    0 讨论(0)
  • 2020-11-30 04:43

    I have use "imutils" and read webcam show on the image.

    import imutils
    

    capture vedio frames

    #--- WebCam1
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH,300)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT,300)
    #--- WebCam2
    cap1 = cv2.VideoCapture(1)
    cap1.set(cv2.CAP_PROP_FRAME_WIDTH,300)
    cap1.set(cv2.CAP_PROP_FRAME_HEIGHT,300)
    #--- WebCam3
    cap2 = cv2.VideoCapture(2)
    cap2.set(cv2.CAP_PROP_FRAME_WIDTH,300)
    cap2.set(cv2.CAP_PROP_FRAME_HEIGHT,300)
    #--- WebCame4
    cap3 = cv2.VideoCapture(3)
    cap3.set(cv2.CAP_PROP_FRAME_WIDTH,300)
    cap3.set(cv2.CAP_PROP_FRAME_HEIGHT,300)
    

    i create function read_frame send parameter about Image.fromarray and display

    def read_frame():
        webCameShow(cap.read(),display1)
        webCameShow(cap1.read(),display2)
        webCameShow(cap2.read(),display6)
        webCameShow(cap3.read(),display7)   
        window.after(10, read_frame)
    

    and final function show video on the "imageFrame"

    def webCameShow(N,Display): 
        _, frameXX = N
        cv2imageXX = cv2.cvtColor(frameXX, cv2.COLOR_BGR2RGBA)
        imgXX = Image.fromarray(cv2imageXX)
        #imgtkXX = ImageTk.PhotoImage(image=imgXX)
        Display.imgtk = imgtkXX 
        Display.configure(image=imgtkXX)
    

    example. 4-webcam

    Youtube: Youtube

    0 讨论(0)
  • 2020-11-30 04:46

    This has been a pain for me for a long time, so I made a library on top of OpenCV to handle multiple cameras and viewports. I ran into a bunch of problems like videos not compressing by default, or windows only displaying in the main thread. I'm able to display two 720p webcams in real time on Windows so far.

    Try:

    pip install CVPubSubs
    

    Then, in python:

    import cvpubsubs.webcam_pub as w
    from cvpubsubs.window_sub import SubscriberWindows
    
    t1 = w.VideoHandlerThread(0)
    t2 = w.VideoHandlerThread(1)
    
    t1.start()
    t2.start()
    
    SubscriberWindows(window_names=['cammy', 'cammy2'],
                  video_sources=[0,1]
                  ).loop()
    
    t1.join()
    t1.join()
    

    It's relatively new though, so tell me about any bugs or unoptimized code.

    0 讨论(0)
  • 2020-11-30 04:46

    try to use this code... it worked as expected... this is for two cams,if you want more cams, just create the "VideoCapture()" objects...for example 3rd cam will have : cv2.VideoCapture(3) and corresponding code in the while loop

    import cv2
    
    frame0 = cv2.VideoCapture(1)
    frame1 = cv2.VideoCapture(2)
    while 1:
    
       ret0, img0 = frame0.read()
       ret1, img00 = frame1.read()
       img1 = cv2.resize(img0,(360,240))
       img2 = cv2.resize(img00,(360,240))
       if (frame0):
           cv2.imshow('img1',img1)
       if (frame1):
           cv2.imshow('img2',img2)
    
       k = cv2.waitKey(30) & 0xff
       if k == 27:
          break
    
    frame0.release()
    frame1.release()
    cv2.destroyAllWindows()
    

    ALL THE BEST !

    0 讨论(0)
  • 2020-11-30 04:52
    frame0 = cv2.VideoCapture(1)
    frame1 = cv2.VideoCapture(2)
    

    must be:

    frame0 = cv2.VideoCapture(0)  # index 0
    frame1 = cv2.VideoCapture(1)  # index 1
    

    So it runs

    0 讨论(0)
  • 2020-11-30 04:54

    Using OPENCV and two standard USB cameras, I was able to do this using multithreading. Essentially, define one function which opens an opencv window and VideoCapture element. Then, create two threads with the camera ID and window name as inputs.

    import cv2
    import threading
    
    class camThread(threading.Thread):
        def __init__(self, previewName, camID):
            threading.Thread.__init__(self)
            self.previewName = previewName
            self.camID = camID
        def run(self):
            print "Starting " + self.previewName
            camPreview(self.previewName, self.camID)
    
    def camPreview(previewName, camID):
        cv2.namedWindow(previewName)
        cam = cv2.VideoCapture(camID)
        if cam.isOpened():  # try to get the first frame
            rval, frame = cam.read()
        else:
            rval = False
    
        while rval:
            cv2.imshow(previewName, frame)
            rval, frame = cam.read()
            key = cv2.waitKey(20)
            if key == 27:  # exit on ESC
                break
        cv2.destroyWindow(previewName)
    
    # Create two threads as follows
    thread1 = camThread("Camera 1", 1)
    thread2 = camThread("Camera 2", 2)
    thread1.start()
    thread2.start()
    

    Great resource for learning how to thread in python: https://www.tutorialspoint.com/python/python_multithreading.htm

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