Affichage d'un flux webcam en utilisant OpenCV et Python

J'ai essayé de créer un programme simple avec Python, qui utilise OpenCV pour obtenir un flux vidéo de la webcam et de l'afficher sur l'écran.

Je sais que je suis en partie là parce que la fenêtre est créée et que la lumière sur ma webcam s'allume, mais elle ne semble tout simplement pas montrer quoi que ce soit dans la fenêtre. J'espère que quelqu'un peut expliquer ce que je fais mal.

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

Sur une note sans rapport, j'ai remarqué que ma webcam change parfois son numéro d'index dans cv.CaptureFromCAM, et parfois, je dois mettre 0, 1 ou 2 même si je n'ai qu'une seule caméra connectée et que je ne l'ai pas débranchée (je le sais parce que la lumière ne s'allume pas à moins que je change l'index). Est-il un moyen d'obtenir Python pour déterminer l'index correct?

54
demandé sur Peter Mortensen 2010-04-08 19:30:14

6 réponses

, Essayez d'ajouter la ligne c = cv.WaitKey(10) en bas de votre repeat() méthode.

Cela attend 10 ms pour que l'utilisateur entre une clé. Même si vous n'utilisez pas du tout la clé, mettez-la. Je pense qu'il fallait juste un certain retard, donc time.sleep(10) peut aussi fonctionner.

En ce qui concerne l'index de la caméra, vous pouvez faire quelque chose comme ceci:

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

Cela trouvera l'index du premier périphérique de capture "fonctionnel", au moins pour les indices de 0-2. Il est possible qu'il y ait plusieurs appareils dans votre ordinateur reconnu comme un dispositif de capture approprié. La seule façon que je connaisse pour confirmer que vous avez la bonne est de regarder manuellement votre lumière. Peut-être obtenir une image et vérifier ses propriétés?

Pour ajouter une invite utilisateur au processus, vous pouvez lier une clé à la commutation de caméras dans votre boucle de répétition:

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

Avertissement: je n'ai pas testé cela, donc il peut y avoir des bugs ou tout simplement ne pas fonctionner, mais pourrait vous donner au moins une idée d'une solution de contournement.

41
répondu Matt Boehm 2012-02-01 23:04:09

Une mise à jour pour montrer comment le faire dans les versions récentes D'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()

Cela fonctionne dans OpenCV-2.4.2 pour moi.

69
répondu sastanin 2017-08-02 06:28:38

Si vous n'avez qu'une seule caméra, ou si vous ne vous souciez pas de savoir quelle caméra est la bonne, utilisez "-1" comme index. C'est à dire pour votre exemple capture = cv.CaptureFromCAM(-1).

7
répondu TinBane 2012-05-26 13:25:46

Essayez ce qui suit. C'est simple, mais je n'ai pas encore trouvé un moyen gracieux de sortir.

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()
1
répondu user808996 2015-01-27 20:28:08

Modifier import cv pour import cv2.cv as cv Voir aussi le post - ici.

1
répondu David 2015-01-28 00:35:06

Comme dans le OpenCV-doc , vous pouvez obtenir un flux vidéo à partir d'une caméra connectée à votre ordinateur en suivant le 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()

Vous pouvez changer cap = cv2.VideoCapture(0) index de 0 à 1 pour accéder à la 2ème caméra.
Testé dans opencv-3.2.0

1
répondu Ramesh-X 2017-06-09 17:57:21