Tomar foto de webcam con Python

Introducción

Ya vimos cómo tomar una foto de la cámara web o de cualquier dispositivo utilizando Javascript. En aquel post, guardábamos la foto con PHP. Hoy veremos cómo tomar una foto con Python y guardarla en el sistema.

Nota: te invito a leer cómo tomar la foto y guardarla en PHP.

Nota 2: ya existe otra versión en donde usamos Flask para mostrar una previsualización y exponer la cámara en un servidor web.

Requisitos

Tener instalado Python y pip. Aquí hay un tutorial para instalar Python 3.

Instalando OpenCV

Para poder acceder a la cámara del dispositivo, necesitamos el paquete de OpenCV. Para ello, ejecutamos lo siguiente en la línea de comandos:

pip install opencv-python

Voy a ejecutarlo en mi consola:

Si en tu caso no sale esto, no hay problema. La imagen se ve así porque ya lo había instalado previamente, pero lo desinstalé para efectos de este tutorial. Con que diga Successfully installed opencv-python… te puedes dar por satisfecho.

Accediendo a cámara

Muy bien, ahora sí podemos trabajar. El código es realmente sencillo. Accedemos a la cámara 0, vemos si se pudo abrir correctamente y si es así entonces escribimos el resultado en una imagen. En caso de que no se haya abierto la cámara, lo indicamos.

Código fuente

"""
	Tomar foto con Python y opencv

	@date 20-03-2018
	@author parzibyte
	@see https://www.parzibyte.me/blog
"""

import cv2


"""
	En este caso, 0 quiere decir que queremos acceder
	a la cámara 0. Si hay más cámaras, puedes ir probando
	con 1, 2, 3...
"""
cap = cv2.VideoCapture(0)

leido, frame = cap.read()

if leido == True:
	cv2.imwrite("foto.png", frame)
	print("Foto tomada correctamente")
else:
	print("Error al acceder a la cámara")

"""
	Finalmente liberamos o soltamos la cámara
"""
cap.release()

Aclaración sobre las cámaras

En este caso, accedemos a la cámara 0. Imaginemos que todas las cámaras del dispositivo son un arreglo. Los arreglos comienzan en 0. Si queremos acceder a la segunda cámara, utilizamos 1. Para la tercera, utilizamos 2. Y así sucesivamente, dependiendo del número de cámaras que tengamos.

Ejecutando código

Mi computadora sólo tiene una cámara, así que accedo el código que ejecuto es el mismo que puse allá arriba. Lo llamo desde mi computadora:

Tomar foto con Python y cámara web | Ejecución
Tomar foto con Python y cámara web | Ejecución

Lo ejecuté en D:\desarrollo_python, así que la foto se guardó ahí. En mis documentos iré a esa ubicación:

Foto guardada con éxito
Foto guardada con éxito

Y aquí dejo la foto que tomé:

No pienses que no funciona, simplemente mi cámara está cubierta. Pero si quieres, puedes seguir el tutorial y verás que no genera ningún problema.

Tomar foto con distinto nombre

Cada que llamamos al código de arriba, se sobrescribe la foto si ya existe. Si quisiéramos que tuviera un nombre distinto, podemos generar un id único utilizando uuid. La verdad no sé cómo funciona, sólo sé que genera un id que no se repite.

Por consecuencia, el código se modificaría así:

"""
	Tomar foto con Python y opencv

	@date 20-03-2018
	@author parzibyte
	@see https://www.parzibyte.me/blog
"""

import cv2
import uuid


"""
	En este caso, 0 quiere decir que queremos acceder
	a la cámara 0. Si hay más cámaras, puedes ir probando
	con 1, 2, 3...
"""
cap = cv2.VideoCapture(0)

leido, frame = cap.read()

if leido == True:
	nombre_foto = str(uuid.uuid4()) + ".png" # uuid4 regresa un objeto, no una cadena. Por eso lo convertimos
	cv2.imwrite(nombre_foto, frame)
	print("Foto tomada correctamente con el nombre {}".format(nombre_foto))
else:
	print("Error al acceder a la cámara")

"""
	Finalmente liberamos o soltamos la cámara
"""
cap.release()

Y al ejecutarlo múltiples veces:

Fotos con distintos nombres
Fotos con distintos nombres

Por cierto, uuid ya viene incluido, no necesitamos utilizar pip para instalarlo.

Bonus

Luego de escribir esta entrada, me dije… ¿podemos guardar la foto en un servidor? la respuesta es sí, y aquí explico cómo hacerlo al menos con PHP.

Conclusión

Qué manera más fácil de tomar una foto. También podemos tomar vídeos, múltiples fotos, etcétera. De hecho, opencv sirve para muchas cosas más allá de tomar simples fotos. Aquí dejo el enlace a la documentación oficial.

Con esto terminamos por hoy.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

10 comentarios en “Tomar foto de webcam con Python”

  1. Hey tengo una pregunta, el programa funciona bien, pero ¿Cómo puedo crearle una interfaz visual para poder ver todo antes de tomar la foto?

  2. Haciendo los ejercicios al momento de ver la foto que genera me sale una foto en negro, igual cuando hago el ejercicio de mostrar tipo vídeo con videocapture también me muestra en negro la imagen, sabes por que pasa esto? uso windows

    1. No lo sé, ¿en la consola no sale nada? tal vez el problema está en tu cámara, prueba tomando una foto con la aplicación nativa de tu PC para descartar errores de hardware

    2. Si hice la captura de varias fotos directamente con el programa nativo de mi pc y si pude tomar fotos, no se si exista alguna restricción o incompatibilidad tengo python 3.6 y opencv 3.4.3.18, numpy 1.15.3. no se si me hagan falta otras referencias soy nuevo en esto. muchas gracias

    3. Me parece que numpy no es necesario para esto. ¿Estás implementando el código tal y como está en los ejemplos? en caso de que sí, prueba cambiando la cámara a -1 de la siguiente manera:
      cap = cv2.VideoCapture(-1)

    4. jaja, resulta que desactive un momento mi antivirus y solucionado todo. después de haber intentado de todo. muchas gracias!

    5. Jaja qué bien, no se me habría ocurrido; ya que al menos Eset te avisa si una app quiere acceder a tu cámara web y supongo que tu antivirus no te notificó. En fin, gracias a ti por comentar tu solución. Saludos 🙂

  3. Pingback: Tomar foto con Javascript y cámara para guardarla en servidor PHP - Parzibyte's blog - El blog de Luis Cabrera

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *