web-dev-qa-db-fra.com

Affichage d’un flux webcam avec OpenCV et Python

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

Je sais que je suis en partie présent parce que la fenêtre est créée et que la lumière de ma webcam s'allume, mais cela ne semble simplement pas montrer quoi que ce soit dans la fenêtre. J'espère que quelqu'un pourra 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 indépendante, j'ai remarqué que ma webcam change parfois son numéro d'index dans cv.CaptureFromCAM, et parfois je dois mettre en 0, 1 ou 2 alors que je n’ai qu’une seule caméra connectée et que je ne l’ai pas débranchée (je sais parce que la lumière ne s’allume pas à moins que je ne modifie l’index). Existe-t-il un moyen d'obtenir Python pour déterminer le bon index?

55
Mitch

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

Ceci attend 10 ms pour que l'utilisateur entre une clé. Même si vous n'utilisez pas la clé du tout, mettez ceci dans. Je pense qu'il faut juste qu'il y ait un peu de retard, donc time.sleep(10) peut également 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 "en fonctionnement", du moins pour les index de 0 à 2. Il est possible que plusieurs ordinateurs de votre ordinateur soient reconnus comme un périphérique de capture approprié. Le seul moyen que je connaisse pour confirmer que vous avez le bon est de regarder manuellement votre lampe. Peut-être obtenir une image et vérifier ses propriétés?

Pour ajouter une invite utilisateur au processus, vous pouvez associer une clé permettant de changer de caméra 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()

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

41
Matt Boehm

Une mise à jour pour montrer comment procéder 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.

73
sastanin

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

8
TinBane

Essayez ce qui suit. C'est simple, mais je n'ai pas encore trouvé de moyen élégant pour 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
user808996

Comme dans le opencv-doc , vous pouvez obtenir le flux vidéo 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 En 1 Pour accéder à la deuxième caméra.
Testé dans opencv-3.2.0

1
Ramesh-X

changement import cv à import cv2.cv as cv Voir aussi le post ici .

1
David