Reconhecimento de placas de veículos com OpenALPR

Atualmente desempregado, estou precarizado tentando arrumar uns bicos. E recentemente arranjei um bico para fazer um sistema de automação de estacionamentos baseado em software livre e empregando dispositivos de baixo custo, que no caso será o Raspberry Pi 4.

[ Hits: 1.725 ]

Por: Carlos Affonso Henriques. em 15/04/2020


Open ALPR



Embora já haja desenvolvido soluções de hardware e software voltadas para automação de tráfego, sinalização semafória e detecção de incidentes, nunca precisei fazer nada para registrar placas de veículos.

Inicialmente pensei em fazer um OCR com o OpenCV e Tesseract, mas não obtive muito bons resultados, a leitura das placas as vezes era imprecisa e eu estava sem tempo para estudar o Tesseract mais a fundo e pesquisando sobre o assunto deparei-me com o OpenALPR ( Automatic Licence Plate Recognition ), um serviço em nuvem muito bom com uma taxa de acerto muito próxima de 100%, sendo inclusive atualmente empregado para sistemas de multagem não só no Brasil como também Canadá, EUA, Europa e Oceania.

Embora ele também seja baseado no Tesseract e OpenCV, há muitos refinamentos para garantir a precisão do serviço. Ele tem um aprendizado de máquina que identifica inclusive marca/modelo e cor do veículo, incluindo motocicletas, se bem que no caso das motos a identificação de marca/modelo não funciona muito bem, apenas com motocicletas grandes como Honda Goldwing, Ducati Monster, Triumph Rino, Yamaha Vmax e Harley Glide.

O site do serviço é http://www.openalpr.com/ e dispõe de diversos planos que vão desde o gratuito até o enterprise, que é indicado para DETRANS e prefeituras de cidades grandes como Rio ou São Paulo. Não vou adentrar nos recursos dessa API pois no site há farta documentação, assim como há serviços adicionais, tais como rastreio visual de veículos que em cidades com forte aparato de vigilância pode inibir o roubo de cargas, contornando o problema dos jammers empregados pelos ladrões.

Fiz um pequeno programa em Python 3.6 a caráter de demonstração, que inclusive o usarei como parte da solução de estacionamento e compartilho com vocês, podem usar a vontade e como quiserem! Como eu costumo dizer a licença não é GPL é LPG (Liberado Para Geral) Rssss.

Código

import requests
import base64
import json
import time
import sys


IMAGE_PATH=str(sys.argv[1])
SECRET_KEY = 'sk_DEMODEMODEMODEMODEMODEMO'


with open(IMAGE_PATH, 'rb') as image_file:
    img_base64 = base64.b64encode(image_file.read())
    url = 'https://api.openalpr.com/v2/recognize_bytes?recognize_vehicle=1&country=br&secret_key=%s' % (SECRET_KEY)
    r = requests.post(url, data = img_base64)
    obj=r.json()

Placa=obj ["results"][0]["plate"]
TimeStamp=obj["epoch_time"]/1000
Cor=obj["results"][0]["vehicle"]["color"][0]["name"]
Modelo=obj["results"][0]["vehicle"]["make_model"][0]["name"]
DateTime=(time.gmtime(TimeStamp))

print (time.strftime('%Y-%m-%d_%H:%M:%S', DateTime), Placa, Modelo, Cor)

A Kombi velha

Para ilustração vamos usar a foto dessa Kombi velha. A escolhi para a PDC ( gostam de chamar de POC mas prefiro PROVA DE CONCEITO ) pelo fato da placa não estar muito legível e ainda estar em perspectiva. Isso demostra muito bem a qualidade deste serviço formidável. Agora experimente!

Rode o programinha!

python3.6 openalpr.py kombi.jpg

Para os fãs de shell script que não quiserem usar Python:

#!/bin/bash

curl -s -X POST -F [email protected]$1 'https://api.openalpr.com/v2/recognize?recognize_vehicle=1&country=br&secret_key=sk_DEMODEMODEMODEMODEMODEMO' \
| sed -e 's/[{}]/''/g' -e 's/"results": &#92;[//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' &#92;
| grep -w '"plate"&#92;|"epoch_time"' | head -n 2

Após salvar o seu shell script...

openalpr.sh kombi.jpg

Espero que tenham gostado e se gostaram muito me contratem, pois estou precisando.

   

Páginas do artigo
   1. Open ALPR
Outros artigos deste autor

Recuperando senha de administrador Windows NT/2000/XP/ com o Slax e Captive

SSHFS no CentOS, Slackware e Windows - Simples e rápido

Impedindo o compartilhamento de conexão

Enviando e-mail pelo shell com smtp remoto

Quando próximo, finja estar longe; quando longe, finja estar próximo

Leitura recomendada

Arduino com Bluetooth e pySerial

Embutindo imagens nos scripts Python para aplicações Tkinter

Python - Threads

Threads - Importância dentro de um software

Introdução a Threads e como implementá-las em Python

  
Comentários
[1] Comentário enviado por fabio em 15/04/2020 - 23:48h

Top demais! Obrigado por compartilhar.

[2] Comentário enviado por CapitainKurn em 16/04/2020 - 12:15h


[1] Comentário enviado por fabio em 15/04/2020 - 23:48h

Top demais! Obrigado por compartilhar.

Por nada Fábio. Contribúo com o VOL desde 2003 fiquei meio parado por algum tempo mas vou aumentar a frequencia de minhas contribuições.


Contribuir com comentário