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:
Lo ejecuté en D:\desarrollo_python, así que la foto se guardó ahí. En mis documentos iré a esa ubicación:
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:
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.
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?
HOLa, podes hacerlo con tkinter.
Hola! con gusto atiendo su solicitud en https://parzibyte.me#contacto
Saludos 🙂
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
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
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
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)
jaja, resulta que desactive un momento mi antivirus y solucionado todo. después de haber intentado de todo. muchas gracias!
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 🙂
Pingback: Tomar foto con Javascript y cámara para guardarla en servidor PHP - Parzibyte's blog - El blog de Luis Cabrera