Python: cómo capturar imágenes de la cámara web al hacer clic con OpenCV

Quiero capturar y guardar una serie de imágenes de mi cámara web utilizando OpenCV. Este es mi código actualmente:

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) 

El problema con esto es que no sé cuándo se están tomando las imágenes, por lo que muchas de ellas terminan siendo borrosas. Mi pregunta es: ¿hay alguna forma de que la imagen se tome con el clic de una tecla?

¿También hay una mejor manera de tomar múltiples imágenes, en lugar de rango?

Aquí hay un progtwig simple que muestra la imagen de la cámara en un cv2.namedWindow y tomará una instantánea cuando golpee SPACE . También se cerrará si presionas 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() 

Creo que esto debería responder a su pregunta en su mayor parte. Si hay alguna línea que no entienda, hágamelo saber y agregaré comentarios.

Si necesita capturar varias imágenes por pulsación de la tecla SPACE , necesitará un bucle interno o tal vez simplemente haga una función que capture un cierto número de imágenes.

Tenga en cuenta que los eventos clave provienen de la cv2.namedWindow por lo que deben estar enfocados.

Desglosando tu ejemplo de código

 import cv2 

importa openCV para su uso

 camera = cv2.VideoCapture(0) 

crea un objeto llamado cámara, del tipo de captura de video openCV, utilizando la primera cámara en la lista de cámaras conectadas a la computadora.

 for i in range(10): 

le dice al progtwig que haga un bucle con el siguiente código sangrado 10 veces

  return_value, image = camera.read() 

Lee los valores del objeto de la cámara, usando su método de lectura. responde con 2 valores guarda los 2 valores de datos en dos variables temporales llamadas “valor_retorno” e “imagen”

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

use el método openCV imwrite (que escribe una imagen en un disco) y escriba una imagen usando los datos en la variable de datos temporales

menos sangrías significa que el bucle ya ha finalizado …

 del(camera) 

Borra el objeto camrea, ya no lo necesitamos.

puede hacer lo que solicite de muchas maneras, una podría ser reemplazar el bucle for con un bucle while (ejecutándose para siempre, en lugar de 10 veces), y luego esperar una pulsación de tecla (como la respuesta de danidee mientras escribía)

o crea un servicio mucho más malvado que se oculta en el fondo y captura una imagen cada vez que alguien presiona el teclado.

No tengo mucha experiencia con open cv, pero si desea que se llame el código en el bucle for cuando se presiona una tecla, puede usar un bucle while y un raw_input y una condición para evitar que el bucle se ejecute para siempre

 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)