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.

Existem várias empresas oferecendo o serviço de informações relacionadas a veículos.
O código abaixo foi desenvolvido para operar com a InfoSimples.
Esta é uma das empresas que oferecem franquia para fins de testes para novas contas.
Siga as instruções no link acima para receber as credenciais necessárias.
De posse destas credenciais siga as instruções abaixo para obter dados dos veículos.

Usando Raspberry PI e Node-Red

Instruções de uso: Antes de instalar o fluxo abaixo assegure-se que os seguintes nodes estão instalados:
Nota: Execute "sudo apt-get install python-picamera". Se o diretório /home/pi/Pictures não existir crie.
node-red-contrib-camerapi, node-red-contrib-ftp, node-red-contrib-image-tools, node-red-node-pi-gpio
Depois de importar o fluxo: Assegure-se que os dados de autenticação foram corretamente entrados no nó "Carrega Credenciais" e no nó FTP.
Para utilizar o fluxo Node-Red abaixo uma conta FTP em server disponível na internet é necessário para upload das imagens.
Node-Red Flow
[{"id":"845f831312e947bf","type":"tab","label":"ALPR","disabled":false,"info":"","env":[]},{"id":"ccc4dd91dbf027de","type":"ftp","host":"alprbr.com","port":"","secureOptions":"","user":"ftpusername","connTimeout":"","pasvTimeout":"","keepalive":""},{"id":"631c80e20bef710e","type":"inject","z":"845f831312e947bf","name":"Teste com foto da Pi câmera","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":120,"wires":[["1e6f5d8e638551cf"]]},{"id":"1e6f5d8e638551cf","type":"camerapi-takephoto","z":"845f831312e947bf","filemode":"1","filename":"picamera.jpg","filedefpath":"1","filepath":"","fileformat":"jpeg","resolution":"1","rotation":"0","fliph":"0","flipv":"0","brightness":"50","contrast":"0","sharpness":"0","quality":"80","imageeffect":"none","exposuremode":"auto","iso":"0","agcwait":"1.0","led":"0","awb":"auto","name":"picamera","x":440,"y":120,"wires":[["2fb40ce3ca27e0bf","3097b95c772667df"]]},{"id":"0720832003cf57fd","type":"ftp in","z":"845f831312e947bf","ftp":"ccc4dd91dbf027de","operation":"put","filename":"piimage.jpg","localFilename":"","name":"FTP Upload Picture","x":210,"y":320,"wires":[["9a977fbbb2341a0a"]]},{"id":"fce37e1eb5346700","type":"function","z":"845f831312e947bf","name":"Parâmetros","func":"msg.payload = \"token=\" + flow.get(\"LPRtoken\") +\n \"&countrycode=\" + flow.get(\"countrycode\") +\n \"&vehicledata=\" + flow.get(\"vehicledata\") +\n \"&imageurl=\" + msg.imageurl;\n\nmsg.url = flow.get(\"url\");\nmsg.headers = {};\nmsg.headers['Content-type'] = 'application/x-www-form-urlencoded';\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":260,"wires":[["d03bbacb221975ac"]]},{"id":"d03bbacb221975ac","type":"http request","z":"845f831312e947bf","name":"Request para ALPRBR","method":"POST","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":620,"y":420,"wires":[["3149ca2784bdf79b"]]},{"id":"1a25685b647464d9","type":"inject","z":"845f831312e947bf","name":"Use Imagem da Internet","props":[{"p":"imageurl","v":"https://p2.trrsf.com/image/fget/cf/1200/628/middle/images.terra.com/2019/10/18/1-fiat-mbi-drive-gsr.jpg","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":200,"y":260,"wires":[["fce37e1eb5346700"]]},{"id":"fd1a44d1eb0229cd","type":"rpi-gpio in","z":"845f831312e947bf","name":"","pin":"18","intype":"up","debounce":"25","read":false,"bcm":true,"x":140,"y":180,"wires":[["27741e7724a76628"]]},{"id":"27741e7724a76628","type":"function","z":"845f831312e947bf","name":"Trigger com 0","func":"if(msg.payload == 0){\n return msg;\n}else{return null;}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":180,"wires":[["1e6f5d8e638551cf"]]},{"id":"284a5abac743188c","type":"link in","z":"845f831312e947bf","name":"FTP Upload","links":["fd577eb0606fd9ab"],"x":85,"y":320,"wires":[["0720832003cf57fd"]]},{"id":"fd577eb0606fd9ab","type":"link out","z":"845f831312e947bf","name":"link out 1","mode":"link","links":["284a5abac743188c"],"x":795,"y":60,"wires":[]},{"id":"9a977fbbb2341a0a","type":"function","z":"845f831312e947bf","name":"Parâmetros","func":"msg.imageurl = flow.get(\"imagePath\") + msg.filename;\nmsg.payload = \"token=\" + flow.get(\"LPRtoken\") +\n \"&countrycode=\" + flow.get(\"countrycode\") +\n \"&vehicledata=\" + flow.get(\"vehicledata\") +\n \"&imageurl=\" + msg.imageurl; \n\nmsg.url = flow.get(\"url\");\nmsg.headers = {};\nmsg.headers['Content-type'] = 'application/x-www-form-urlencoded';\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":320,"wires":[["d03bbacb221975ac"]]},{"id":"3149ca2784bdf79b","type":"link out","z":"845f831312e947bf","name":"link out 2","mode":"link","links":["7f6c04308fce9b9e","47b533658713b49f"],"x":795,"y":420,"wires":[]},{"id":"2fb40ce3ca27e0bf","type":"image viewer","z":"845f831312e947bf","name":"","width":"320","data":"payload","dataType":"msg","active":true,"x":590,"y":120,"wires":[[]]},{"id":"0745beaace5336d2","type":"function","z":"845f831312e947bf","name":"Chamada InfoSimples API","func":"msg.payload = \"placa=\" + msg.payload.property + \n \"&login_cpf=\" + flow.get(\"login_cpf\") + \n \"&login_senha=\" + flow.get(\"login_senha\") + \n \"&token=\" + flow.get(\"IStoken\") + \n \"&timeout=\" + flow.get(\"timeout\");\n\nmsg.url = \"https://api.infosimples.com/api/v2/consultas/sinesp/veiculo\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":250,"y":380,"wires":[["4ac34323696e563b"]]},{"id":"4ac34323696e563b","type":"http request","z":"845f831312e947bf","name":"Request InfoSimples API","method":"POST","ret":"obj","paytoqs":"ignore","url":"","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":210,"y":460,"wires":[["812b39c3a806828f"]]},{"id":"fe925995b3a0744d","type":"debug","z":"845f831312e947bf","name":"Resposta","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":540,"y":460,"wires":[]},{"id":"47b533658713b49f","type":"link in","z":"845f831312e947bf","name":"link in 1","links":["3149ca2784bdf79b"],"x":85,"y":380,"wires":[["0745beaace5336d2"]]},{"id":"3097b95c772667df","type":"change","z":"845f831312e947bf","name":"Formata Filename","rules":[{"t":"set","p":"localFilename","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":60,"wires":[["fd577eb0606fd9ab"]]},{"id":"21b8b109e6abd0ff","type":"function","z":"845f831312e947bf","name":"Carrega Credenciais ","func":"//Credenciais ALPRBR\nflow.set(\"LPRtoken\", \"Entrar Seu Token ALPRBR\");\nflow.set(\"countrycode\", \"br\");\nflow.set(\"vehicledata\", \"true\");\nflow.set(\"url\", \"http://alprbr.com:30305/alprbr\");\nflow.set(\"imagePath\",\"Diretório de acesso à imagem carregada via FTP\");\n\n//Credenciais InfoSimples\nflow.set(\"login_cpf\", \"Entre CPF cadastrado SINESP\");\nflow.set(\"login_senha\", \"Entre Email Cadastrado SINESP\");\nflow.set(\"timeout\", \"600\");\nflow.set(\"IStoken\", \"Entre Token InfoSimples\");\nreturn msg;","outputs":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":60,"wires":[]},{"id":"3709d0a8fd052bc4","type":"inject","z":"845f831312e947bf","name":"Inicialização","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":60,"wires":[["21b8b109e6abd0ff"]]},{"id":"812b39c3a806828f","type":"function","z":"845f831312e947bf","name":"Formata","func":"msg.payload = {\n \"placa\": msg.payload.data[0].placa,\n \"marca\": msg.payload.data[0].marca,\n \"modelo\": msg.payload.data[0].modelo,\n \"ano\": msg.payload.data[0].ano,\n \"chassi\": msg.payload.data[0].chassi_final,\n \"cor\": msg.payload.data[0].cor,\n \"uf\": msg.payload.data[0].uf,\n \"cidade\": msg.payload.data[0].cidade,\n \"situação\": msg.payload.data[0].situacao,\n};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":460,"wires":[["fe925995b3a0744d"]]}]
Esta previsto um switch de contato momentâneo entre o pino 12 do Raspberry Pi e a terra que serve para disparar o processo.
No lugar deste switch uma barreira Infravermelho pode ser usada.
Em desenvolvimento: script PHP que salvará dados formatados para banco de dados MySQL.

Usando Raspberry PI e MotionEye

Em Construção

Usando html + PHP

Os scripts abaixo são sugestões gratuitas para livre utilização, cópia, modificação e distribuição e não são cobertos por nenhuma garantia legal de funcionamento ou manutenção,
porém estão em constante aperfeiçoamento e/ou correções sem compromisso de prazo ou performance.
Os dois scripts abaixo (esquerda: demoIS.html, direita: demoIS.php) trabalham em conjunto e devem ser instalados em servidor web no mesmo diretório
(sugestão /var/www/html) e sob este um diretório para upload das imagens, (/var/www/html/upload)
O script da esquerda (demoIS.html) permite selecionar uma imagem local que será enviada ao script da direita (demoIS.php) que submeterá ao API da ALPRBR que dela extrairá o número da placa do veículo da foto e o enviará ao API da InfoSimples que retornará os dados do veículo que então os retornará ao script da esquerda (demoIS.html) para display.
Antes da utilização assegure-se de editar os scripts e colocar o dominio correto de seu servidor assim como suas credenciais de acesso ao serviço da ALPRBR e da InfoSimples.
A equipe ALPRBR agradece e sugere que em caso de sugestões entre em contato com o endereço de email abaixo.

<!DOCTYPE html>
<html lang="">
 <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ALPRBR Demo</title>
</head>
<body align='center' onload='startFunc()'>
  <div>
    <input type="file" name="file" id="file" onclick="startFunc()" >
    <input type="button" id="btn_uploadfile" value="Upload" onclick="uploadFile()" >
  </div>
<br>
<form name='alprbr' id='alprbr'>
<table align='center' style="border-collapse: collapse;" border="1">
<tbody>
<tr><td colspan='2' align='center'>Imagem Max 256K, jpg, jpeg e png</td></tr>
<tr><td><label for="credits">Creditos</label></td>
<td><input type='text' name='credits' id='credits'></td></tr>
<tr><td>Placa</td><td><input type='text' name='property' id='property'></td></tr>
<tr><td>Chassi_final</td><td><input type='text' name='chassi_final' id='chassi_final'>
</td></tr>
<tr><td>Cidade</td><td><input type='text' name='cidade' id='cidade'></td></tr>
<tr><td>Estado</td><td><input type='text' name='uf' id='uf'></td></tr>
<tr><td>Marca</td><td><input type='text' name='marca' id='marca'></td></tr>
<tr><td>Modelo</td><td><input type='text' name='modelo' id='modelo'></td></tr>
<tr><td>Ano</td><td><input type='text' name='ano' id='ano'></td></tr>
<tr><td>Cor</td><td><input type='text' name='cor' id='cor'></td></tr>
<tr><td>Situação</td><td><input type='text' name='situacao' id='situacao'></td></tr>
<tr><td colspan="2"><img id="vehicle" src="" alt="Veículo" width="400"/></td></tr>
</tbody>
</table>
</form>
<script>
// Upload file
function startFunc(){
  document.getElementById('vehicle').style.visibility = 'hidden';
}

function uploadFile() {
  document.getElementById("vehicle").disabled = true;
  document.querySelector('#btn_uploadfile').value = 'Processando, Aguarde...';
  document.getElementById("btn_uploadfile").disabled = true;
  
  var files = document.getElementById("file").files;
  if(files.length > 0 ){

    var formData = new FormData();
    formData.append("file", files[0]);

    var xhttp = new XMLHttpRequest();

    // Set POST method and ajax file path
    xhttp.open("POST", "demoIS.php", true);

    // call on request changes state
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {

        var response = this.responseText;
        if(response == ''){
           alert("Erro no Upload.");
        }else{
           //alert(response);
           const jsonData = JSON.parse(response);
           document.getElementById("credits").value      = jsonData.credits;
           document.getElementById("property").value     = jsonData.property;
           document.getElementById("chassi_final").value = jsonData.chassi_final;
           document.getElementById("cidade").value       = jsonData.cidade;
           document.getElementById("uf").value           = jsonData.uf;
           document.getElementById("marca").value        = jsonData.marca;
           document.getElementById("modelo").value       = jsonData.modelo;
           document.getElementById("ano").value          = jsonData.ano;
           document.getElementById("cor").value          = jsonData.cor;
           document.getElementById("situacao").value     = jsonData.situacao;

           if(jsonData.counter!=''){
             document.getElementById("vehicle").disabled = false;
             document.getElementById("vehicle").src = "https://SEUSERVIDOR/upload/"+
                                                       files[0].name;
             document.getElementById("vehicle").style.visibility = 'visible';
           }
           document.querySelector('#btn_uploadfile').value     = 'Upload';
           document.getElementById("btn_uploadfile").disabled  = false;          
        }
      }
   };
   // Send request with data
   xhttp.send(formData);
 }else{
   alert("Please select a file");
 }
}
</script>
    </body>
</html>
<?php

//Credenciais ALPRBR
$token       = "Seu Token ALPRBR";

//Credenciais InfoSimples
$login_cpf   = "CPF cadastrado SINESP Cidadão";
$login_senha = "Senha cadastrado SINESP Cidadão";
$timeout     = 300;
$IStoken     = "Seu Token para acesso no InfoSimples";
$ISurl       = "http://api.infosimples.com/api/v2/consultas/sinesp/veiculo";

if(isset($_FILES['file']['name'])){

   // file name
   $filename = $_FILES['file']['name'];

   // file size
   $file_size = $_FILES['file']['size'];

   // Location
   $location = 'upload/'.$filename;
   $imageUrl = 'https://SEUSERVIDOR/'.$location;

   // file extension
   $file_extension = pathinfo($location, PATHINFO_EXTENSION);
   $file_extension = strtolower($file_extension);

   // Valid image extensions
   $valid_ext = array("jpg","png","jpeg");

   $response = 0;

   if(($file_size >= 262144) || ($file_size == 0)) {
      echo ('{"credits": "","property":"","chassi_final":"",
      "cidade":"","uf":"","marca":"","modelo":"","ano":"","cor":"",
      "situacao":"Imagem max = 256Kb"}');
      die();
   } 

   if(in_array($file_extension,$valid_ext)){
      // Upload file
      if(move_uploaded_file($_FILES['file']['tmp_name'],$location)){

         //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);
         $result  = file_get_contents($url, false, $context);
         $json    = json_decode($result);

         if ($result === FALSE) {
           /* Handle error */         
         }else{
           //var_dump($result);
           //echo $result;

           //prepare post to InfoSimples
           $params  = array('placa' => $json->property,
                            'login_cpf' => $login_cpf,
                            'login_senha' => $login_senha,
                            'token' => $IStoken,
                            'timeout' => $timeout);

           $curl = curl_init();
           curl_setopt($curl, CURLOPT_URL, $ISurl);
           curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
           curl_setopt($curl, CURLOPT_POST, 1);
           curl_setopt($curl, CURLOPT_POSTFIELDS, $params);

           $response_body = curl_exec($curl);
           $err = curl_error($curl);
           curl_close($curl);
           $IS = json_decode($response_body);

           echo ('{"credits":        "'.$json->credits.
                  '","property":     "'.$json->property.
                  '","chassi_final": "'.$IS->data[0]->chassi_final.
                  '","cidade":       "'.$IS->data[0]->cidade.
                  '","uf":           "'.$IS->data[0]->uf.
                  '","marca":        "'.$IS->data[0]->marca.
                  '","modelo":       "'.$IS->data[0]->modelo.
                  '","ano":          "'.$IS->data[0]->ano.
                  '","cor":          "'.$IS->data[0]->cor.
                  '","situacao":     "'.$IS->data[0]->situacao.'"}');

         }
         //unlink($location); //delete uploaded file
         //echo $response;
         exit;
      }
   }else{
      echo ('{"credits": "","property":"","chassi_final":"",
      "cidade":"","uf":"","marca":"","modelo":"","ano":"","cor":"",
      "situacao":"Imagens: jpg,jpeg e png"}');
   }
}else{
   echo "noFile";
}
?>
Informações adicionais: alprbrapi@gmail.com