web-dev-qa-db-fra.com

Python: comment capturer une image de la webcam sur un clic en utilisant OpenCV

Je souhaite capturer et enregistrer un certain nombre d'images de ma webcam avec OpenCV. C'est mon code actuellement:

import cv2

camera = cv2.VideoCapture(0)
for i in range(10):
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
del(camera)

Le problème, c’est que je ne sais pas quand les images sont prises, alors beaucoup d’entre elles sont floues. Ma question est la suivante: Existe-t-il un moyen de prendre l’image en un clic de souris?

En outre, existe-t-il un meilleur moyen de prendre plusieurs images au lieu de la plage?

17
user5673516

Voici un programme simple qui affiche le flux de la caméra dans un cv2.namedWindow et prendra un instantané lorsque vous appuierez sur SPACE. Il s’arrêtera également si vous appuyez sur ESC.

import cv2

cam = cv2.VideoCapture(0)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    cv2.imshow("test", frame)
    if not ret:
        break
    k = cv2.waitKey(1)

    if k%256 == 27:
        # ESC pressed
        print("Escape hit, closing...")
        break
    Elif k%256 == 32:
        # SPACE pressed
        img_name = "opencv_frame_{}.png".format(img_counter)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        img_counter += 1

cam.release()

cv2.destroyAllWindows()

Je pense que cela devrait répondre à votre question pour la plupart. S'il y a une ligne que vous ne comprenez pas, faites-le-moi savoir et j'ajouterai des commentaires.

Si vous avez besoin de saisir plusieurs images à la pression de la touche SPACE, vous aurez besoin d’une boucle interne ou, éventuellement, d’une fonction permettant de saisir un certain nombre d’images.

Notez que les événements clés proviennent de la cv2.namedWindow donc il doit avoir le focus.

37
derricw

je ne suis pas trop expérimenté avec open cv mais si vous souhaitez que le code de la boucle for soit appelé lorsqu'une touche est enfoncée, vous pouvez utiliser une boucle while, un raw_input et une condition empêchant la boucle de s'exécuter à jamais.

import cv2

camera = cv2.VideoCapture(0)
i = 0
while i < 10:
    raw_input('Press Enter to capture')
    return_value, image = camera.read()
    cv2.imwrite('opencv'+str(i)+'.png', image)
    i += 1
del(camera)
2
danidee

Décomposer votre exemple de code

import cv2

importe openCV pour utilisation

camera = cv2.VideoCapture(0)

crée un objet appelé caméra, de type capture vidéo openCV, en utilisant la première caméra dans la liste des caméras connectées à l'ordinateur.

for i in range(10):

indique au programme de boucler le code indenté suivant 10 fois

    return_value, image = camera.read()

lire les valeurs de l'objet caméra, en utilisant sa méthode de lecture. il résonne avec 2 valeurs et enregistre les 2 valeurs de données dans deux variables temporaires appelées "return_value" et "image"

    cv2.imwrite('opencv'+str(i)+'.png', image)

utilisez la méthode openCV imwrite (qui écrit une image sur un disque) et écrivez une image en utilisant les données de la variable de données temporaire

moins de retraits signifie que la boucle est maintenant terminée ...

del(camera)

supprime l'objet camrea, nous n'en avons plus besoin.

vous pouvez demander ce que vous demandez de plusieurs façons, par exemple, remplacer la boucle for par une boucle while (toujours, au lieu de 10 fois), puis attendre une pression de touche (comme si vous aviez répondu par danidee pendant que je tapais)

ou créez un service beaucoup plus diabolique qui se cache en arrière-plan et capture une image chaque fois que quelqu'un appuie sur le clavier.

2
Henrik

Voici un programme simple pour capturer une image à l'aide de la caméra par défaut d'un ordinateur portable. J'espère que ce sera une méthode très facile pour tous.

import cv2

# 1.creating a video object
video = cv2.VideoCapture(0) 
# 2. Variable
a = 0
# 3. While loop
while True:
    a = a + 1
    # 4.Create a frame object
    check, frame = video.read()
    # Converting to grayscale
    #gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    # 5.show the frame!
    cv2.imshow("Capturing",frame)
    # 6.for playing 
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
# 7. image saving
showPic = cv2.imwrite("filename.jpg",frame)
print(showPic)
# 8. shutdown the camera
video.release()
cv2.destroyAllWindows 

Vous pouvez voir mon code github ici

0