sistema de identificaÇÃo de cÉdulas - up.edu.br · figura 23 - exemplo de aplicação do...
Post on 20-Sep-2018
214 Views
Preview:
TRANSCRIPT
1
UNIVERSIDADE POSITIVO Núcleo de Ciências Exatas e Tecnológicas
Engenharia da Computação
SISTEMA DE IDENTIFICAÇÃO DE CÉDULAS
UP/NCET Curitiba 2008
2
UNIVERSIDADE POSITIVO Núcleo de Ciências Exatas e Tecnológicas
Engenharia da Computação
SISTEMA DE IDENTIFICAÇÃO DE CÉDULAS
Autor: Luciano Henrique Albano Prof. Orientador: Alessandro Zimmer
UP/NCET Curitiba 2008
3
RESUMO
Neste trabalho é apresentado um novo sistema de identificação de cédulas para auxiliar
portadores de deficiência visual na identificação do dinheiro em papel. Ele é composto por
um microcontrolador, uma câmera, uma memória e um sistema de áudio para que a
cédula descoberta possa ser informada ao usuário. Através de diversos filtros de
computação gráfica uma foto é tirada da cédula que será identificada, o processamento é
todo feito no próprio protótipo sem a necessidade do uso de um computador, permitindo
ao protótipo ser portátil, para que o usuário possa utilizá-lo em todo lugar que achar
necessário.
Palavras chave: computação gráfica, câmera c3088, OV6620, microcontroladores,
processamento de imagens em sistema embarcado, Freemann.
4
ABSTRACT
This work presents a new system of identification of bills to help people with visual
impairments in the identification of money on paper. He composed of a microcontroller, a
camera, a memory, audio system so that the ballot discovery can be informed to the user.
Through various filters, computer graphics a photo is taken of the ballot to be identified,
the processing is all done in the prototype itself without the need of using a computer,
allowing prototype to be portable so that the user can use it throughout place as
necessary.
Keywords: Computer graphics, camera c3088, OV6620, microcontrollers, the image
processing system on board, Freemann.
5
TERMO DE APROVAÇÃO
Luciano Henrique Albano
Sistema de Identificação de Cédulas
Monografia aprovada como requisito parcial à conclusão do curso de Engenharia da Computação da Universidade Positivo, pela seguinte banca examinadora:
Prof. Msc. Alessandro Zimmer (Orientador)
Prof. Msc. Edson Pedro Ferlin
Prof. Dr. Ibrahim El Chamaa Neto
Curitiba Novembro/2008
6
SUMÁRIO
RESUMO 3
ABSTRACT 4
LISTA DE FIGURAS 8
LISTA DE TABELAS 10
LISTA DE SIGLAS 11
1 INTRODUÇÃO 12
2 FUNDAMENTAÇÃO TEÓRICA 13
2.1 MICROCONTROLADORES 13 2.2 MEMÓRIA 14 2.3 COMPUTAÇÃO GRÁFICA 15 2.4 CÂMERAS DIGITAIS 16 2.5 PROTOCOLO DE COMUNICAÇÃO I2C 17
2.5.1 CARACTERÍSTICAS GERAIS DO BARRAMENTO I2C 18
2.5.2 DEFINIÇÕES DO BARRAMENTO I2C 19
2.5.3 COMUNICAÇÃO 20
2.5.4 CONFIGURAÇÃO DA CÂMERA 21
2.6 PROTOCOLO DE COMUNICAÇÃO SPI 25
3 PROJETO 28
3.1 PROJETO DE SOFTWARE 28
3.1.1 AQUISIÇÃO DA IMAGEM 29
3.1.3 DEFINIÇÃO DO LIMIAR 34
3.1.4 LIMIARIZAÇÃO 36
3.1.5 EXCLUSÃO DAS BORDAS 37
3.1.5 HISTOGRAMA 39
3.1.6 ALGORITMO DE FREEMAN 40
3.1.7 FORMA DE IDENTIFICAR O NÚMERO 42
3.1.7 PLATAFORMA DE DESENVOLVIMENTO E AMBIENTE DE EXECUÇÃO 50
3.1.8 FLUXOGRAMA BÁSICO DE FUNCIONAMENTO 51
3.2 PROJETO DE HARDWARE 52
3.2.1 AQUISIÇÃO DOS DADOS 52
7
3.2.2 ARMAZENAMENTO 54
3.2.3 APRESENTAÇÃO DOS RESULTADOS AO USUÁRIO 55
3.2.4 DIAGRAMA DE BLOCOS 56
3.2.5 INTERAÇÃO ENTRE BLOCOS 56
3.2.6 INTERAÇÃO ENTRE SOFTWARE E HARDWARE 57
3.2.7 ESQUEMA ELÉTRICO 58
3.2.8 FOTOS DO PROTÓTIPO 59
3.3 PROTOCOLO DE TESTES E VALIDAÇÃO 61
APÊNDICE A - PREVISÃO DE CUSTOS 62
APÊNDICE B – CRONOGRAMA 64
4 CONCLUSÃO 65
5 REFERÊNCIAS BIBLIOGRAFIAS 67
1 - LIVROS 67 2 - MONOGRAFIAS, DISSERTAÇÃO E TESE 67 3 – INTERNET 67
6 MANUAL TÉCNICO/USUÁRIO 69
7 ARTIGO TÉCNICO 73
8
LISTA DE FIGURAS
Figura 1 - Microcontrolador Pic24FJ64GA006, modelo utilizado no projeto. 13
Figura 2 - Memória 14
Figura 3 – Exemplo de Comunicação I2C 21
Figura 4 - Análise Digital - Reduz Clock 22
Figura 5 - Análise Digital - Define Ajuste Automático de Branco 23
Figura 6 - Análise Digital - Controle de Contraste 23
Figura 7 - Análise Digital - Ajuste de Brilho 23
Figura 8 - Análise Digital - Ajuste da Saturação 24
Figura 9 - Análise Digital - Coluna Inicial 24
Figura 10 - Análise Digital - Linha Inicial 24
Figura 11 - Comunicação SPI Master Slave 25
Figura 12 - Protocolo SPI 25
Figura 13 - Análise Digital - SPI Gravação 26
Figura 14 - Análise Digital - SPI Leitura 27
Figura 15 - Funcionamento Básico do Software 28
Figura 16 - Funcionamento Câmera - Visão Macro 30
Figura 17 - Funcionamento Câmera - Visão Micro 31
Figura 18 – Erro no cálculo do limiar 34
Figura 19 - Calculo do Limiar Correto 35
Figura 20 – Imagem Limiarizada 37
Figura 21 - Aplicação da Exclusão de Bordas 38
Figura 22 - Exemplo Prático de Histograma 39
Figura 23 - Exemplo de Aplicação do Histograma 40
Figura 24 - Cadeias de Orientação 40
Figura 25 – Aplicações de Freemann 41
Figura 26 - Algoritmo Adaptado / Aplicação no Número 1 42
Figura 27 - Comparativo de Largura 42
Figura 28 - Exemplo de Vales 44
Figura 29 – Fluxograma Básico de Funcionamento 51
Figura 30 – Layout Visão Lateral 52
9
Figura 31 - Câmera CMOS 53
Figura 32 - Memória Flash de 2 Mbytes 54
Figura 33 - Diagrama em Blocos 56
Figura 34 – Interação em Blocos 56
Figura 35 – Interação Entre o Software e Hardware 57
Figura 36 - Esquema Elétrico 58
Figura 37 - Circuito Montado em Protoboard 59
Figura 38 - Placa Finalizada 59
Figura 39 - Visão Superior do Protótipo 60
Figura 40 - Visão Frontal e da Parte Inferior 60
Figura 41 – Gráfico do Rateio Entre os Centros de Custos 63
Figura 42 - Cronograma MS Project 64
11
LISTA DE SIGLAS
UP – Universidade Positivo
NCET – Núcleo de Ciências Exatas e Tecnológicas
JPG – Joint Photographic Experts Group (Grupo Experiente da União Fotográfica – formato
de arquivo de imagem).
I2
C – Inter-Integrated Circuit (Circuito Inter-Integrado).
D/A – Digital/Analog (Analógico/Digital)
RAM – Random Access Memory (Memória de Acesso Aleatório)
RGB – Red, Green and Blue (Vermelho, Verde e Azul – padrão de cores)
SPI – Serial Peripheral Interface (Interface Periférica Serial)
CMOS – Circuito integrado do tipo semicondutor metal-óxido complementar
NMOS – Semicondutor que utilize transistors de efeito de campo de metal óxido-
semicondutor.
VCC – Alimentação.
GND – Terra.
CLOCK – Relógio.
START – Condição de início.
STOP – Condição de parada.
ACK – Condição de sincronização.
MASTER – Dispositivo mestre.
SLAVE – Dispositivo escravo.
FLASH – Memória do tipo não volátil.
DATASHEET – Manual de um semicondutor.
Buzzer – Pequeno alto falante.
12
1 INTRODUÇÃO
A solução de problemas do cotidiano tem sido fonte de pesquisa e realização de trabalhos
de muitos alunos da rede universitária, seja para ajudar um conhecido, seja apenas para
disponibilizar uma solução para que uma parcela da população possa viver com mais
conforto.
Dentre esses problemas, um que merece destaque é a dificuldade que deficientes visuais
têm na identificação do dinheiro em papel, isto porque, mesmo com marcações nas
cédulas em alto relevo, após algum tempo elas vão se desgastando tornando impossível
sua identificação.
No Brasil existem cerca de 11,7 milhões de deficientes visuais conforme [11], é uma
parcela relativamente alta da população que sofre desta dificuldade.
O objetivo deste projeto é contribuir na melhoria da qualidade de vida destas pessoas,
tornando-as mais independentes da ajuda de desconhecidos, para isto este projeto irá
reconhecer uma cédula a partir de sua imagem e retornará seu valor através de uma
saída sonora.
Para isto foram utilizados diversos componentes como: câmera, microcontrolador,
memória flash, além de outros componentes cabos, conectores que auxiliarão o projeto.
13
2 FUNDAMENTAÇÃO TEÓRICA
Neste capítulo será apresentado um estudo dos principais assuntos abordados neste
projeto, que envolvem pesquisas sobre circuitos digitais, câmeras para obtenção de
imagens, microcontroladores e computação gráfica.
2.1 MICROCONTROLADORES
Microcontroladores, como definido por [Neto,2006] “São pequenos processadores
compostos de memória de programa, memória de dados, conversor de sinais analógicos
para sinais digitais, entradas e saídas de dados. São utilizados em larga escala em
aparelhos presentes do cotidiano como em fornos micro-ondas, televisores, câmeras
digitais, telefones, etc”.
O microcontrolador pode execucar várias operações matemáticas ou quaiquer outras
operações com os dados obtidos e/ou armazenado em suas memórias conforme [2].
Além disto, ele é responsável por executar o código fonte do programa, ou seja, cabe a
ele o processamento de todas as informações sejam de entrada ou saída de um outro
dispositivo. Na Figura 1 pode ser observado uma imagem do microcontrolador empregado
neste projeto.
Figura 1 - Microcontrolador Pic24FJ64GA006, modelo utilizado no projeto.
14
2.2 MEMÓRIA
Conforme [5], pode-se entender a memória com um grande armário repleto de gavetas,
onde cada gaveta armazena pequenas quantidades de roupas, cada roupa pode ser
considerada um arquivo.
Cada projeto deve possuir um local para armazenamento das informações, sejam elas
estáticas como o código fonte do programa ou dinâmicas como informações de entrada
ou saída que precisam ser processadas e logo em seguida descartadas.
A memória é o componente fundamental em qualquer projeto, por padrão a maioria dos
microcontroladores já possui tanto a memória estática bem com a dinâmica mas em
pequenas capacidades de armazenamento, obrigando assim que sejam utilizadas
memórias externas as que estão no microcontrolador.
As memórias externas por sua vez possuem uma capacidade de armazenamento muitas
vezes superior as que já veêm embutidas nos microcontroladores, permitindo que o
código fonte de programa que será executado possa ser maior ou ainda processar mais
dados de entrada e saída.
Na Figura 2 pode ser visto um desenho da memória utilizada neste projeto.
Figura 2 - Memória
15
2.3 COMPUTAÇÃO GRÁFICA
A computação gráfica surgiu da necessidade humana de visualizar informações. Com o
auxílio da álgebra linear a computação gráfica pode transformar e obter qualquer tipo de
informação a partir de uma imagem, utilizando-se diversos filtros, estes nada mais são do
que operações algébricas realizadas na imagem de origem sendo que o resultado é
enviado para uma imagem destino.
Na imagem destino haverá o resultado da aplicação do filtro. Existem inúmeros tipos de
filtros dentro da computação gráfica, cada filtro oferece um resultado diferente.
Na maioria das vezes o processo de se obter alguma informação de uma imagem não se
dá através da aplicação de um único filtro, mas sim da combinação de diversos filtros,
sempre aplicando o próximo filtro na imagem de saída do filtro anterior.
Com o alto processamento computacional disponível no mercado, a computação gráfica
ganhou um grande espaço entre programas de tratamento de imagens, diversas revistas
utilizam esses programas para melhoria das fotos disponibilizadas em suas edições.
Com isso é possível obter os mais diversos resultados, atingindo assim um objetivo
satisfatório.
16
2.4 CÂMERAS DIGITAIS
O olho humano, assim como os ouvidos, é um conversor A/D. Ele capta os diferentes tons
de luz refletidos pelos objetos do mundo real para pulsos elétricos, fazendo assim com
que o cérebro possa identificar objetos e cores.
A câmara digital revolucionou o processo de captura de imagens, contribuindo para a
popularização da fotografia que ao invés de utilizar a película fotossensível para o registro
das imagens, ela as registra através de um sensor que entre outros tipos podem ser do
tipo CMOS ou CCD, armazenando as imagens em cartões de memória.
Conforme [3], CCD (charge-coupled device) ou Dispositivo de Carga Acoplado é um
sensor para captação de imagens formada por um circuito integrado contendo uma matriz
de capacitores ligados (acoplados). Sob o controle de um circuito externo, cada capacitor
pode transferir sua carga elétrica para outro capacitor vizinho.
A capacidade de resolução ou detalhe da imagem depende do número de células
fotoelétricas do CCD. Se expressa este número em pixels. Quanto maior o número de
pixels, maior a resolução da imagem.
17
2.5 PROTOCOLO DE COMUNICAÇÃO I2C
Conforme descrito em [1], para explorar todos os benefícios dos sistemas e dispositivos
eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e
minimizar a complexidade dos circuitos.
Para facilitar esta árdua tarefa surgiu o protocolo de comunicação I2C.
O protocolo de comunicação em 2 sinais I2C foi originalmente desenvolvido pela Philips
em meados de 1996. Atualmente este protocolo está amplamente difundido e interconecta
uma ampla gama de dispositivos eletrônicos. Dentre estes encontramos vários
dispositivos de controle inteligente, normalmente microcontroladores e
microprocessadores assim como outros circuitos de uso geral, como drivers LCD, portas
de E/S, memórias RAM e EEPROM ou conversores de dados.
Muitas vantagens podem ser atribuídas ao protocolo I2C. Destacam-se entre elas:
- Organização funcional em blocos, providenciando um simples diagrama esquemático
final.
- Não há necessidade dos projetistas desenvolverem interfaces. Todos os dispositivos
integram as interfaces "on-chip", o que aumenta a agilidade no desenvolvimento.
- Endereçamento e protocolo de transferência de dados totalmente definido via software.
- Possibilidade de inclusão ou exclusão de dispositivos no barramento sem afetá-lo ou
outros dispositivos conectados a este.
- Diagnóstico de falhas extremamente simples. O mau funcionamento é imediatamente
detectado.
18
- Desenvolvimento simplificado do software através do uso de bibliotecas e módulos de
software reutilizáveis.
- Facilidade no desenvolvimento de placas de circuito impresso, devido a quantidade de
interconexões.
Adicionalmente, utilizando as vantagens da tecnologia CMOS na fabricação dos
dispositivos, temos:
- Baixíssimo consumo de corrente.
- Alta imunidade à ruídos.
- Ampla faixa de tensões para a alimentação.
- Ampla faixa de temperatura para a operação.
2.5.1 Características Gerais do Barramento I2C
- Suporta qualquer tecnologia de produção.
- Duas vias de comunicação: serial data (SDA) e serial clock (SCL), ambas bidirecionais,
conectadas ao positivo da fonte de alimentação através de um resistor de pull-up.
Enquanto o barramento está livre, ambas as linhas ficam em nível lógico alto.
- A taxa de transferência máxima é de 100kbit/s no modo padrão, ou 400kbit/s no modo
rápido.
- Todo dispositivo possui um endereço único no barramento, independente de sua
natureza.
19
- Qualquer dispositivo conectado pode operar com transmissor ou receptor. Claro que isso
depende da natureza do dispositivo - um LCD não vai operar como transmissor, assim
como um teclado não operará como receptor. Independente disto, qualquer dispositivo
endereçado é chamado de escravo (slave).
- O número de interfaces conectadas fica dependente da capacitância máxima do
barramento, que é de 400pF.
2.5.2 Definições do Barramento I2C
- Transmiter (Transmissor): dispositivo que envia dados através do barramento.
- Receive (Receptor): dispositivo que recebe dados através do barramento.
- Master: dispositivo que inicia a comunicação, gera o sinal de clock e encerra a
comunicação.
- Multi-master: vários dispositivos podem controlar o barramento, mesmo sem
comprometer a mensagem. Quando isto ocorre temos vários dispositivos operando em
modo master.
- Arbitrarion (Arbitrariedade): procedimento para o controle do barramento em modo multi-
master. Visa não corromper a transmissão dos dados e perder a sincronização do clock.
- Sincronização: procedimento para sincronizar o clock de um ou mais dispositivos.
20
2.5.3 Comunicação
Níveis lógicos: Como o protocolo de comunicação I2C aceita uma ampla gama de
métodos de fabricação para os seus dispositivos (CMOS, NMOS, Bipolar, etc.) os níveis
lógicos alto e baixo não possuem valores pré-estabelecidos, dependendo diretamente da
tenção de alimentação (VCC).
Validação dos dados: O dado na linha de dados precisa ser estável durante o período
ALTO do clock. A mudança entre os níveis lógicos alto e baixo só podem ser feitos
enquanto o sinal de clock estiver BAIXO.
Condições Iniciais e Finais: Durante todo o processo apenas dois sinais são
caracterizados como condições de START e STOP.
O procedimento de comunicação do protocolo I2C é extremamente simples. Basicamente
tem-se 6 itens para análise, pode ser acompanhado na Figura 3:
1. O dispositivo master ajusta a condição inicial.
2. O dispositivo master envia 7 bis de endereçamento.
3. O dispositivo master envia o 8o bit, RW/RD.
4. O dispositivo slave envia o sinal de ACK (Acknowledge).
5. O dispositivo master (ou slave) envia pacotes de 8 bits de dados, sempre
seguidos de um sinal ACK enviado pelo dispositivo slave (ou master) confirmando a
recepção.
6. O dispositivo master encerra a comunicação.
21
Figura 3 – Exemplo de Comunicação I2C
É importante fazer algumas observações:
O endereçamento padrão é feito com 7 bits, mas existe o modo extendido que possibilita
o uso de 10 bits de endereçamento (1024 dispositivos).
A quantidade de pacotes de transmissão é controlada pelo dispositivo master, não
possuindo um valor máximo definido. Este é um ponto importante a ser observado, pois
como os dados são transmitidos serialmente, na utilização de memórias, perde-se os
limites de endereçamento que existem nos dispositivos paralelos.
A comunicação pode ser suspensa, simplesmente travando-se o sinal de clock. Isto pode
ser útil para efetuar o tratamento de interrupções ou derivados, sem, no entanto,
corromper os dados transmitidos.
2.5.4 Configuração da Câmera
Conforme [4], o protocolo de comunicação I2C é utilizado exclusivamente para
configuração da câmera, ou seja, configuração de brilho, contraste, saturação, clock, etc.
Abaixo uma seqüência de comandos demonstra a forma de configuração da câmera.
Na Figura 4 pode ser visto a simulação do código que baixa o
Na linha superior I2C_CLK é enviado o sinal de
base do que é transmitido na linha inferior, a linha de
linhas em modo Alto, quando inicia
baixo, ficam em 0, a linha superior dispara o
linha inferior é enviado o primeiro comando
escrita. Na segunda seqüência de
neste caso o endereço é o valor 11 e por último é enviado o valor que será armazenado
na câmera, o valor 0x0A.
Figura 4 - Análise Digital - Reduz Clock
Na Figura 5 pode ser visto a simulação do código que define que a câmera não terá
ajuste automático de branco.
neste caso os valores são outros, primeiro vai o comando de escrita C0, depois vai o valor
do endereço que neste caso é 0x12 e por último o valor que será armazenado 0x20.
I2C_Cam_Write(0x11, 0x0A);
I2C_Cam_Write(0x12,0X20);
I2C_Cam_Write(0x05,0X00);
I2C_Cam_Write(0x06,0X00);
I2C_Cam_Write(0x03,0XFF);
I2C_Cam_Write(0x17,0XB5);
I2C_Cam_Write(0x19,0X3F);
//Primeiro Parâmetro: Registrador interno da c
//Segundo Parâmetro: Valor que será passado para o registrador.
pode ser visto a simulação do código que baixa o clock da câmera.
é enviado o sinal de clock, com este sinal é que sem tem a
do na linha inferior, a linha de dados. Inicialmente tem se ambas a
linhas em modo Alto, quando inicia-se a transmissão dos dados o sinal de
em 0, a linha superior dispara o clock composto por 9 bordas de subida e na
linha inferior é enviado o primeiro comando, o valor C0 indicando que é um comando de
escrita. Na segunda seqüência de clock é enviado o endereço onde será feito a escrita,
neste caso o endereço é o valor 11 e por último é enviado o valor que será armazenado
Clock
pode ser visto a simulação do código que define que a câmera não terá
Conforme explicado acima, a sequência é a mesma, porém
neste caso os valores são outros, primeiro vai o comando de escrita C0, depois vai o valor
do endereço que neste caso é 0x12 e por último o valor que será armazenado 0x20.
//BAIXA O CLOCK DA CAMERA
//AJUSTE AUTOMATICO DE BRANCO 24h SIM, 20 NÃO
//AJUSTE DE CONTRASTE MÁXIMO FF, MINIMO 00
//AJUSTE DE BRILHO MÁXIMO FF, MINIMO 00
//AJUSTE DE SATURAÇÃO MÁXIMO FF, MINIMO 00
//AJUSTE DA COLUNA INICIAL
//AJUSTE DA LINHA INICIAL
metro: Registrador interno da câmera.
//Segundo Parâmetro: Valor que será passado para o registrador.
22
da câmera.
, com este sinal é que sem tem a
dados. Inicialmente tem se ambas a
al de ambas vai para
composto por 9 bordas de subida e na
C0 indicando que é um comando de
onde será feito a escrita,
neste caso o endereço é o valor 11 e por último é enviado o valor que será armazenado
pode ser visto a simulação do código que define que a câmera não terá
Conforme explicado acima, a sequência é a mesma, porém
neste caso os valores são outros, primeiro vai o comando de escrita C0, depois vai o valor
do endereço que neste caso é 0x12 e por último o valor que será armazenado 0x20.
//AJUSTE AUTOMATICO DE BRANCO 24h SIM, 20 NÃO
MINIMO 00
//AJUSTE DE SATURAÇÃO MÁXIMO FF, MINIMO 00
Figura 5 - Análise Digital - Define Ajuste Automático de Branco
Na Figura 6 é mostrada a simulação do código que ajusta o contraste.
de escrita C0, depois vai o endere
neste endereço, 0.
Figura 6 - Análise Digital - Controle de Contraste
Na Figura 7 é simulado o ajuste do brilho.
vai o endereço 0x06 e por último o valor que será armazenado o 0.
Figura 7 - Análise Digital - Ajuste de Brilho
Define Ajuste Automático de Branco
é mostrada a simulação do código que ajusta o contraste. Primeiro vai o valor
de escrita C0, depois vai o endereço 0x05 e por último o valor que será armazenado
Controle de Contraste
é simulado o ajuste do brilho. Primeiro é enviado o valor de escrita C0, depois
vai o endereço 0x06 e por último o valor que será armazenado o 0.
Ajuste de Brilho
23
Primeiro vai o valor
ço 0x05 e por último o valor que será armazenado
Primeiro é enviado o valor de escrita C0, depois
Na Figura 8 é ajustada a configuração da saturação.
escrita, depois o endereço 0x03 e por último o valor o valor 0xFF.
Figura 8 - Análise Digital - Ajuste da Saturação
Na figura 9 é definido a coluna inicial que a câmera enviará, pois ela permite definir ajuste
da coluna inicial e final e da linha inicial e final.
a escrita, depois é enviado o endereço 0x17 e por último o valor 0xB5.
Figura 9 - Análise Digital - Coluna Inicial
Na Figura 10 é mostrada a configuração da linha inicial que a câmera enviará.
enviado o valor C0, depois é enviado o endereço 0x19 e por úl
Figura 10 - Análise Digital - Linha Inicial
é ajustada a configuração da saturação. Primeiro é enviado o comando de
escrita, depois o endereço 0x03 e por último o valor o valor 0xFF.
Ajuste da Saturação
é definido a coluna inicial que a câmera enviará, pois ela permite definir ajuste
da coluna inicial e final e da linha inicial e final. Primeiro é enviado o valor C0 para definir
o o endereço 0x17 e por último o valor 0xB5.
Coluna Inicial
a configuração da linha inicial que a câmera enviará.
enviado o valor C0, depois é enviado o endereço 0x19 e por último o valor 0x3F.
Linha Inicial
24
Primeiro é enviado o comando de
é definido a coluna inicial que a câmera enviará, pois ela permite definir ajuste
Primeiro é enviado o valor C0 para definir
a configuração da linha inicial que a câmera enviará. Primeiro é
timo o valor 0x3F.
25
2.6 PROTOCOLO DE COMUNICAÇÃO SPI
Conforme [12], o protocolo SPI (Serial Peripheral Interface) foi desenvolvido pela Motorola
para a linha de processadores da família MC68K. O SPI é um protocolo de comunicação
síncrono e opera no modo full-duplex. O protocolo SPI é composto por 4 sinais (Figura
11), são eles:
Sinais de dados: MOSI (Master data Output, Slave data Input) e MISO (Master data
Input, Slave data Output) são responsáveis pela transferência de dados entre o master e
o slave.
Sinais de controle: SCLK (Serial Clock) e /SS (Slave Select).
Figura 11 - Comunicação SPI Master Slave
Na Figura 12 pode ser observado a comunicação entre o dispostivo master e vários
dispositivos em modo slave utilizando o protocolo SPI.
Figura 12 - Protocolo SPI
Comunicação entre o dispositivo master e vários dispositivos slave utilizando o protocolo
SPI. Note que a seleção é feita pelo pino /SS, no caso da comunicação de um master
com diversos dispositivos slaves, requerem do microcontrolador um número grande de
pinos de seleção.
O protocolo de comunicação é muito simples, não
Por isso mesmo, este protocolo permite velocidade de comunicação mais alta que o I
Na Figura 13 é mostrado uma operação de gravação e na F
leitura.
Na Figura 13 uma análise será feita, a
instruções compostas por 8 pulsos cada, na segunda linha fica o
dados do microcontrolador para o dispositivo escravo,
enviado o valor 0x06 em binário 00000110, i
enviado a instrução de programação através do comando 0x02 ou 10 em binário, no
terceiro octeto de clock é enviado a primeira de três partes do endereço onde será
armazenado o dado, que neste caso é 0, depois é
0 novamente, esse foi o endereço.
Depois de enviado o endereço onde será gravado a informação, bastará enviar a
informação em si, o último octeto serve para isto, neste caso foi armazenado o valor 0x05
ou 101 em binário.
Figura 13 - Análise Digital - SPI Gravação
O protocolo de comunicação é muito simples, não requer uma programação complicada.
Por isso mesmo, este protocolo permite velocidade de comunicação mais alta que o I
uma operação de gravação e na Figura 14 uma operação de
igura 13 uma análise será feita, a primeira linha é a de Clock, são necessários 6
instruções compostas por 8 pulsos cada, na segunda linha fica o SDO, canal de envio de
para o dispositivo escravo, no primeiro pulso de
enviado o valor 0x06 em binário 00000110, isso habilitará o canal para escrita, depois é
a instrução de programação através do comando 0x02 ou 10 em binário, no
é enviado a primeira de três partes do endereço onde será
armazenado o dado, que neste caso é 0, depois é enviado 1 e no quinto octeto é enviado
0 novamente, esse foi o endereço.
Depois de enviado o endereço onde será gravado a informação, bastará enviar a
informação em si, o último octeto serve para isto, neste caso foi armazenado o valor 0x05
SPI Gravação
26
requer uma programação complicada.
Por isso mesmo, este protocolo permite velocidade de comunicação mais alta que o I2C.
igura 14 uma operação de
são necessários 6
, canal de envio de
no primeiro pulso de clock é
sso habilitará o canal para escrita, depois é
a instrução de programação através do comando 0x02 ou 10 em binário, no
é enviado a primeira de três partes do endereço onde será
enviado 1 e no quinto octeto é enviado
Depois de enviado o endereço onde será gravado a informação, bastará enviar a
informação em si, o último octeto serve para isto, neste caso foi armazenado o valor 0x05
27
A instrução de leitura composta na Figura 14 é mais simples, é composto por 5 octetos de
clock, no primeiro octeto é enviado através do canal SDO a informação de leitura,
composta pelo valor 0x03 ou 11 em binário, agora é enviado o endereço de onde será
lido, igual ao da Figura 13, no segundo octeto é enviado 0 no terceiro é enviado 1 e no
quarto octeto é enviado o 0 novamente e por último o dispositivo retorna através da
terceira linha o SDI o valor que está naquele endereço, neste caso o valor que foi gravado
o 5 ou em binário 101.
Figura 14 - Análise Digital - SPI Leitura
28
3 PROJETO
Neste capítulo será descrito o software e o hardware que foi utilizado para implementar
este projeto, bem como as tecnologias utilizadas, conceitos, esquemáticos e a forma que
as mesmas foram integradas para que o resultado seja satisfatório.
A Figura 15 ilustra o funcionamento básico do software.
Figura 15 - Funcionamento Básico do Software
3.1 PROJETO DE SOFTWARE
Para a elaboração do firmware (Software utilizado em dispositivos embarcados) foi
utilizada a linguagem de programação ANSI C, pela sua eficiência, praticidade e
funcionalidade. Quando a aplicação é utilizada em sistema embarcado as opções de
programação são restritas, além do ANSI C, pode se utilizar diretamente o Assembly
(Linguagem de programação utilizada na arquitetura de microcontroladores), mas é uma
linguagem de baixo nível, ou seja, extremamente complexa e isto acaba consumindo um
tempo desnecessário do projeto somente no estudo de sua arquitetura.
Início Obtenção da Imagem
Processamento Identificação
Saída Sonora Fim
29
3.1.1 AQUISIÇÃO DA IMAGEM
A aquisição da imagem se dá através de um sensor CMOS com uma lente embutida,
chamada de câmera, ela enviará a imagem da cédula para a memória, o software por sua
vez, buscará a imagem na memória e fará seu processamento.
Para configurações internas da câmera como brilho, saturação, contraste, é utilizado o
protocolo de comunicação I2C, quando o microcontrolador foi escolhido, ter este protocolo
como nativo foi fator decisivo, com isso, não será necessário efetuar o controle via
software para emular este protocolo.
Após abrir o canal de comunicação com a câmera, a mesma passa a enviar os dados
obtidos pelo sensor no formato YUV, onde o Y é o canal em escala de cinza que varia de
16 sendo o preto e 240 o branco, os valores abaixo de 16 e acima de 240 são utilizados
para controles internos da câmera.
Para converter a informação em RGB, utilizam-se as seguintes fórmulas, descritas no
datasheet do sensor da câmera:
Y = 0.59G + 0.31R + 0.11B
U = R – Y
V = B – Y
A resolução máxima da câmera é de 292 x 356, disponibilizando aproximadamente 110
mil pixels.
Para aquisição da imagem foi necessário baixar a velocidade da câmera, porque o
processador escolhido não era rápido o suficiente para leitura dos dados da mesma, a
velocidade original da câmera é de 8Mhz, isso gera aproximadamente 25 imagens por
segundo, para que o processador consiga efetuar a leitora a velocidade foi baixada para 1
imagem a cada 0,8 segundos.
30
O esquema de envio dos dados da câmera pode ser visto na Figura 16.
Figura 16 - Funcionamento Câmera - Visão Macro
O canal Vsync é o que controla uma nova imagem, toda vez que ele é acionado é porque
começou uma imagem. Depois que o Vsync vai para nível lógico baixo começa então o
Href, ele é responsável pelo início e fim de cada linha da imagem, enquanto o Href está
em nível lógico alto são enviados 255 valores através do canal Y e UV. Quando o Href vai
para nível lógico baixo foi porque aquela linha foi totalmente transmitida, depois ele irá
novamente para nível lógico alto causando a transmissão da próxima linha e isso se
repetirá até que todas as linhas sejam transmitidas, neste caso são 292 linhas.
Assim que todas as linhas foram transmitidas o Vsync vai para nível lógico alto
novamente indicando que uma nova imagem vai começar.
Na Figura 17 é possível ver o esquema de envio dos dados em uma visão micro, ou seja,
com possibilidade de análise do clock da câmera. As Figuras 16 e 17 foram modificadas,
não são as mesmas que constam no datasheet da câmera. A informação que consta lá
está confusa, com isso acabou dificultando o entendimento do funcionamento da câmera.
31
Figura 17 - Funcionamento Câmera - Visão Micro
Na Figura 17 pode ser visto os canais Y e UV de forma detalhada, o funcionamento é
idêntico ao da Figura 16, com diferença que agora pode ser visto cada um dos valores
dos canais. O Vsync vai para nível lógico alto indicando uma nova imagem, depois o Href
vai para nível lógico alto e os pixels são transmitidos, do primeiro a último, neste caso é o
352, depois se repetirá até que o Href chegue na última linha, 292.
Mesmo na menor velocidade da câmera (I2C_Cam_Write(0x11, 0x1F)), que gera cerca de
uma imagem a cada 1,4 segundos ainda não foi possível obter toda a imagem de uma
única vez, foi necessário obter um único valor de cada linha enviada, ou seja, a cada
imagem enviada pela câmera, era obtida uma única coluna. Na próxima imagem, outra
coluna e assim sucessivamente até terminar a imagem.
Para um melhor entendimento pode ser analisado a função de obtenção da imagem
seguindo o código abaixo.
32
void Foto(void){
unsigned char Imagem[QuantLinhas][QuantColunas]; //QuantLinhas e QuantColunas são definidas
unsigned short int linha = 0;
unsigned short int coluna = 0;
unsigned short int posicao = 0;
unsigned short int largura = 0;
unsigned short int limiar = 0;
for(coluna = 0; coluna<QuantColunas; coluna++){
while(isVSYNup); //Enquanto VSYNC estiver em ALTO
while(isVSYNdown); //Enquanto VSYNC estiver em BAIXO
for(linha = 0;linha<QuantLinhas;linha++){
while(isHREFdown); //Enquanto linha não começar
//For que controla qual coluna está sendo lida
for(posicao = 0;posicao<coluna;posicao++){
while(isPCLKup); //Enquanto clock estiver em ALTO
while(isPCLKdown); //Enquanto clock estiver em BAIXO
}
Imagem[linha][coluna] = PORTD & 0xFF;
while(isHREFup); //Enquanto linha não terminar
}
}
}
33
3.1.2 PRÉ-PROCESSAMENTO
Como a memória externa não pode ser implementada, devido a problemas de fabricação
dos chips, houve a necessidade de restringir o projeto, invés de utilizar a imagem inteira
foi utilizado apenas um dos cantos com tamanho de 70 x 80 pixels, este tamanho é
restrito devido ao tamanho da memória RAM do microcontrolador 8 kbytes.
Assim que a imagem é obtida, é necessário efetuar uma operação conhecida como
limiarização, porque nesse momento a imagem contém diversos tons diferentes de cinza,
essa operação transforma a imagem em apenas dois tons de cores o branco e o preto.
Como a imagem já é enviada pela câmera em tons de cinza, não houve a necessidade de
aplicação do filtro de média,
processo de identificação da imagem
Pode-se entender como limiar, o divisor de águas de uma imagem, ou seja, quem está
acima deste valor será agora branco e quem está abaixo será preto, porém este valor é
muito importante, porque se a cédula está escura o limiar deverá ser meno
clara o limiar será maior.
Quando o limiar não é calculado de maneira precisa
a seguir:
Figura 18 – Erro no cálculo do limiar
Esse limiar é considerado incorreto pois não conseguiu isolar o número da borda, c
na imagem da Figura 18, não é possível aplicar filtros que possam isol
ruído presente.
Para a definição do limiar existem algoritmos prontos como
computacional gasto por ele para definir o limiar acaba sendo muito grande quando se
utilizado em um microcontrolador.
3.1.3 DEFINIÇÃO DO LIMIAR
Como a imagem já é enviada pela câmera em tons de cinza, não houve a necessidade de
aplicação do filtro de média, que transforma a imagem em tons de cinza,
processo de identificação da imagem mais rápido.
er como limiar, o divisor de águas de uma imagem, ou seja, quem está
acima deste valor será agora branco e quem está abaixo será preto, porém este valor é
muito importante, porque se a cédula está escura o limiar deverá ser meno
Quando o limiar não é calculado de maneira precisa, acontece casos como o da
Erro no cálculo do limiar
Esse limiar é considerado incorreto pois não conseguiu isolar o número da borda, c
, não é possível aplicar filtros que possam isol
Para a definição do limiar existem algoritmos prontos como Otsu, porém o poder
computacional gasto por ele para definir o limiar acaba sendo muito grande quando se
utilizado em um microcontrolador.
34
Como a imagem já é enviada pela câmera em tons de cinza, não houve a necessidade de
que transforma a imagem em tons de cinza, isto tornou o
er como limiar, o divisor de águas de uma imagem, ou seja, quem está
acima deste valor será agora branco e quem está abaixo será preto, porém este valor é
muito importante, porque se a cédula está escura o limiar deverá ser menor e se estiver
acontece casos como o da Figura 18
Esse limiar é considerado incorreto pois não conseguiu isolar o número da borda, como
, não é possível aplicar filtros que possam isolar o número do
, porém o poder
computacional gasto por ele para definir o limiar acaba sendo muito grande quando se
Neste projeto o limiar é definido de acordo com a média dos pixels que estão no canto
extraído, quando a imagem é muito escur
a imagem é mais clara.
Um limiar bem calculado resulta em uma imagem isolada
bons resultados, conforme Figura 19
Figura 19 - Calculo do Limiar Correto
Na Figura 19, o cinco ficou completamente isolado da borda, um filtro que
bordas não terá dificuldades.
escrito que possa isolar o número de forma a ser possível diferenciá
Para definir o limiar foi utilizado o seguinte
para x de 1 até [LarguraImagem]
para y de 1 até [AlturaImagem]
Valor = Valor + Imagem
fim para
fim para
Limiar = Valor/(AlturaImagem*LarguraImagem)
definido de acordo com a média dos pixels que estão no canto
extraído, quando a imagem é muito escura o limiar tende a ser menor e vice versa quando
Um limiar bem calculado resulta em uma imagem isolada de forma que os filtros tenha
ons resultados, conforme Figura 19.
Calculo do Limiar Correto
, o cinco ficou completamente isolado da borda, um filtro que
das não terá dificuldades. Isso só é possível com a aplicação de um código bem
escrito que possa isolar o número de forma a ser possível diferenciá-lo das bordas.
utilizado o seguinte o pseudo-código abaixo.
até [LarguraImagem]
até [AlturaImagem]
Valor = Valor + Imagem[LarguraImagem][AlturaImagem]
Limiar = Valor/(AlturaImagem*LarguraImagem)
35
definido de acordo com a média dos pixels que estão no canto
o limiar tende a ser menor e vice versa quando
de forma que os filtros tenham
, o cinco ficou completamente isolado da borda, um filtro que retirará as
Isso só é possível com a aplicação de um código bem
lo das bordas.
[LarguraImagem][AlturaImagem]
36
3.1.4 LIMIARIZAÇÃO
O processo de limiariação (também conhecido como binarização) da imagem consiste em
dividir os pixels em apenas dois níveis, branco e preto, de acordo com os níveis de cinza.
Para que isso seja possível, escolhe-se um valor chamado de limiar T, esse valor definirá
quais pixels serão brancos e quais serão pretos.
Se o valor do pixel for maior que T, ele será modificado para branco (valor igual a 255),
caso seja menor que T ele será transformado para preto (valor igual a 0).
O limiar T pode ser definido manualmente ou de forma automática, a partir da análise do
histograma, assim que ele é definido percorre-se a imagem efetuando a nova
classificação, tendo assim uma nova imagem somente em dois tons de cores.
O pseudo-código abaixo ilustra como isso pode ser feito:
Na Figura 20 um exemplo da cédula após o filtro de limiarização, é possível observar
como já se destaca o número que deverá ser localizado.
para x de 1 até [LarguraImagem]
para y de 1 até [AlturaImagem]
se NovaImagem[x][y] > T então
NovaImagem[x][y] = 255;
senão
NovaImagem[x][y] = 0;
fim se
fim para
fim para
Figura 20 – Imagem Limiarizada
3.1.
Como pode ser observado na Figura 20
envolta do número, essa borda precisa ser elimi
ser aplicados.
O processo de exclusão das bordas, é um processo fixo, são excluídas 10 linhas
quatro lados da imagem, isso garante que as bordas pretas e eventuais ruídos sejam
excluídos.
A exclusão pode ser simulada
pode ser visto na Figura 21:
3.1.5 EXCLUSÃO DAS BORDAS
omo pode ser observado na Figura 20, é possível identificar que existe uma borda preta
envolta do número, essa borda precisa ser eliminada para que os próximos filtros possam
O processo de exclusão das bordas, é um processo fixo, são excluídas 10 linhas
quatro lados da imagem, isso garante que as bordas pretas e eventuais ruídos sejam
simulada de acordo com o pseudo-código abaixo
37
, é possível identificar que existe uma borda preta
nada para que os próximos filtros possam
O processo de exclusão das bordas, é um processo fixo, são excluídas 10 linhas dos
quatro lados da imagem, isso garante que as bordas pretas e eventuais ruídos sejam
código abaixo e um exemplo
Figura 21 - Aplicação da Exclusão de Bordas
QuantBorda igual 10
//Extrai a borda superior
para x de 1 até QuantBorda
para y de 1 até [
Imagem[x
//Extrai a borda inferior
para x igual AlturaImagem
para y de 0 até LarguraImagem
Imagem[x
//Extrai a borda esquerda
para x de 0 até QuantBorda
Para y de 0 até AlturaImagem
Imagem[x
//Extrai a borda direita
para x de 0 até LarguraImagem
para y de 0 até AlturaImagem
Imagem[linha][coluna]=255;
Aplicação da Exclusão de Bordas
//Extrai a borda superior
QuantBorda
[LarguraImagem]
x][y]=255;
borda inferior
para x igual AlturaImagem-QuantBorda até QuantLinhas
para y de 0 até LarguraImagem
x][y]=255;
//Extrai a borda esquerda
para x de 0 até QuantBorda
Para y de 0 até AlturaImagem
Imagem[x][y]=255;
//Extrai a borda direita
para x de 0 até LarguraImagem-QuantBorda ate LarguraImagem
para y de 0 até AlturaImagem
Imagem[linha][coluna]=255;
38
QuantBorda ate LarguraImagem
39
3.1.5 HISTOGRAMA
Depois que a imagem é limiarizada o número fica bem definido, ele fica em meio de um
grande número de pontos brancos, o histograma nada mais faz, que passar esses pontos
que estão no meio da imagem para o inicio, ou seja, passa a impressão de que todos os
pontos caíram e ficaram amontoados como se a gravidade deixasse de existir!
Se uma imagem fosse impressa e analisada com um microscópio seria possível ver algo
como a Figura 22, onde cada quadradinho representa um pixel, e o número que consta
em cada quadrado é o valor de cada pixel.
Figura 22 - Exemplo Prático de Histograma
Na Figura 22, têm-se três planilhas simulando uma imagem, na primeira planilha é uma
imagem que já foi limiarizada, onde o 0 representa os pontos pretos e o 1 os pontos
brancos. Na planilha 2, os pontos pretos foram removidos, ficando somente os pontos
brancos e por último na planilha 3 foi aplicado um histograma que transferiu todos os
números para o início da planilha. Está é apenas um exemplo didático do funcionamento
do histograma.
Na Figura 23 um exemplo da aplicação do histograma.
Imagem Normal
Somente Pontos Pretos
Histograma
0 0 0 0 0 0
0 0 0 1 1 0
1 1
0 0 1 1 1 0
1 1 1
0 1 1 1 1 0
1 1 1 1
0 0 0 1 1 0 1 1
1 1
0 0 0 1 1 0
1 1
1 1
0 0 0 1 1 0
1 1
1 1
0 0 0 1 1 0
1 1
1 1
0 0 0 0 0 0
1 1 1
0 0 0 0 0 0
1 1 1 1
Figura 23 - Exemplo de Aplicação do Histograma
3.1.6
Uma determinada região pode ser representada
existe o código de cadeia de Freeman
provável número esteja.
O algoritmo de Freeman descrito na F
possível da forma da região. O
seqüência conectada de segmentos de 4 ou 8 segmentos.
Figura 24 - Cadeias de Orientação
Na Figura 25 um exemplo de aplicação, utilizando ambas as cadeias com
(a) Código de Cadeia de 4 direções (b) Código de Cadeia com 8 direções.
Exemplo de Aplicação do Histograma
3.1.6 ALGORITMO DE FREEMAN
Uma determinada região pode ser representada em termos de seu contorno
existe o código de cadeia de Freeman, ela é aplicada assim que a região onde um
descrito na Figura 24 é a técnica de representação mais fiel
possível da forma da região. O mesmo é usado na representação do contorno por uma
ência conectada de segmentos de 4 ou 8 segmentos.
Cadeias de Orientação
um exemplo de aplicação, utilizando ambas as cadeias com
Código de Cadeia de 4 direções (b) Código de Cadeia com 8 direções.
40
em termos de seu contorno, para isso
, ela é aplicada assim que a região onde um
é a técnica de representação mais fiel
ão do contorno por uma
um exemplo de aplicação, utilizando ambas as cadeias como base.
Código de Cadeia de 4 direções (b) Código de Cadeia com 8 direções.
41
Figura 25 – Aplicações de Freemann
Antes da aplicação do algoritmo de Freeman é necessário codificar cada um dos números
que terão de ser encontrados, ou seja, encontrar a seqüência de caracteres que o número
impresso na cédula representa.
Depois de codificado, bastará aplicar o algoritmo e comparar os valores encontrados, com
os valores previamente especificados, assim é possível descobrir qual é o número que
está sendo analisado.
Para este projeto foi adaptado um algoritmo específico, que foi inspirado nos mesmos
passos aplicados por Freemann, o algoritmo é mais simples pois foi utilizado apenas para
as formas do histograma, ou seja, só vai para baixo, cima e para frente, ao contrário do
algoritmo original que permite que a borda seja mapeada em 360 graus.
Essa adaptação tornou mais simples e mais rápido o processamento, uma vez que se
fosse utilizado o algoritmo original o tempo para aplicar o filtro acabaria sendo muitas
vezes maior.
Conforme pode ser visto na Figura 26, o algoritmo trata apenas valores da esquerda para
direita isso torna mais rápido o processamento do que se percorresse o número conforme
Figura 25.
(c) Aplicação com cadeia de 4 direções. (d) Cadeia com 8 direções.
Figura 26 - Algoritmo Adaptado / Aplicação no Número 1
3.1.7 FORMA DE IDENTIFICAR O NÚMERO
Para identificar cada um dos números são isoladas 3 características, a largura de cada
número, a quantidade de vales que possui cada número e a soma do resultado do
algoritmo de Freemann.
Pode se perceber que a largura do número 1 é menor que a largura do
conforme Figura 27. Essa é uma característica
identificar o número, o 2 e o 5 possuem larguras semelhantes, para isso outras
características são extraídas de cada número.
Figura 27 - Comparativo de Largura
Algoritmo Adaptado / Aplicação no Número 1
FORMA DE IDENTIFICAR O NÚMERO
Para identificar cada um dos números são isoladas 3 características, a largura de cada
número, a quantidade de vales que possui cada número e a soma do resultado do
Pode se perceber que a largura do número 1 é menor que a largura do
. Essa é uma característica, porém somente com ela não é po
e o 5 possuem larguras semelhantes, para isso outras
características são extraídas de cada número.
Comparativo de Largura
42
Para identificar cada um dos números são isoladas 3 características, a largura de cada
número, a quantidade de vales que possui cada número e a soma do resultado do
Pode se perceber que a largura do número 1 é menor que a largura do número 10,
porém somente com ela não é possível
e o 5 possuem larguras semelhantes, para isso outras
43
Conforme código abaixo pode ser visto como é obtida a primeira característica, a largura.
unsigned short int CalculaLargura(unsigned char Imagem[70][80]){
unsigned short int linha=0;
unsigned short int coluna=0;
unsigned short int valor=0;
unsigned short int cont=0;
unsigned short int primeiraColuna=0;
unsigned short int ultimaColuna=0;
unsigned char HistoHorValores[QuantColunas];
unsigned short int largura=0;
//Conta a quantidade de pixels pretos em todas as colunas (Histograma)
for(coluna=0;coluna<QuantColunas;coluna++){
for(linha=0;linha<QuantLinhas;linha++){
valor = Imagem[linha][coluna];
if (valor==0)
cont++;
}
HistoHorValores[coluna]=cont;
cont=0;
}
valor = 0;
//Localiza a primeira coluna que contenham valores validos
for(coluna=0;coluna<QuantColunas;coluna++){
valor = HistoHorValores[coluna];
if(valor>2 && valor<40 && primeiraColuna==0){
primeiraColuna=coluna;
coluna=QuantColunas;
}
}
valor = 0;
//Localiza a ultima coluna que contenham valores validos
for(coluna=QuantColunas-1;coluna>0;coluna--){
valor = HistoHorValores[coluna];
if(valor>2 && valor<40 && ultimaColuna==0){
ultimaColuna=coluna;
coluna=1;
}
}
largura = ultimaColuna - primeiraColuna;
return(largura);
}
A segunda característica analisada é a quantidade de vales que o número possui, um vale
pode ser entendido como o pequeno espaço que separa o um do zero na nota de dez
reais, ou o dois e o zero na nota de vinte reais.
Na Figura 28 abaixo pode ser entendido melhor o conceito de vales.
Figura 28 - Exemplo de Vales
O código abaixo demonstra o algoritmo utilizado em linguagem
soma dos vales presentes em uma imagem.
10 possuí 1 único vale. 100 possuí 2 vales
A segunda característica analisada é a quantidade de vales que o número possui, um vale
pode ser entendido como o pequeno espaço que separa o um do zero na nota de dez
reais, ou o dois e o zero na nota de vinte reais.
abaixo pode ser entendido melhor o conceito de vales.
abaixo demonstra o algoritmo utilizado em linguagem ANSI C para localização e
soma dos vales presentes em uma imagem.
10 possuí 1 único vale. 100 possuí 2 vales
44
A segunda característica analisada é a quantidade de vales que o número possui, um vale
pode ser entendido como o pequeno espaço que separa o um do zero na nota de dez
C para localização e
45
E por último a terceira característica, conforme explicado acima sobre Freemann, é
encontrado uma “identidade” do número, por exemplo:
unsigned short int EncontraVales(unsigned char Imagem[70][80]){
unsigned short int linha=0; unsigned short int coluna=0;
unsigned short int valor=0; unsigned short int cont=0;
unsigned short int primeiraColuna=0; unsigned short int ultimaColuna=0;
unsigned short int numero=0; unsigned short int preVale=0;
unsigned char HistoHorValores[QuantColunas]; unsigned short int vales=0;
//Conta a quantidade de pixels pretos em todas as colunas (Histograma)
for(coluna=0;coluna<QuantColunas;coluna++){
for(linha=0;linha<QuantLinhas;linha++){
valor = Imagem[linha][coluna];
if (valor==0) cont++;
}
HistoHorValores[coluna]=cont;
cont=0; } valor = 0;
//Localiza a primeira coluna que contenham valores validos
for(coluna=0;coluna<QuantColunas;coluna++){
valor = HistoHorValores[coluna];
if(valor>2 && valor<40 && primeiraColuna==0){
primeiraColuna=coluna; coluna=QuantColunas;
} }
valor = 0;
//Localiza a ultima coluna que contenham valores validos
for(coluna=QuantColunas-1;coluna>0;coluna--){
valor = HistoHorValores[coluna];
if(valor>2 && valor<40 && ultimaColuna==0){
ultimaColuna=coluna;
coluna=1;
} }
for(coluna=primeiraColuna;coluna<ultimaColuna;coluna++){ //Localiza vales
valor = HistoHorValores[coluna];
//Localiza o primeiro ponto preto
if(valor>3 && numero==0){ //Achou o primeiro numero
numero=1; }
//Continua o processamento até encontrar o primeiro branco 1v0
if(numero==1 && valor<=3){
preVale=1;
}
//Achou o primeiro vale - 1v0
if(preVale==1 && valor>3){
vales++; preVale=0; numero=0;
} }
return(vales);
}
46
• 2 Reais
2,4,4,4,4,4,3,4,3,3,4,4,4,4,3,4,4,4,3,4,4,4,3,4,4,0,2,3,0,1,3,3,4,4,4,4,4,4,4,3,1,0,0,1,
0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,2
Cada número possui um código único, uma das formas para distinguir cada número, seria
fazer N médias até padronizar em 8 valores por exemplo, porém isso consumiria muito
tempo de processamento, para uma aplicação embarcada é quase inviável, a não ser que
o poder de processamento do microcontrolador seja muito alto.
Como já se possui outras duas características de cada número foi optado por efetuar uma
soma desses números, tendo assim um único número que varia em média 10%, mesmo
com essa variação grande ainda é possível efetuar a identificação de cada número.
Para o número 2 através de uma média entre 10 amostras a soma ficou próximo de 143,
para o número 10 a medida da soma foi de 293 e assim por diante.
Unindo as 3 características é possível classificar e identificar cada número.
O código abaixo demonstra a função utilizada para aplicar o filtro de Freemann.
unsigned short int Freemann(unsigned char Imagem[70][80]){
unsigned short int linha=0;
unsigned short int coluna=0;
unsigned short int valor=0;
unsigned short int cont=0;
unsigned short int primeiraColuna=0;
unsigned short int ultimaColuna=0;
unsigned char HistoHorValores[QuantColunas];
unsigned char identidade[256];
unsigned char achei=0;
unsigned char buffer[50];
unsigned short int colunaAjustada=0;
identidade[cont] = 2; //Todo numero inicia por 2 por causa da condição do 0 e do 4.
47
//Conta a quantidade de pixels pretos em todas as colunas (Histograma)
for(coluna=0;coluna<QuantColunas;coluna++){
for(linha=0;linha<QuantLinhas;linha++){
valor = Imagem[linha][coluna];
if (valor==0)
cont++;
}
HistoHorValores[coluna]=cont;
cont=0;
}
valor = 0;
//Localiza a primeira coluna que contenham valores validos
for(coluna=0;coluna<QuantColunas;coluna++){
valor = HistoHorValores[coluna];
if(valor>2 && valor<40 && primeiraColuna==0){
primeiraColuna=coluna;
coluna=QuantColunas;
}
}
valor = 0;
//Localiza a ultima coluna que contenham valores validos
for(coluna=QuantColunas-1;coluna>0;coluna--){
valor = HistoHorValores[coluna];
if(valor>2 && valor<40 && ultimaColuna==0){
ultimaColuna=coluna;
coluna=1;
}
}
linha = QuantLinhas;
coluna = primeiraColuna;
cont = 1;
achei = 0;
//Implementação de Freemann
while(primeiraColuna<=ultimaColuna){
//4
//&& identidade[cont-1]!=4 -> Condição adicionada para que não fique em looping
// entre o 4 e o 0 quando for um pico com caminho apenas de ída.
if(Imagem[linha-1][coluna]==0 && achei==0 && identidade[cont-1]!=0){
identidade[cont] = 4;
cont++;
48
achei=1;
linha--;
colunaAjustada=0;
}
//3
if(Imagem[linha-1][coluna+1]==0 && achei==0){
identidade[cont] = 3;
cont++;
achei=1;
linha--;
coluna++;
primeiraColuna++;
colunaAjustada=0;
}
//2
if(Imagem[linha][coluna+1]==0 && achei==0){
identidade[cont] = 2;
cont++;
achei=1;
coluna++;
primeiraColuna++;
colunaAjustada=0;
}
//1
if(Imagem[linha+1][coluna+1]==0 && achei==0){
identidade[cont] = 1;
cont++;
achei=1;
linha++;
coluna++;
primeiraColuna++;
colunaAjustada=0;
}
//0
//&& identidade[cont-1]!=4 -> Condição adicionada para que não fique em looping
// entre o 4 e o 0 quando for um pico com caminho apenas de ída.
if(Imagem[linha+1][coluna]==0 && achei==0 && identidade[cont-1]!=4){
identidade[cont] = 0;
cont++;
achei=1;
linha++;
49
Código 1 - Função de Freemann
Após a descoberta destas 3 características, uma quarta função composta por uma cadeia
de IFs, compara e decide qual o valor que se encaixa nas 3 características informadas.
colunaAjustada=0;
}
//Passou por todos e não encontrou valores que se encaixavam
//Ajuste, avança para a próxima coluna e vai aumentando a linha até chegar no chão
if(achei==0){
//A coluna soh pode ser ajustada uma vez
if(colunaAjustada==0){
coluna++;
colunaAjustada=1;
}
identidade[cont] = 0;
cont++;
linha++;
}
achei=0;
}
valor = 0;
Escreve_UART2("Freemann: ");
for(coluna=0;coluna<cont;coluna++){
sprintf(buffer,"%d,\0",identidade[coluna]);
Escreve_UART2(buffer);
valor = valor + identidade[coluna];
}
Escreve_UART2("Soma: ");
sprintf(buffer,"%d,\0",valor);
Escreve_UART2(buffer);
//Faz a Media
//Media_256_To_8(identidade,cont);
//Somatorio(identidade[256], cont);
return(valor);
}
50
3.1.7 PLATAFORMA DE DESENVOLVIMENTO E AMBIENTE DE EXECUÇÃO
A plataforma de desenvolvimento escolhida foi a MPLAB IDE 8.1, ela é oferecida
gratuitamente pelo fabricante de componentes eletrônicos Microchip, isto garantirá a
compatibilidade entre o código fonte e a arquitetura do microcontrolador, facilidade para
encontrar falhas, verificação em tempo real do quanto já foi utilizado da memória de
programa e a possibilidade de gravação diretamente no hardware, debug in circuit
(permite verificar erros em tempo real diretamente no hardware).
Este projeto não oferece um software para interação com o usuário, oferece apenas o
firmware, por este motivo não foi necessário a utilização de outras plataformas de
desenvolvimento.
Para auxiliar no desenvolvimento além da MPLAB, foi utilizado também o software
Borland C++ Builder Professional como complemento.
Para desenvolvimento do circuito foi utilizado o software Proteus, um programa muito
poderoso que oferece integração com o MPLAB, os códigos podem ser testados
diretamente no circuito, caso exista algum problema ele será descoberto antes que seja
confeccionada uma placa.
51
3.1.8 FLUXOGRAMA BÁSICO DE FUNCIONAMENTO
A Figura 29 demonstra o funcionamento do firmware.
Figura 29 – Fluxograma Básico de Funcionamento
Disponibiliza Som
Fim
Áudio
Não
Identificado
Nota=1 Nota=2 Nota=5 Nota=10 Nota=20 Nota=50 Nota=100
Áudio=1 Áudio=2 Áudio=5 Áudio=10 Áudio=20 Áudio=50 Áudio=100
Acabou Quadro
Desativa Câmera
Processa Imagem
Aplica Filtros
Identificação Positiva
Caso Nota
Inicio
Ativa Câmera
Envia Quadro
Não
Sim
Sim
Não
Seleciona Áudio
52
3.2 PROJETO DE HARDWARE
O hardware envolvido neste projeto é composto por: uma câmera digital, um
microcontrolador, uma memória FLASH e outros componentes que servirão para a
interligação, como resistores, capacitores, etc.
A Figura 30 mostra o layout do protótipo medindo 10(cm) de largura, 20(cm) de altura e
15(cm) de profundidade.
Figura 30 – Layout Visão Lateral
3.2.1 AQUISIÇÃO DOS DADOS
Para a obtenção da imagem foram necessários padronizar o fundo e as laterais na caixa
onde a cédula é fotografada, eliminando dessa forma ruídos que poderiam surgir na
imagem, como por exemplo: texturas diversas, cores semelhantes ao da cédula, bordas
que dificultariam o processo de identificação utilizado pelo software, etc.
53
Com essa padronização o sistema é mais rápido e o resultado mais confiável, caso não
houvesse a padronização haveria a necessidade de um tratamento através de software,
mesmo assim não seria possível garantir um nível de acerto tolerável, além de aumentar
o tempo de processamento.
Após a proposta inicial de se utilizar uma câmera digital convencional, lendo a imagem
diretamente do cartão de memória, verificou-se inviável este método, pois o formato que
as atuais câmeras salvam seus arquivos é o (JPG). Para trabalhar com este formato em
um software embarcado é praticamente inviável, pois o algoritmo de descompressão
deste arquivo é extremamente complexo e pesado.
Por este motivo foi escolhido uma micro câmera CMOS com saída digital, específica para
aplicações embarcadas. Este conjunto composto de sensor de captura de lentes é capaz
de obter imagens a distâncias inferiores a 4 (mm), além de ser colorido e enviar
diretamente quadros compostos pelos pixels RGB. Isso facilitará muito o processamento
da imagem. Na Figura 31 uma ilustração do módulo C3088, composto com sensor CMOS,
lente e placa.
Figura 31 - Câmera CMOS
54
3.2.2 ARMAZENAMENTO
Assim que a câmera começar a enviar os dados da imagem, eles terão de ser
armazenados em uma memória, para isto foi necessário unir ao projeto uma memória
flash externa ao microcontrolador.
A memória utilizada terá capacidade de armazenamento de 2 Mbytes embora à
quantidade estimada necessária para atender o projeto seja de 1 Mbyte, optou-se por
utilizar esta memória com capacidade superior, pois assim será possível armazenar todas
as imagens, economizando assim alguns ciclos de clocks que seriam utilizados para
apagar as imagens que já tivessem sido processadas.
A memória utilizada foi a M25P16 da ST Microeletronics, ela tem 16 pinos, 75MHz de
clock máximo e interface de comunicação SPI.
Na Figura 32 a ilustração dos pinos e tipo de encapsulamento da memória.
Figura 32 - Memória Flash de 2 Mbytes
55
3.2.3 APRESENTAÇÃO DOS RESULTADOS AO USUÁRIO
Após o processamento da imagem, é necessário informar ao usuário o resultado obtido,
para isto foi utilizado um pequeno alto falante que tocará bips distintos para cada uma das
notas conforme Tabela 1. Em caso da não identificação da mesma será tocado um bip
intermitente por 2 segundos.
Conforme [6], um sistema de áudio pode ser desenvolvido a partir de uma única saída do
microcontrolador, inicialmente foi feito somente com bips, porém no futuro o protótipo terá
um dispositivo mais avançado de som.
Tabela 1 - Relação de Notas e Bips
1 Real 1 Bip Rápido
2 Reais 2 Bips Rápidos
5 Reais 3 Bips Rápidos
10 Reais 1 Bip Longo
20 Reais 2 Bips Longos
50 Reais 1 Bip Longo e 1 Bip Curto
100 Reais 1 Bip Longo e 2 Bips Curtos
56
3.2.4 DIAGRAMA DE BLOCOS
A Figura 33 mostra o diagrama de blocos.
Figura 33 - Diagrama em Blocos
3.2.5 INTERAÇÃO ENTRE BLOCOS
A Figura 34 mostra a interação entre os blocos.
Figura 34 – Interação em Blocos
Inicia M I C R O C O N T R O L A D O R
Armazena Imagem na Memória Memória de
Programa
Sistema de Som
Câmera
Câmera
Ativa Câmera
M I C R O C O N T R O L A D O R
Memória Flash
Interna
Memória de Programa
Sistema de Som
57
3.2.6 INTERAÇÃO ENTRE SOFTWARE E HARDWARE
A Figura 35 representa a interação entre o usuário o software e o hardware.
Figura 35 – Interação Entre o Software e Hardware
Disponibiliza Som
Obtém Imagem
Ativa Câmera
Início
Usuário Firmware Hardware
58
3.2.7 ESQUEMA ELÉTRICO
Na Figura 36 o esquema elétrico dos componentes, não foi possível utilizar o componente
real da câmera, pois o mesmo não foi encontrado no software Proteus.
Para resolver este problema, foi desenhado um componente com as pinagens da câmera.
Figura 36 - Esquema Elétrico
59
3.2.8 Fotos do Protótipo
As Figuras 37, 38, 39 e 40, mostram o protótipo desde projeto montado em protoboard até
sua conclusão.
Figura 37 - Circuito Montado em Protoboard
Figura 38 - Placa Finalizada
61
3.3 PROTOCOLO DE TESTES E VALIDAÇÃO
O protocolo de testes e validação define as regras a serem seguidas para garantir que o
projeto funcione de acordo com o objetivo proposto de identificar o dinheiro inserido no
mesmo.
Como o projeto não foi modular não foi possível definir um protocolo em separado para
cada item, resumindo, ou o projeto está totalmente concluído para que possa ser testado
ou não havia possibilidade de testar somente a câmera ou o processador em separado.
Para a correta identificação da cédula, tem-se de inseri-la dentro da caixa do projeto
conforme Figura 40 onde a figura do rosto contido na cédula fique para cima e o número
pequeno fique na entrada da caixa.
Isto foi necessário porque a memória acabou não funcionando, por este motivo foi
necessário restringir a imagem a uma pequena área, então o sistema sempre fotografa
essa parte específica da cédula para efetuar o processamento.
Como o foco principal do projeto são deficientes visuais, logicamente eles não saberão
que lado está o rosto e que lado está o número, pensando nisto na pior das hipóteses o
usuário precisará inserir a imagem em 4 posições diferentes com isso levando 1 minuto
para identificar a cédula.
Além disso é necessário inserir a cédula junto a lateral esquerda e o fundo, de forma que
a cédula fique reta junto ao fundo, se ela ficar dobrada ou amassada não é possível ter
certeza de que o sistema conseguirá identificar a cédula.
Não é necessário utilizar uma iluminação extra, a câmera está configurada para trabalhar
com a iluminação fornecida pelo próprio sistema, em caso de uma luz extra acabará
saturando a imagem e fazendo com que o sistema não identifique a cédula.
O projeto será considerado válido desde que respeite os dados acima descritos.
62
APÊNDICE A - PREVISÃO DE CUSTOS
Na Tabela 2 é demonstrado o custo aproximado do projeto, caso fosse um projeto real e
não somente um trabalho de conclusão de curso. O valor é estimado com base tempo e
materiais, para uma melhor compreensão foi gerado um gráfico na Figura 41 que
representa a soma dos materiais e horas trabalhadas.
Recurso Custo Total
Horas de Engenheiro: Luciano Henrique Albano R$ 52.304,64
Borland C++ Builder Professional R$ 2.700,00
Consultoria: Alessandro Zimmer R$ 2.350,00
Laboratórios R$ 1.800,00
Notebook R$ 950,00
Aprovação: Edson Pedro Ferlin R$ 540,00
Utensílios R$ 500,00
Microsoft Project R$ 400,00
Proteus R$ 400,00
Osciloscópio R$ 350,00
Ferramental R$ 250,00
Microsoft Office R$ 200,00
Quartus II R$ 180,00
Microsoft Windows R$ 170,00
Câmera Digital CMOS R$ 100,00
Kit de Desenvolvimento ICD2 R$ 270,00
Conversor de Áudio R$ 50,00
Memória Flash R$ 50,00
Caixa do Dispositivo R$ 50,00
Cabos e Conectores R$ 50,00
Componentes R$ 50,00
Total R$ 63.714,64
Tabela 2 - Planilha de Custos
Na Figura 41 é apresentado o gráfico dos custos do projeto, separado por centros de
custo.
Figura 41 – Gráfico do Rateio Entre os Centros de Custos
R$52.304,64
Relatório de Resumo de Custo do Projeto
é apresentado o gráfico dos custos do projeto, separado por centros de
Gráfico do Rateio Entre os Centros de Custos
R$11.190,00
R$52.304,64
Relatório de Resumo de Custo do Projeto
63
é apresentado o gráfico dos custos do projeto, separado por centros de
Relatório de Resumo de Custo do Projeto
Material
Trabalho
64
APÊNDICE B – CRONOGRAMA
Na Figura 42 é demonstrado um cronograma com o tempo decorrido do projeto.
Figura 42 - Cronograma MS Project
65
4 CONCLUSÃO
O desenvolvimento deste projeto permitiu demonstrar que é possível a utilização de um
sistema de processamento de imagens embarcado, ou seja, sem a utilização de um
computador.
Diversos filtros aplicados na imagem acabaram demandando um tempo de
processamento superior ao esperado, porém os resultados foram satisfatórios, tendo em
vista que este projeto acabou sofrendo alguns problemas no decorrer do
desenvolvimento.
A memória empregada no projeto acabou não funcionando, o programa se comunica com
outras memórias com tamanho de armazenamento menores e mesmo protocolo de
comunicação, o SPI. Segundo informações do fornecedor um lote da memória estava com
problemas, isso fez com que o projeto ficasse limitado ao processamento de parte da
imagem apenas, e não da imagem inteira como previsto no início do projeto.
Diversos testes foram realizados depois que o protótipo estava funcionando, detectou-se
a necessidade de extrair mais características das cédulas, como cor e melhoramento do
sistema de identificação do limiar da cédula, porém mesmo sem esses parâmetros houve-
se um grau considerável de acertos da cédula fotografada.
A câmera empregada no sistema para fotografar a imagem demandou muito mais tempo
do que o esperado, além de envolver tecnologias não ensinadas no curso, isso fez com
que diversos conhecimentos sobre protocolos de comunicação fossem estudados
conforme [7, 8, 9 e 10], isso contribuiu para que outros sistemas possam ser
desenvolvidos, pois as tecnologias utilizadas são muito comuns em outros tipos de
dispositivos encontrados no mercado.
O microcontrolador utilizado acabou sendo um pouco lento para a aplicação, em média
está levando para fazer todo o processamento 15 segundos, esse tempo embora seja
66
pouco, a expectativa era de que não fosse superior a 5 segundos, porém isso não invalida
o projeto visto que futuras melhorias poderão deixar o projeto mais rápido.
O sistema de áudio desenvolvido para o projeto acabou sendo através de bips, um buzzer
ligado a uma porta do microcontrolador que faz o som se propagar de acordo com a
Tabela 1, devido ao problema da memória, descrito acima foi necessário utilizar este
sistema de saída de som, porque o tamanho de cada arquivo de som contendo o valor da
nota era superior ao que o microcontrolador tinha de memória interna.
67
5 REFERÊNCIAS BIBLIOGRAFIAS
1 - Livros
GONZALEZ, R. C.; WOODS, R. E. Processamento de Imagens Digitais. Editora Edgar
Blücher Ltda. São Paulo. 2000.
2 - Monografias, Dissertação e Tese
NETO, ERNANI DE SOUZA CUBAS – Interpretador de Textos Escritos em Linguagem
Braille. Curitiba, 2006. Monografia (Graduação).
3 – Internet
1 – Grupo de estudos sobre eletrônica
(http://www.eletronica.org/modules.php?name=News&file=print&sid=13).
2 – Microchip – Fabricante internacional de microcontroladores
(http://www.microchip.com).
3 – Omini Vision – Fabricante de chips de obtenção de imagens (http://www.ovt.com).
4 – CMUCam – Grupo de estudos sobre o sistema desenvolvido pela Carnegie Mellon
University (http://www.cmucam.org)
5 – Fabricante de Memórias – (http://www.numonyx.com).
6 – Roman Black – Grupo de estudos sobre som em sistemas embarcados
(http://www.romanblack.com).
7 – Jrobot – Grupo de desenvolvimento de um sistema utilizando a Camera C3088
(http://www.jrobot.net).
8 – Electronics123.com – Loja virtual com algumas informações de utilização da câmera
(http://www.electronics123.com).
68
9 – CoMedia.com – Fabricante da câmera C3088 – (http://www.comedia.com.cn).
10 – Burgos Eletrônica – Solda de Componentes smd –
(http://www.burgoseletronica.net/pgsmd/dessoldagemdesmdcomsolda.htm).
11 – Resultados do IBGE (http://www.entreamigos.com.br/noticias/BrasilRadiografia.html).
12 – Protocolo SPI (http://www.ee.pucrs.br/~terroso/html/protocolos.html).
top related