ALPRBR tem precisão, é rápido e amigável ao desenvolvedor

API de Reconhecimento Automático de Placas que funciona em todos os ambientes.

Otimizado para uso no Brasil para reconhecer placas padrão Mercosul assim como as antigas ainda em uso.

Usando MotionEye OS (instalado no Raspberry Pi com câmera (nativa ou USB)) para submeter placas à API do ALPRBR.

MotionEye é um Sistema Operacional especialmente desenhado para tornar um Raspberry Pi numa plataforma de vigilância.
Com a devida configuração pode funcionar como entrada para o sistema de leitura de placas da ALPRBR.

Nesta proposta usamos um Raspberry Pi Zero (com câmera) tirando fotos sob controle do operador que são automaticamente submetidas (via FTP) à analise do API da ALPRBR e cujos resultados retornados para o script PHP abaixo, no formato JSON, são guardadas em banco de dados do cliente.
Múltiplos Raspberry Pi rodando MotionEye OS podem ser agrupados e controlados por uma única central também com o software MotionEye (que é um software gratuito).

NOTA: As instruções e código abaixo são fornecidas como estão e sem custos. São cedidos como sugestão e são livres para serem editadas, partilhadas e comercializadas sem restrição, garantias de funcionamento ou performance.
Suporte de melhor esforço esta disponíveis via email alprbrapi@gmail.com e é oferecido sem compromissos de qualquer natureza.
Estas instruções estão em constante aprimoramento de forma que sugestões ou correções são bem vindas e se forem de interesse comum serão adicionadas a este guia.

INSTALAÇÃO

1- Instale MotionEye em seu Raspberry Pi de acordo com instruções encontradas em: https://www.arrow.com/en/research-and-events/articles/motioneyeos-camera-setup-on-raspberry-pi-zero-w
Nota: Para associar mais que um Raspberry Pi sob controle central pode-se seguir as sugestões encontradas em: https://www.youtube.com/watch?v=nQgeAJIjhNU

Como a configuração inicial de IP é via DHCP instale (por exemplo) em seu smartphone o aplicativo Net Analizer
Com ele será possível verificar todos os endereços de sua rede WiFi e localizar o IP que foi assignado para seu Raspberry Pi.

Navegue para o endereço IP que foi alocado para seu Raspberry Pi (MotionEye).
Entre como admin (sem senha) e ajuste as configurações do MotionEye como abaixo.

MotionEye
Em Service:
Enable FTP Server = ON
Require FTP Authentication = ON
Enable FTP Write Support = OFF
Enable Samba Server = ON
Require Samba Authentication = ON
Enable Samba Write Support = OFF
Enable SSH Server = ON

Em Expert Settings:
Date Method = NTP
Deixe todo o resto como esta

Video Device = ON
Video Resolution = 640x480 (teste resoluções suficientes para o reconhecimento. Maior resolução = maior tempo de transferencia da imagem.
Outros parametros poderão ser otimizados a seu gosto.

File Storage:
Upload Media File = ON
Upload Pictures = ON
Upload Movies = OFF
Entrar as credenciais de seu FTP Server
Test Service para ver se esta tudo OK com as credenciais para acesso em seu dervidor FTP
Call a Web Hook = ON
Web Hook URL = http://Servidor_Web_De_Sua_Escolha?imageurl=http://Endereço_Web_Para_Fotos_Enviadas_Via_FTP/MotionEye%f (Ex: http://MeuWebSite.com.br/imagens/MotionEye%f)
HTTP Method = POST (form)
Run a Command = OFF

Text Overlay = Serve para imprimir na foto. Pode confundir o algorritmo de leitura da placa.

Video Streaming = OFF

Still Images = ON
Image File Name Exemplo = portaria%Y%m%d%H%M%S   (Imagem em seu servidor FTP ficaria por ex:  portaria20221009123412.jpg)
Capture Mode = Manual
Preserve Pictures = For One Day
Enable Manual Snapshots = ON

Movies = OFF
Motion Detection = OFF


2- No Servidor_Web_De_Sua_Escolha coloque os seguintes scripts PHP:

---------->browseMeye.php (navegue para este scipt para visualizar os dados capturados por motioneye.php abaixo)
<?php
//DATABASE DETAILS//
$servername = "127.0.0.1:3306";
$DBuser = "MySQLUserName";
$DBpass = "MySQLUserPass";
$DBname = "MySQLDBName";

    // Create connection
    $conn  = new mysqli($servername, $DBuser, $DBpass, $DBname);
    $query = "SELECT * FROM motioneye;";

    if ($result = $conn->query($query)) {
      echo "<head><META HTTP-EQUIV='refresh' CONTENT='10'></head>";
      echo "<table border='1' align='center' style='border-collapse: collapse;'>";
      echo "<tr><th>";
      echo "Evento</th><th>Placa</th><th>Imagem</th></tr>";
      while ($row = $result->fetch_assoc()) {
        echo "<tr>";
        echo "<td>".$row["eventtime"]."</td>";
        echo "<td>".$row["property"]."</td>";
        echo "<td><img src=".$row['imageurl']." alt='Car Image' width='200'></td>";
        echo "</tr>";
      }
      echo "</table>";
      $result->free();
      $conn->close();
    }else{echo "NODATA";}
?>

---------->motioneye.php
<?php
//DATABASE DETAILS//
$servername = "127.0.0.1:3306";
$DBuser = "MySQLUserName";
$DBpass = "MySQLUserPass";
$DBname = "MySQLDBName";
$token  = "SeuTokenALPRBR";                                                                       //<<<---EDITAR

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $text = $_POST["imageurl"];
  $imageurl = substr($text,0,strpos($text,"MotionEye/")).substr($text,strrpos($text,"/")+1);

  for ($i=0; $i <= 12; $i++) {  //Para dar tempo da imagem ser transferida para o FTP server.
    if(file_exists($imageurl)) {
      break;
    }
    sleep(2); // Espera por 2 segundos para cada loop
  } 

  //prepare post to alprbrapi
  $url = 'http://alprbr.com:30305/alprbr';
  $data = array('imageurl' => $imageurl,
                'token' => $token,
                'countrycode' => 'br');

  // use key 'http' even if you send the request to https://...
  $options = array(
  'http' => array(
  'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
  'method'  => 'POST',
  'content' => http_build_query($data)
     )
  );
      
  $context = stream_context_create($options);
  $resObj  = file_get_contents($url, false, $context);
  if ($resObj === FALSE) {
    /* Handle error */
  }else{
    //var_dump($resObj);
    $respArray = json_decode($resObj,true);
    // Create connection
    $conn = new mysqli($servername, $DBuser, $DBpass, $DBname);

    if ($conn->connect_error) {
       die("Connection failed: " . $conn->connect_error);
    } else {
       $sql  = "INSERT INTO motioneye (token,imageurl,property,credits)";
       $sql  = $sql. " VALUES (?,?,?,?)";
       $stmt = $conn->prepare($sql);
       $stmt->bind_param('ssss',$token,$imageurl,$respArray['property'],$respArray['credits']);
       $stmt->execute();           
       $stmt->close();
       $conn->close();
    }
  }
  exit;
}else{
  echo ('{"credits": "","property":"NoData"}');
}
?>


MySQL script (use este script para adicionar a tabela motioneye em seu banco de dados):

-- phpMyAdmin SQL Dump
-- version 5.0.4deb2+deb11u1
-- https://www.phpmyadmin.net/
--
-- Host: localhost:3306
-- Tempo de geração: 09-Out-2022 às 10:27
-- Versão do servidor: 10.5.15-MariaDB-0+deb11u1
-- versão do PHP: 7.4.30

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Banco de dados: `EntreAquiONomeDeSeuBancoDeDados`             
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `motioneye`
--

CREATE TABLE `motioneye` (
  `token` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `imageurl` varchar(96) COLLATE utf8_unicode_ci NOT NULL,
  `property` varchar(12) COLLATE utf8_unicode_ci NOT NULL,
  `eventtime` datetime NOT NULL DEFAULT current_timestamp(),
  `credits` decimal(8,2) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;