ESP32-Cam: primeros pasos y algo de Python

Estos días estuve probando esta versión de ESP32 con cámara, si bien esta hace ya algún tiempo, recién logro tener uno para hacer algunas pruebas, y puedo decir que quede impresionado.

No solo que es muy compacto, sino que la resolución y la forma de instalarse es muy sencilla. A continuación los primeros pasos para trabajar con este módulo.

Entorno de desarrollo

Al igual que con el ESP8266 es necesario incluir una serie de librerías y herramientas para utilizar el ESP32-CAM junto con el Arduino IDE, para ello debemos agregar dentro de Archivos – Preferencias la siguiente URL: https://dl.espressif.com/dl/package_esp32_index.json

Confirmamos, y luego desde el menú Herramientas – Gestor de tarjetas, buscamos ESP32 y lo instalamos. En mi caso tenia instalado una versión anterior, tuve que eliminar y volver a instalar la nueva.

Libreria ESP32CAM

Utilizaremos esta librería para acceder fácilmente a la cámara del modulo; la descargamos desde Github en el siguiente link:
https://github.com/yoursunny/esp32cam

Luego la instalamos desde Programas – Incluir librerías – Añadir biblioteca ZIP.

Concluidos estos pasos, podemos pasar a ver como lo conectamos

Conexiones

Para cargar el programa en el ESP32-CAM, debido a que no cuenta con un puerto USB, sera necesario utilizar un conversor USB-Serial, se utiliza el siguiente esquema:

Conversor USB-SerialESP32-CAM
RXTX
TXRX
VCC5V (no conectarlo a 3v3)
GNDGND

Además debemos conectar, solo para programarlo, en el modulo ESP32-CAM el GND al GPIO0.

Programa de ejemplo

Utilizaremos uno de los ejemplos provistos por la librería, para convertir el ESP32-CAM en una cámara IP, puede encontrarlo en Archivos – Ejemplos – esp32cam – WifiCam.

En el ejemplo solo debemos editar las lineas indicando el nombre de nuestra red inalámbrica y la contraseña de la misma.


1
2
const char* WIFI_SSID = "my-ssid";
const char* WIFI_PASS = "my-pass";

Antes de cargar el programa al ESP32-CAM debemos presionar el botón de Reset del mismo, cargar el código al mismo, desconectar el cable que puentea GND con GPIO0 y volver a reiniciar para que cargue el código.

Si abrimos el Monitor Serie veremos que nos indica una URL, a la cual podemos conectarnos desde el navegador.

Tomar imágenes desde Python

La gran ventaja de utilizar esta librería es que es muy sencillo integrarla con nuestras aplicaciones en Python; pueden encontrar el programa en el siguiente repositorio de github:
https://github.com/gsampallo/esp32cam-python

Solo debemos tener en cuenta de reemplazar la IP de la URL por la correcta en el programa y luego ejecutarlo; cada vez que se ejecute toma una foto.

Sistema de riego sencilla: corrigiendo la fecha

Un inconveniente que surgió con la captura de las imágenes desde la cámara IP es la fecha y hora de la cámara, hasta el momento no encontré manera de setear la fecha correcta, por ende en todas las imágenes la marca de agua con la fecha y hora es incorrecta.

Alma en el fondo de la imágen

La imagen anterior se corresponde con la marca de tiempo 2019-09-04 13:20:09, sin embargo en la marca de agua figura otra fecha del 2018.

La forma que encontré hasta el momento es correr un pequeño script en Python para corregir la fecha superponiendo un recuadro negro con la fecha correcta, la cual toma del nombre del archivo; para esto dos funciones de OpenCV.

El script es sencillo consta de tres partes:
1. Lista todos los archivos png dentro de la carpeta donde se estan guardando las imágenes.


1
2
3
4
5
ruta = "C:/Users/Guillermo/Desktop/img_riego"
output = "C:/Users/Guillermo/Desktop/output/"
for file in os.listdir(ruta):
    if file.endswith(".png"):
        print(file)

Simplemente recorremos los archivos dentro de la ruta (vble que contiene el path hasta las imágenes) y evaluamos si el archivo termina con .png o no para validar que sean imágenes.


2. Abre cada archivo, agrega el rectángulo negro y el texto. El texto además identifica que nro. de días es, no muestra la fecha. Es para poder identificar rápidamente el paso del tiempo.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        img = cv2.imread(ruta+"/"+file)

        cv2.rectangle(img,(850,54),(1261,84),(0,0,0),-1)

        t = file.split("_")

        if(nombre != str(t[0])):
            nombre = str(t[0])
            nroDia = nroDia + 1

        hora = t[1].split(".")[0]
        texto = "Dia "+str(nroDia)+" "+str(hora)

        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img,texto,(850,82), font, 1,(255,255,255),2,cv2.LINE_AA)

Abrimos la imagen y almacenamos en img; agregamos el rectangulo cuya coordenamas previamente las sacamos por medio de algun soft de edicion de imagenes, en este caso siempre seran las mismas.

Evaluamos si en el nombre de la imagen cambio o no la fecha, en caso que haya cambiado, incrementamos el nro de dias en 1.

Por ultimo ponemos el texto en la imagen.


3. Guarda la imagen en una carpeta de salida, de manera de conservar el original:


1
cv2.imwrite(output+file,img)

Se puede encontrar el script completo aqui.

Basta con hacer algunos pequeños ajustes para que se pueda utilizar para cualquier tipo de foto.

El resultado es el siguiente: