Displaying a webcam feed using OpenCV and Python

前端 未结 6 1508
闹比i
闹比i 2020-11-27 11:31

I have been trying to create a simple program with Python which uses OpenCV to get a video feed from my webcam and display it on the screen.

I know I am partly there

相关标签:
6条回答
  • 2020-11-27 11:41

    If you only have one camera, or you don't care which camera is the correct one, then use "-1" as the index. Ie for your example capture = cv.CaptureFromCAM(-1).

    0 讨论(0)
  • 2020-11-27 11:43

    Try the following. It is simple, but I haven't figured out a graceful way to exit yet.

    import cv2.cv as cv
    import time
    
    cv.NamedWindow("camera", 0)
    
    capture = cv.CaptureFromCAM(0)
    
    while True:
        img = cv.QueryFrame(capture)
        cv.ShowImage("camera", img)
        if cv.WaitKey(10) == 27:
            break
    cv.DestroyAllWindows()
    
    0 讨论(0)
  • 2020-11-27 11:46

    Try adding the line c = cv.WaitKey(10) at the bottom of your repeat() method.

    This waits for 10 ms for the user to enter a key. Even if you're not using the key at all, put this in. I think there just needed to be some delay, so time.sleep(10) may also work.

    In regards to the camera index, you could do something like this:

    for i in range(3):
        capture = cv.CaptureFromCAM(i)
        if capture: break
    

    This will find the index of the first "working" capture device, at least for indices from 0-2. It's possible there are multiple devices in your computer recognized as a proper capture device. The only way I know of to confirm you have the right one is manually looking at your light. Maybe get an image and check its properties?

    To add a user prompt to the process, you could bind a key to switching cameras in your repeat loop:

    import cv
    
    cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
    camera_index = 0
    capture = cv.CaptureFromCAM(camera_index)
    
    def repeat():
        global capture #declare as globals since we are assigning to them now
        global camera_index
        frame = cv.QueryFrame(capture)
        cv.ShowImage("w1", frame)
        c = cv.WaitKey(10)
        if(c=="n"): #in "n" key is pressed while the popup window is in focus
            camera_index += 1 #try the next camera index
            capture = cv.CaptureFromCAM(camera_index)
            if not capture: #if the next camera index didn't work, reset to 0.
                camera_index = 0
                capture = cv.CaptureFromCAM(camera_index)
    
    while True:
        repeat()
    

    disclaimer: I haven't tested this so it may have bugs or just not work, but might give you at least an idea of a workaround.

    0 讨论(0)
  • 2020-11-27 11:47

    change import cv to import cv2.cv as cv See also the post here.

    0 讨论(0)
  • 2020-11-27 11:49

    As in the opencv-doc you can get video feed from a camera which is connected to your computer by following code.

    import numpy as np
    import cv2
    cap = cv2.VideoCapture(0)
    while(True):
        # Capture frame-by-frame
        ret, frame = cap.read()
        # Our operations on the frame come here
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # Display the resulting frame
        cv2.imshow('frame',gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()
    

    You can change cap = cv2.VideoCapture(0) index from 0 to 1 to access the 2nd camera.
    Tested in opencv-3.2.0

    0 讨论(0)
  • 2020-11-27 11:55

    An update to show how to do it in the recent versions of OpenCV:

    import cv2
    
    cv2.namedWindow("preview")
    vc = cv2.VideoCapture(0)
    
    if vc.isOpened(): # try to get the first frame
        rval, frame = vc.read()
    else:
        rval = False
    
    while rval:
        cv2.imshow("preview", frame)
        rval, frame = vc.read()
        key = cv2.waitKey(20)
        if key == 27: # exit on ESC
            break
    
    cv2.destroyWindow("preview")
    vc.release()
    

    It works in OpenCV-2.4.2 for me.

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