views:

1196

answers:

1

Hi

ive been trying to create a simple program with python which utilises opencv to get a video feed from my webcam and display it on the screen. I know im partly there because the window is created and the light on my webcam flicks on, but it just doesnt seem to show anything in the window. hopefully someone can explain what im doing wrong.

import cv

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
capture = cv.CaptureFromCAM(0)

def repeat():

    frame = cv.QueryFrame(capture)
    cv.ShowImage("w1", frame)


while True:
    repeat()

on an unrelated note, i have noticed that my webcam sometimes changes its index number in cv.CaptureFromCAM and sometimes i need to put in 0, 1 or 2 even though i only have one camera connected and i havnt unplugged it (i know because the light doesnt come on unless i change the index). is there a way to get python to determine the correct index?

thanks

Mitch

+1  A: 

Try adding the line c = highgui.cvWaitKey(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(0)
    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 = highgui.cvWaitKey(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.

Matt Boehm
that one little line of code worked a treat! thanks so much. however the camera index code didnt work, whatever device it sees at index 0 still returns true and breaks the for loop. this must be why so many examples i have all just show a black screen. is there any way to determine what is at index 0 so that i can turn it off? or alternatively change the webcam to 0?
Mitch
hmm, I'm not sure if there's an easy way to do this. rather than just verifying that capture is not a Nonetype, you could write more complicated code to query a frame and check if the frame is "all black" by maybe randomly sampling a few pixels therein. I think it may be better to just provide a prompt which shows a frame and asks the user if they want this camera or to try the next one.
Matt Boehm
Take a look at my edit above if you'd consider using user input to change cameras.
Matt Boehm
thanks, i like the idea!
Mitch