2010-04-08 16 views
53

Ich habe versucht, ein einfaches Programm mit Python zu erstellen, das OpenCV verwendet, um einen Video-Feed von meiner Webcam zu erhalten und auf dem Bildschirm anzuzeigen.Anzeigen eines Webcam-Feeds mit OpenCV und Python

Ich weiß, dass ich teilweise da bin, weil das Fenster erstellt wird und das Licht auf meiner Webcam anklickt, aber es scheint nur nichts im Fenster zu zeigen. Hoffentlich kann jemand erklären, was ich falsch mache.

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() 

auf einer nicht verwandte Notiz habe ich bemerkt, dass mein Webcam seine Indexnummer in cv.CaptureFromCAM manchmal ändert, und manchmal brauche ich nur in 0, 1 oder 2, obwohl ich eine Kamera haven verbunden und ich habe setzen‘ Ich habe es ausgesteckt (ich weiß, weil das Licht nicht aufleuchtet, wenn ich den Index nicht ändere). Gibt es eine Möglichkeit, Python dazu zu bringen, den korrekten Index zu ermitteln?

+0

Ich hatte dieses Problem vor ein paar Monaten ... lassen Sie mich meine Lösung für das Problem aufspüren. –

Antwort

41

Versuchen Sie, die Zeile c = cv.WaitKey(10) am Ende Ihrer repeat() Methode hinzuzufügen.

Dies wartet auf 10 ms, damit der Benutzer einen Schlüssel eingeben kann. Auch wenn Sie den Schlüssel überhaupt nicht verwenden, legen Sie das ein. Ich denke, dass es nur eine gewisse Verzögerung geben musste, so kann time.sleep(10) auch funktionieren.

In Bezug auf die Kamera-Index, könnten Sie so etwas tun:

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

Dadurch wird der Index des ersten „arbeiten“ Aufnahmegerät, zumindest für Indizes von 0-2 zu finden. Es ist möglich, dass mehrere Geräte in Ihrem Computer als geeignete Aufnahmegeräte erkannt werden. Der einzige Weg, den ich kenne, um zu bestätigen, dass Sie den richtigen haben, ist das manuelle Betrachten Ihres Lichts. Vielleicht ein Bild bekommen und seine Eigenschaften überprüfen?

Um eine Benutzeraufforderung zum Prozess hinzufügen, könnten Sie einen Schlüssel zum Schalten Kamera in Ihrer Wiederholungsschleife binden:

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() 

Haftungsausschluss: Ich habe diese Fehler nicht getestet, so kann es haben oder einfach nicht funktionieren , aber könnte Ihnen zumindest eine Vorstellung von einem Workaround geben.

+0

, dass eine kleine Codezeile ein Leckerbissen war! vielen Dank. Der Kamera-Index-Code funktionierte jedoch nicht, das Gerät, das bei Index 0 angezeigt wird, gibt weiterhin true zurück und bricht die for-Schleife. Das muss der Grund sein, warum so viele Beispiele ich alle nur einen schwarzen Bildschirm zeigen. Gibt es eine Möglichkeit zu bestimmen, was bei Index 0 ist, so dass ich es ausschalten kann? oder alternativ die Webcam auf 0 ändern? – Mitch

+0

hmm, ich bin mir nicht sicher, ob es einen einfachen Weg gibt, dies zu tun. Anstatt nur zu überprüfen, dass die Erfassung kein Non-Typ ist, könnten Sie komplizierteren Code schreiben, um einen Rahmen abzufragen und prüfen, ob der Rahmen "ganz schwarz" ist, indem Sie zufällig ein paar Pixel darin abtasten. Ich denke, es ist vielleicht besser, nur eine Eingabeaufforderung zu geben, die einen Rahmen anzeigt und den Benutzer fragt, ob er diese Kamera möchte oder die nächste versuchen möchte. –

+0

Werfen Sie einen Blick auf meine obige Bearbeitung, wenn Sie Benutzereingaben zum Ändern von Kameras in Erwägung ziehen. –

7

Wenn Sie nur eine Kamera haben oder sich nicht darum kümmern, welche Kamera die richtige ist, verwenden Sie "-1" als Index. Dh für Ihr Beispiel capture = cv.CaptureFromCAM(-1).

0

Änderung import cv zu import cv2.cv as cv Siehe auch den Beitrag here.

68

Ein Update zu zeigen, wie es in den neueren Versionen von OpenCV zu tun:

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() 

Es ist für mich in OpenCV-2.4.2 funktioniert.

+0

Endlich .. vielen dank –

+4

Danke. Ein Vorschlag: Fügen Sie nach der while-Schleife Folgendes hinzu: cv2.destroyWindow ("Vorschau") – Luke

+8

Ein weiterer Vorschlag: Fügen Sie nach der while-Schleife vc.release() hinzu. Andernfalls können Sie es nicht erneut ausführen, ohne den Prozess zu beenden, da der Handle noch geöffnet ist. –

1

Versuchen Sie Folgendes. Es ist einfach, aber ich habe noch keinen anmutigen Weg gefunden, um es zu verlassen.

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

Wie in der opencv-doc Sie Video-Feed von einer Kamera bekommen, die an den Computer angeschlossen wird durch folgenden 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() 

Sie können cap = cv2.VideoCapture(0) Index 0-1 ändern, um die zweite Kamera zuzugreifen.
Getestet in opencv-3.2.0