Cloud Functions (OCR & Facial Recognition)
Este documento describe 7 Cloud Functions creadas en Node.js.
Se dividen en Funciones de OCR y Funciones de Reconocimiento Facial para su mejor entendimiento.
Índice
-
Funciones de OCR
-
Funciones de Reconocimiento Facial
Funciones de OCR
1. ocrReadAndWriteImage
Endpoint : https://us-west1-servicios-350819.cloudfunctions.net/ocrReadAndWriteImage
Función Exportada
functions.http('processImage', async (req, res) => { ... })
Descripción
Esta función recibe la URL de una imagen, la procesa usando Google Generative AI para extraer datos de identificación en un formato JSON y los normaliza (ajusta campos como name
→ first_name
y last_name
, direcciones, fechas, etc.).
Finalmente, envía el JSON normalizado a la ruta configurada en CONFIG.RECEIVER_URL
.
Flujo Principal
- Obtener la URL de la imagen (por
req.query.url
oreq.body.url
). - Descargar la imagen y convertirla a Base64.
- Invocar el modelo generativo (por ejemplo,
"gemini-1.5-flash"
). - Limpiar y parsear la respuesta para extraer el JSON.
- Normalizar campos (separar
first_name
,last_name
, unificar direcciones, etc.). - Enviar el JSON resultante a la función receptora (por POST).
- Retornar el JSON normalizado al cliente.
Parámetros de Entrada
-
Body JSON (o Query Params):
url
(string, requerido): URL de la imagen a procesar.
Ejemplo Body:
{
"url": "https://example.com/my-id-image.jpg"
}
- No requiere otros campos. Si se omite
url
, retorna error 400.
Respuesta
- 200 OK
Devuelve un objeto JSON con los campos extraídos y normalizados:
{
"first_name": "Jane",
"last_name": "Smith",
"driver_license_number": "ABC12345",
"date_of_birth": "1992-02-02",
"expiration_date": "2032-02-02",
...
}
- 400 Bad Request
Si no se proporcionaurl
. - 422 Unprocessable Entity
Si la respuesta de la AI no es un JSON válido. - 500 Internal Server Error
Cualquier otro error en el procesamiento o en la llamada a la función receptora.
Dependencias
- @google-cloud/functions-framework (para exponer la función como HTTP).
- node-fetch (para descargar la imagen y enviar datos).
- @google/generative-ai (cliente de Google Generative AI).
- dotenv (para leer variables de entorno como
API_KEY
,PROMPT
, etc.).
Variables de Entorno
API_KEY
— Clave para Google Generative AI.PROMPT
— Texto base para el modelo.RECEIVER_URL
— URL destino donde se envía el JSON resultante.MODEL_NAME
— Nombre del modelo a usar (por defecto"gemini-1.5-flash"
).
2. saveMinimalBotConversations
Endpoint : https://us-central1-servicios-350819.cloudfunctions.net/saveMinimalBotConversations
Función Exportada
functions.http('sendDataToGoogleSheet', async (req, res) => { ... })
Descripción
Esta función toma datos relacionados con OCR (o similar) y los almacena en Google Sheets mediante el servicio de SheetDB:
- Determina en qué hoja (sheet) colocar la información según si los datos están en español (
data.nombre
) o inglés (data.first_name
). - Construye el objeto
sheetData
(consheet
ydata
) y realiza una llamadaPOST
a la URL de SheetDB (API_URL
). - Retorna al cliente la respuesta de la API de SheetDB.
Parámetros de Entrada
- Body JSON (requerido):
nombre
(string, opcional): si existe, se guardará en la hoja "OCR Esp".first_name
(string, opcional): si existe, se guardará en la hoja "OCR Eng".- Otros campos libres (apellidos, dirección, etc.) también se guardan.
Ejemplo Body en Español:
{
"nombre": "Juan Perez",
"fecha_nacimiento": "1985-01-01",
"direccion": "Av. Principal 123"
}
**Ejemplo Body en Inglés:
{
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "1990-05-15"
}
- Importante: Debe existir al menos
nombre
ofirst_name
. De lo contrario, responde400 JSON format not recognized
.
Respuesta
- 200 OK
Devuelve el resultado de la API de SheetDB:
{
"first_name": "John",
"last_name": "Doe",
"date_of_birth": "1990-05-15"
}
- 400 Bad Request
Si no encuentra ninombre
nifirst_name
. - 500 Internal Server Error
Cualquier otro error interno o fallo en la llamada a SheetDB.
Flujo Principal
- Validar que la petición sea
POST
. - Leer el objeto
data
delbody
de la petición. - Definir la hoja destino (
"OCR Esp"
si se detectanombre
,"OCR Eng"
si se detectafirst_name
). - Enviar los datos a la API de SheetDB.
- Retornar la respuesta de la API.
Dependencias
- @google-cloud/functions-framework
- axios
Consideraciones
- Si no se detectan
nombre
ofirst_name
, se responde con400 JSON format not recognized
. - El endpoint de SheetDB se encuentra en la variable
API_URL
(en el código).
3. sendOCRdataToCreatePerson
Endpoint : https://us-central1-servicios-350819.cloudfunctions.net/sendOCRdataToCreatePerson
Función Exportada
functions.http('processImages', async (req, res) => { ... })
Descripción
Orquesta el flujo OCR → creación de persona:
- Recibe dos URLs:
idImageUrl
(imagen de identificación) yselfieUrl
. - Llama a la función ocrReadAndWriteImage con la imagen de identificación.
- Normaliza y transforma los datos recibidos del OCR para ajustarlos a la estructura que requiere createPerson.
- Invoca createPerson con esos datos y la
selfieUrl
. - Retorna la respuesta de
createPerson
y los datos enviados (sin la URL de la selfie).
Parámetros de Entrada
-
Body JSON (o Query Params):
idImageUrl
(string, requerido): URL de la imagen de la identificación.selfieUrl
(string, requerido): URL de la imagen tipo selfie.
Ejemplo Body
{
"idImageUrl": "https://example.com/my-id.jpg",
"selfieUrl": "https://example.com/my-selfie.jpg"
}
- Si faltan
idImageUrl
oselfieUrl
, retorna400
.
Respuesta
- 200 OK
{
"response": {
"message": "Person Created Successfully",
"supabase_id": 123
},
"savedData": {
"name": "Juan Perez",
"date_of_birth": "1985-01-01",
"gender": "M"
...
}
}
- 400 Bad Request
Si faltan URLs en los parámetros. - 500 Internal Server Error
Cualquier error al procesar la OCR o la creación de persona.
Flujo Principal
- Validar que existan
idImageUrl
yselfieUrl
. - Invocar
ocrReadAndWriteImage
, obteniendo los datos OCR. - Formatear la respuesta OCR (INE vs Licencia, etc.).
- Llamar a
createPerson
con el objeto resultante. - Retornar la respuesta de creación y los datos utilizados.
Dependencias
- @google-cloud/functions-framework
- axios
Funciones Auxiliares
formatPersonData(ocrData, selfieUrl)
: Combina campos para ajustarlos al formato requerido porcreatePerson
.formatDate(dateString)
: Formatea fechasDD/MM/YYYY
aYYYY-MM-DD
.
Funciones de Reconocimiento Facial
Consideraciones:
- Un "match" corresponde a un puntaje de 0.7 o superior para considerar que las selfies de la o las personas coinciden y se trata de la misma.
- Para mayor referencia revisar la documentación oficial de openCV:
url: https://us.opencv.fr/docs#/
title: "OpenCV Face Recognition - Swagger UI"
host: us.opencv.fr
- Los ids que proporciona openCV son el formato uuid y los ids proporcionados por supase son int8.
4. createPerson
Endpoint : https://us-central1-servicios-350819.cloudfunctions.net/createPerson
Función Exportada
functions.http('createPerson', async (req, res) => { ... })
Descripción
Crea un registro de persona en la base de datos de OpenCV y luego almacena el opencv_id
en Supabase:
- Convierte la imagen a Base64.
- Llama a
https://us.opencv.fr/person
para crear la persona y obtener unid
(llamadoopencv_id
). - Guarda ese
opencv_id
en la tablapeople
de Supabase. - Retorna el
id
de Supabase y un mensaje de éxito.
Parámetros de Entrada
-
Body JSON (o Query Params):
date_of_birth
(string, requerido): fecha de nacimiento en formatoYYYY-MM-DD
(o similar).gender
(string, requerido): "M" o "F" (o "H" vs "M" según la convención).imageUrl
(string, requerido): URL de la foto a enrolar.name
(string, requerido): nombre completo o nombre de la persona.nationality
(string, opcional): nacionalidad.
Ejemplo Body
{
"date_of_birth": "1990-05-15",
"gender": "M",
"imageUrl": "https://example.com/person-face.jpg",
"name": "John Doe",
"nationality": "US"
}
- Si falta alguno de los campos requeridos, retorna 400.
Respuesta
- 200 OK
{
"message": "Person Created Successfully",
"supabase_id": 17
}
- 400 Bad Request
Si faltan parámetros obligatorios (date_of_birth
,gender
,imageUrl
,name
). - 500 Internal Server Error
Cualquier error al comunicarse con OpenCV o Supabase.
Flujo Principal
- Leer parámetros obligatorios (
date_of_birth
,gender
,imageUrl
,name
…). - Validar que existan. Retornar
400
si faltan. - Descargar la imagen y convertirla a Base64.
- Invocar la API de OpenCV para crear la persona.
- Insertar en Supabase el registro con el
opencv_id
devuelto. - Retornar el
supabase_id
y un mensaje de confirmación.
Dependencias
- @google-cloud/functions-framework
- axios
- dotenv (para leer
OPENCV_API_KEY
,SUPABASE_API_KEY
, etc.)
Variables de Entorno
OPENCV_API_KEY
— Clave de la API de OpenCV.SUPABASE_API_KEY
— Clave de la API de Supabase.SUPABASE_URL
— URL base del proyecto Supabase.
5. facialRecognition
Endpoint : https://us-central1-servicios-350819.cloudfunctions.net/facialRecognition
Función Exportada
functions.http('compareImages', async (req, res) => { ... })
Descripción
Compara dos imágenes (una llamada “gallery” y otra “probe”) usando la API de OpenCV:
- Recibe sus URLs (
gallery_url
yprobe_url
). - Descarga ambas y las transforma a Base64.
- Llama a
https://us.opencv.fr/compare
con el modo"ACCURATE"
. - Devuelve al cliente la respuesta de la API (score, match, etc.).
Parámetros de Entrada
-
Body JSON (o Query Params):
gallery_url
(string, requerido): URL de la imagen de galería.probe_url
(string, requerido): URL de la imagen a comparar.
Ejemplo Body
{
"gallery_url": "https://example.com/gallery.jpg",
"probe_url": "https://example.com/probe.jpg"
}
Respuesta
- 200 OK
Devuelve el objeto JSON directamente desde la API de OpenCV, por ejemplo:
{
"match": {
"score": 0.87,
"bounding_box": ...
...
},
"status": "success"
}
- 400 Bad Request
Si faltangallery_url
oprobe_url
. - 500 Internal Server Error
Si hay un error en la llamada a OpenCV.
Flujo Principal
- Verificar la existencia de
gallery_url
yprobe_url
. - Descargar ambas imágenes en formato binario.
- Convertir a Base64.
- Enviar a la API
compare
de OpenCV. - Retornar la respuesta completa de OpenCV al cliente.
Dependencias
- @google-cloud/functions-framework
- axios
- dotenv
Variables de Entorno
OPENCV_API_KEY
— Clave para la API de OpenCV.
6. searchPersonInDB
Endpoint : https://us-central1-servicios-350819.cloudfunctions.net/searchPersonInDB
Función Exportada
functions.http('searchImage', async (req, res) => { ... })
Descripción
Busca posibles coincidencias de una persona en la base de OpenCV a partir de la imagen recibida:
- Recibe la URL de la imagen (
imageUrl
). - Convierte la imagen a Base64.
- Llama a
https://us.opencv.fr/search
especificando unmax_results
y unmin_score
. - Retorna la lista de coincidencias que OpenCV considere válidas.
Parámetros de Entrada
-
Body JSON (o Query Params):
url
(string, requerido): URL de la imagen a buscar
(en el código, también se admitereq.body.imageUrl
).
Ejemplo Body
{
"url": "https://example.com/face_to_search.jpg"
}
- Si falta la URL, retorna 400.
Respuesta
- 200 OK
[
{
"id": "123",
"score": 0.92
},
{
"id": "456",
"score": 0.85
}
]
- 400 Bad Request
Si no se proporciona la URL de la imagen. - 500 Internal Server Error
Si ocurre un error al llamar a OpenCV o procesar la imagen.
Flujo Principal
- Validar que
imageUrl
exista (req.body o req.query). - Descargar y codificar la imagen.
- Enviar la petición a
search
en OpenCV. - Retornar los resultados.
Dependencias
- @google-cloud/functions-framework
- axios
- dotenv
Variables de Entorno
OPENCV_API_KEY
— Clave para la API de OpenCV.
7. verifyPersonIdentity
Endpoint : https://us-central1-servicios-350819.cloudfunctions.net/verifyPersonIdentity
Función Exportada
functions.http('verifyFace', async (req, res) => { ... })
Descripción
Verifica la identidad de una persona comparando una selfie con el registro previo en OpenCV:
- Recibe el
id
(de Supabase) y unaimageUrl
. - Busca en la tabla
people
de Supabase para obtener elopencv_id
. - Llama a
https://us.opencv.fr/verify
con la imagen y elopencv_id
. - Retorna el
score
de similitud y elname
registrado.
Parámetros de Entrada
-
Body JSON (o Query Params):
id
(number, requerido): ID de la persona en Supabase (campoid
de la tablapeople
).imageUrl
(string, requerido): URL de la selfie a comparar.
Ejemplo Body
{
"id": 42,
"imageUrl": "https://example.com/selfie.jpg"
}
Respuesta
- 200 OK
{
"score": 0.85,
"name": "John Doe"
}
- 400 Bad Request
Si faltanid
oimageUrl
, o la imagen no se pudo descargar. - 404 Not Found
Si la persona con eseid
no existe en Supabase. - 500 Internal Server Error
Si hay un problema interno (llamadas a OpenCV o a Supabase fallidas).
Flujo Principal
- Validar parámetros:
id
yimageUrl
. - Descargar la imagen y convertirla a Base64.
- Consultar en Supabase para obtener
opencv_id
yname
. - Invocar la API
verify
en OpenCV con elopencv_id
. - Retornar
score
yname
.
Dependencias
- @google-cloud/functions-framework
- axios
- dotenv
Variables de Entorno
OPENCV_API_KEY
— Clave para la API de OpenCV.SUPABASE_API_KEY
— Clave para la API de Supabase.