← Volver al blog

Receta: control de acceso por patente para una barrera de estacionamiento

Leé patentes desde una cámara de barrera, contrastalas con una lista blanca y negra, y dispará eventos de patente firmados que abren una barrera o registran un ingreso. Modelos open source, una base por app, sin nube.

4 min de lectura
Read in English

Por qué LPR en la barrera

Una barrera de estacionamiento o el portón de una calle privada tiene una sola pregunta: ¿esta patente puede entrar? La Studio App LPR la responde desde una cámara común — detecta la patente, la lee, la contrasta con tus listas, y emite un evento sobre el que tu controlador de barrera o tu backend puede actuar. Corre enteramente sobre modelos open source, guarda un historial por app, y nunca llama a un servicio de patentes en la nube.

La arquitectura en palabras

LPR es una Studio App con un worker Python (fast-alpr: un detector ONNX más OCR, todo con licencia MIT). Muestrea el stream de la app, lee patentes, y en cada lectura aceptada emite plate.detected, más plate.allowed si la patente está en tu lista blanca o plate.denied si está en la negra. Los eventos fluyen por tres vías: los callbacks firmados de la app (webhook y MQTT), opcionalmente una URL de callback directa (para un abridor de barrera), y el feed en vivo del dashboard. Las lecturas se guardan en un lpr.db por app, con una captura JPEG por evento.

1. Instalar y apuntar a la cámara de la barrera

export BASE="https://your-server.example.com/api/v1"
export TOKEN="sk_...."

curl -X POST $BASE/apps/parking/plugins/lpr/install -H "Authorization: Bearer $TOKEN"

curl -X PATCH $BASE/apps/parking/plugins/lpr -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
        "enabled": true,
        "config": {
          "room": "gate-cam",
          "whitelist": "AB123CD, AA000AA",
          "blacklist": "ZZ999ZZ",
          "dedupeWindowSec": 10,
          "callbackUrl": "https://gate.example.com/open"
        }
      }'

room es obligatorio. Las listas se separan por coma o salto de línea y se comparan sin distinguir mayúsculas ni separadores.

2. Entender los eventos

En cada lectura el worker emite plate.detected y, si coincide con una lista, plate.allowed o plate.denied (una patente en ambas listas es denegada — la lista negra gana). Cada evento lleva el mismo payload:

{ "plate": "AB123CD", "confidence": 0.94, "ts": 1751000000.1,
  "listMatch": "whitelist", "snapshot": "…/lpr/snapshots/1751000000100-AB123CD.jpg" }

Por la vía de callbacks firmados el cuerpo se envuelve como { event, app, room, ts, data } y se firma con X-StreamHub-Signature: sha256=<hmac>. La callbackUrl directa opcional recibe un cuerpo plano y sin firmar — cómodo para un controlador de barrera en tu LAN, pero mantené ese endpoint privado o protegelo con un token compartido.

3. Ajustar precisión y ritmo

Perillas de config (con defaults):

  • detectoryolo-v9-t-384-license-plate-end2end (balanceado); 256 es el más rápido, 512 el más preciso.
  • ocrModelcct-xs-v1-global-model (rápido) o cct-s-v1-global-model (preciso).
  • confidence0.5 de confianza mínima de OCR.
  • fps2; dedupeWindowSec10 (la misma patente dentro de la ventana emite una vez; un auto detenido re-emite cada ventana, no por cuadro).
  • snapshotstrue; cudafalse.

4. Leer el historial y conectar la barrera

La pestaña del dashboard muestra las lecturas recientes por el canal en vivo autenticado (GET /apps/parking/plugins/lpr/data). Para abrir la barrera, hacé que tu controlador escuche en la callbackUrl directa y actúe ante plate.allowed; registrá todo desde el webhook firmado en tu propio sistema; el apps/parking/lpr/lpr.db por app guarda el historial completo de reads para auditorías.

Qué deberías ver

Un auto se acerca; en uno o dos segundos dispara plate.detected, y una patente en lista blanca produce plate.allowed con una captura. Tu barrera se abre; una patente desconocida simplemente registra un plate.detected con listMatch: null; una patente en lista negra dispara plate.denied.

Resolución de problemas

  • Patentes no leídas o mal leídas — mejorá el ángulo y la iluminación de la cámara sobre la patente, subí el detector a 512 y el OCR a cct-s, o bajá fps si la patente se ve borrosa a velocidad.
  • Eventos repetidos para un auto estacionado — es el heartbeat de dedupeWindowSec; subilo si solo querés un evento por llegada.
  • La barrera se abre con la patente equivocada — recordá que el callback directo va sin firmar; verificá la patente en tu controlador, o consumí el webhook firmado en su lugar.
  • Se llena el disco — ni lpr.db ni las capturas se podan solas; agregá un cron en una barrera con mucho tránsito.

Cierre

Todo — modelos, historial de patentes, capturas — queda en tu servidor, lo que importa en un predio residencial o corporativo bajo reglas de privacidad. Si querés integración con el hardware de la barrera, portones de múltiples carriles, o un portal de autogestión para residentes, es un armado de consultoría acotado sobre la app LPR open source.