En este tutorial te enseñaremos a programar una cámara que te permita observar y tomar fotografías de tu webcam. Además aprenderás a usar opencv para procesos de visión artificial y además a construir interfaces gráficas sencillas con PySimpleGUI
Al final del tutorial podrías descargar el código fuente del programa. Vamos adelante:
Iniciamos importando las librerías necesarias:
import PySimpleGUI as sg
from datetime import date
import cv2
datetime viene incluido desde la instalación de Python. Si no tienes instalado Opencv puedes hacerlo con el comando pip install opencv-python.
Para usar PySimpleGUI también puedes instalarlo con PIP, pero no será necesario ya que en los archivos del código estoy incluyendo un archivo .py que contiene toda la librería de PySimpleGUI.
Ahora, debemos obtener acceso a nuestra webcam, lo haremos usando Opencv, donde el método VideoCapture recibe como parámetro el id de la cámara destino, en este caso la webcam.
def main()
#Conectamos a la webcam
camara = cv2.VideoCapture(0)
Una vez lista la conexión a la webcam, podemos definir un diseño sencillo. Agregamos un elemento de tipo imagen la cual mostrara el video de la webcam y un par de botones para tomar fotografía y salir del programa.
#Elegimos un tema de PySimpleGUI
sg.theme('DarkGreen5')
#Definimos los elementos de la interfaz grafica
layout = [[sg.Image(filename='', key='-image-')],
[sg.Button('Tomar Fotografia'),sg.Button('Salir')]]
#Creamos la interfaz grafica
window = sg.Window('Camara FACIALIX',
layout,
no_titlebar=False,
location=(0, 0))
image_elem = window['-image-']
La variable image_elem nos permitirá actualizar su contenido conforme vayamos obteniendo video de la webcam.
Para empezar a obtener video de la cámara lo haremos a través de un ciclo while, el cual se repetirá mientras la cámara se encuentre abierta.
Conforme el ciclo while avance leeremos los cambios que ocurran en la interfaz gráfica. Si el usuario da clic al botón “Exit” saldremos del ciclo while y terminaremos la ejecución del programa.
while camara.isOpened():
#Obtenemos informacion de la interfaz grafica y video
event, values = window.read(timeout=0)
ret, frame = camara.read()
#Si salimos
if event in ('Exit', None):
break
#Si tomamos foto
elif event == 'Tomar Fotografia':
ruta = sg.popup_get_folder(title='Guardar Fotografia', message="Carpeta destino")
cv2.imwrite(ruta + "/" + str(date.today()) + str(numero) + ".png", frame)
if not ret:
break
Si se da clic al botón “Tomar Fotografia” se ejecutara una ventana emergente que solicitara una carpeta destino para almacenar la fotografía.
Usando método imwrite podremos almacenar la imagen capturada en la ruta elegida, con el nombre de la fecha actual.
Si no ocurre ningún clic actualizaremos la interfaz grafica con el video proveniente de la webcam, para ello debemos convertir el frame de video a un tipo bytes, de este modo sera compatible con la interfaz.
Seguido de esto, actualizaremos el elemento image_elem con el frame convertido a bytes.
if not ret:
break
#Mandamos el video a la GUI
imgbytes = cv2.imencode('.png', frame)[1].tobytes() # ditto
image_elem.update(data=imgbytes)
numero = numero + 1
Y finalmente mandamos a llamar el método Main para ejecutar el programa. También puedes hacerlo desde consola con el comando python cámara.py
El programa final debe mostrar el vídeo de la webcam y permitirnos tomar fotografías
Si quieres descargar el código fuente y apoyarnos para traerte más tutoriales usa el siguiente botón
¿hay manera de tomar fotos al detectarse un objeto? Sin presionar un botón, que fuera de manera automática al detectarse.
Muy bueno nada mas una pregunta si tengo un formulario como dibujo un cuadro junto al formulario para tomar esa foto? GRACIAS
Gracias por el tutorial. Un par de preguntas y una sugerencia:
Las preguntas:
1- Cuando activo la cámara, izquierda y derecha están invertidas. Cómo puedo corregir este punto?
2- El botón de «salida» no funciona. Cómo puedo solventarlo?
La sugerencia:
Deberían hacer este tutorial un video para su canal de TY.
Gracias!