Skip to content

Configuração gerador template

Tiago Mazzarollo edited this page Jan 18, 2017 · 8 revisions

Visão geral

O gerador de template visa facilitar a criação de templates permitindo a configuração de um conjunto de regiões.

Estrutura básica do gerador

O gerador deve ser no formato PHP. O arquivo é, basicamente, o retorno de um array com as configurações gerais do template e as características dos conjuntos de regiões da imagem.

<?php
return [
  'nome' => 'demo',
  // Outros atributos irão aqui...
  'regioes' => [
    [
      // Configuração conjunto 1
    ],[
      // Configuração conjunto 2
    ],
  ],
];

As configurações dos conjuntos serão detalhadas no tópico 'Configuração dos conjuntos' abaixo. Os demais atributos gerais, além do nome serão explicados no final deste artigo no tópico 'Definição atributos gerais'.

Restrições

  • as regiões dentro de um conjunto devem formar uma matriz m x n, sendo m e n valores inteiros quaisquer.

Configuração dos conjuntos

Atributos obrigatórios

Os atributos tipo, id, p1 e p2 são obrigatórios para definir qualquer tipo de conjunto. Eles representam, respectivamente, o tipo, o identificador das regiões, o ponto superior esquerdo e o ponto inferior direito (formando um retângulo) do conjunto.

Atributo tipo

O atributo tipo pode conter o valores

  • 0: conjunto de elipses
  • 1: OCR numérico
  'tipo' => 0, // ou 1
Atributo id

O atributo id assim como os atributos casoTrue e casoFalse (utilizados para conjuntos de elipses) podem ser uma string ou uma função PHP que permita a definição de um identificador único para cada região dentro do conjunto. A assinatura da função será sempre a seguinte.

  'id' => 'nome-unico',
// ou
  'id' => function ($b, $l, $o) {
    return $b . $l . $o; // ou qualquer outra combinação que gere um identificador único
  }

Quando o conjunto possui somente um região o id pode ser somente um string. Porém quando o conjunto especifica mais de uma região, por exemplo, o conjunto de elipses usados na folha de respostas, é preciso definir uma função que atribua um identificador único para cada uma das regiões do conjunto. Detalhes sobre o significado das variáveis $b, $l e $o estão abaixo no tópico 'Configuração conjunto de elipses'.

Atributos p1 e p2

Os atributos p1 e p2 definem, respectivamente, o ponto superior esquerdo e o ponto inferior direito (em pixel) da parte da imagem onde o conjunto deve ser interpretado.

Configuração conjunto OCR

Define um região onde será feito o OCR numérico. Não possui nenhuma configuração além dos atributos obrigatórios. Abaixo um exemplo com a definição completa de um template que possua somente um região, sendo essa do tipo 1.

<?php
return [
  'nome' => 'demo',
  'regioes' => [
    [
      'tipo' => 1,
      'id' => 'template',
      'p1' => [38,3171],
      'p2' => [400,3282],
    ],
  ],
];

O resultado do processamento dessa região será o OCR realizado.

Configuração conjunto de elipses

Para definir um conjunto de elipses é preciso especificar quantas quais objetos (conjunto de pontos pretos) devem ser considerados.

Os seguintes atributos devem ser adicionados para especificar um conjunto de elipses.

  • colunasPorLinha
  • agrupaObjetos
  • minArea
  • maxArea
  • casoTrue
  • casoFalse
Atributos colunasPorLinha e agrupaObjetos

Esses atributos alteram a forma como os contadores $b, $l e $o serão incrementados.

O atributo colunasPorLinha simplesmente informa para o gerador quantas elipses foram uma linha, ou seja, a quantidade de colunas por linha. Para a imagem de exemplo sendo utilizada as regiões de preenchimento de respostas possuem 20 colunas a cada linha, portanto:

  'colunasPorLinha' => 20,

O atributo agrupaObjetos define como dentro de cada linha os objetos da imagem serão agrupados. Neste exemplo queremos agrupar as questões de 5 em 5 formando a relação das alternativas de 'A' a 'E'. Portanto:

  'agrupaObjetos' => 5,

Tal configuração fará com que os contadores $b, $l e $o, os quais significam, respectivamente, contador de bloco, contador de linha e contador e de objeto possuam os seguintes valores:

  • $b {0,1,2,3} representando cada um dos blocos de questões (1-25, 26-50, 51-75 e 76-100)
  • $l {0,1,...,25} representando cada uma das questões dentro de um bloco
  • $o {0,1,2,3,4} representando cada um dos objetos dentro de uma linha

A valores atribuídos para colunasPorLinha e para agrupaObjetos possibilitaram que o contador $o possa ser utilizado para definir o retorno em casoTrue para todas as elipses no conjunto.

Atributo casoTrue

Define o valore retornado caso a elipse seja considerada como preenchida. No exemplo que está sendo tratado queremos o retorno 'A', 'B', 'C', 'D' e 'E' para as elipses de cada uma das questões da folha (de 1 a 100). Como comentado anteriormente o atributo casoTrue aceita como valor uma string ou uma função PHP.

Para obter o resultado de retorno como descrito acima é preciso utiliza uma função PHP e considerar o valor do contado de objetos $o para definir a saída. Sendo assim, a função de definição de retorno caso a elipses esteja preenchida será:

  'casoTrue' => function($b,$l,$o) { 
    switch ($o){
      case 0: return 'A';
      case 1: return 'B';
      case 2: return 'C';
      case 3: return 'D';
      case 4: return 'E';
    }
  },
Atributo casoFalse

O atributo casoFalse define o valor de retorno caso a elipse não seja considerada preenchida. Assim como o atributo casoTrue o valor deste atributo pode ser uma string ou uma função PHP.

Para este exemplo todas as regiões consideradas não preenchidas terão o mesmo valore de retorno, no caso 'W'. Portante a definição será:

  'casoFalse' => 'W',
Atributos minArea e maxArea

Definem a área mínima e a área máxima para considerar um objeto (conjunto conectado de pontos pretos) como uma região de interesse.

A quantidade de pixel pretos que compõem o objeto definem sua área.

Versão completa do arquivo gerador

Considerando todas a imagem de teste em uso e as etapas realizadas nos tópicos acima, a versão completa do gerador de template para a imagem considerando duas regiões, uma de OCR numérico e outra com várias elipses, será o seguinte:

return [
  'nome' => 'demo',
  'regioes' => [
    [
      'tipo' => 0,
      'p1' => [50,1493],
      'p2' => [2225,2674],
      'colunasPorLinha' => 20,
      'agrupaObjetos' => 5,
      'minArea' => 300,
      'maxArea' => 3000,
      'id' => function($b,$l,$o) {
        return "e_{$b}_{$l}_{$o}";
      },
      'casoTrue' => function($b,$l,$o) { 
        switch ($o){
          case 0: return 'A';
          case 1: return 'B';
          case 2: return 'C';
          case 3: return 'D';
          case 4: return 'E';
        }
      },
      'casoFalse' => 'W',
    ],[
      'tipo' => 1,
      'id' => 'template',
      'p1' => [38,3171],
      'p2' => [400,3282],
    ],
  ],
];