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?
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.
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)
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.
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