Você está na página 1de 39

UNIVERSIDADE ESTADUAL PAULISTA

Faculdade de Engenharia de Bauru Curso de Engenharia Eltrica

Curso de Graduao em Engenharia Eltrica

RASTREAMENTO EM TEMPO REAL COM CAMERA DE PAN-TILT

Aluno: Rodrigo Cuel da Silva Orientador: Prof. Dr. Jos Eduardo Cogo Castanho

Bauru 2011

RODRIGO CUEL DA SILVA

RASTREAMENTO EM TEMPO REAL COM CMERA DE PAN-TILT

Trabalho de Graduao do Curso de Engenharia Eltrica apresentado Faculdade de Engenharia de Bauru/UNESP.

Orientador: Prof. Dr. Jos Eduardo Cogo Castanho

Bauru 2011

FOLHA DE APROVAO Autor: Ttulo:

Trabalho de graduao defendido e aprovado em ____/____/____, com NOTA ______ (__________), pela comisso julgadora:

(Assinatura) (Titulao/nome/instituio)

(Assinatura) (Titulao/nome/instituio)

(Assinatura) (Titulao/nome/instituio)

Coordenador do Conselho de Curso de Graduao Engenharia Eltrica

DEDICATRIA

minha me, Isabel Cristina Cuel, e minha irm, Yasmin Cristina Cuel da Silva, pelo suporte em todos os momentos. E a Deus, por minha capacitao intelectual.

Como feliz o homem que acha a sabedoria, o homem que obtm entendimento, pois a sabedoria mais proveitosa do que a prata e rende mais do que o ouro. Provrbios 3:13-14

RESUMO
Este trabalho visa demonstrar a possibilidade de criao de um sistema com cmera para o rastreamento automtico de faces atravs da utilizao de software livre (biblioteca OpenCV, Processing e Arduino) e elementos de hardware simples, fceis de encontrar e de baixo custo. O projeto utiliza o cdigo de um exemplo da biblioteca OpenCV como ponto de partida para a gerao de um sinal que ser enviado para o micro controlador, Arduino. Nesta fase, o controlador traduzir o sinal e enviar comandos para que os servo motores corrijam o erro apresentado atravs de um movimento preciso.

LISTA DE FIGURAS

FIGURA 1 CONFIGURAO DE SERVO-MOTORES EM PAN-TILT.[7] ...................................................... 10 FIGURA 2 PLATAFORMA ARDUINO (MODELO DUEMILANOVE). ......................................................... 13 FIGURA 3 AS DUAS PRIMEIRAS CARACTERSTICAS HAAR NA CASCATA ORIGINAL DE VIOLA-JONES. ....................................................................................................................................................... 14 FIGURA 4 EXEMPLO DE CARACTERSTICAS HAAR USADOS NO OPENCV. .......................................... 15 FIGURA 5 TRUQUE DA INTEGRAL DE IMAGEM.................................................................................... 15 FIGURA 6 CLASSIFICADOR EM CASCATA UMA CADEIA DE FILTROS. ............................................... 17 FIGURA 7 EXEMPLO DE DETECO DE UMA, OU MAIS FACES COM O PROGRAMA EM PROCESSING ... 18 FIGURA 9 FOTO DA ESTRUTURA DE PAN E TILT DOS SERVO-MOTORES.............................................. 23 FIGURA 10 ARDUINO CONECTADO AOS SERVOS DE PAN E TILT. ........................................................ 24 FIGURA 11 DIAGRAMA DE BLOCOS DO HARDWARE. .......................................................................... 24 FIGURA 12 FOTO DO ESCUDO PARA ACOPLAGEM DO HARDWARE AO ARDUINO. ............................... 25 FIGURA 13 ESCUDO MONTADO SOBRE O ARDUINO. ........................................................................... 26 FIGURA 14 HARDWARE COMPLETO. ................................................................................................... 26 FIGURA 15 DETECO DE FACE DENTRO DA ZONA DE ERRO.............................................................. 28 FIGURA 16 FLUXOGRAMA DE CONTROLE DE SERVOS. ........................................................................ 29

SUMRIO
1. 2. INTRODUO ................................................................................................................. 8 REVISO BIBLIOGRFICA ......................................................................................... 9 2.1. OPENCV ...................................................................................................................... 10 2.2. PROCESSING ................................................................................................................. 11 2.3. ARDUINO ..................................................................................................................... 12 2.4. DETECO DE FACE COM OPENCV .............................................................................. 14 2.5. RASTREAMENTO FACIAL .............................................................................................. 18 2.6. SERVO MOTORES DE HOBBY ......................................................................................... 19 3. 4. OBJETIVO DO PROJETO ............................................................................................ 21 MATERIAIS E METODOLOGIA ................................................................................ 21 4.1. MATERIAIS ................................................................................................................... 21 4.2. METODOLOGIA............................................................................................................. 21 5. DESENVOLVIMENTO .................................................................................................. 22

CONCLUSO ......................................................................................................................... 30 REFERNCIAS...................................................................................................................... 32 APNDICE 1 .......................................................................................................................... 34 APNDICE 2 .......................................................................................................................... 38

1. INTRODUO
Durante os ltimos anos, o rastreamento de objetos tornou-se um dos campos mais populares de pesquisa no ramo da viso computacional, devido, em grande parte, vasta gama onde tais procedimentos podem ser utilizados. Na rea do rastreamento de objetos, destaca-se o rastreamento facial, que se apresenta relativamente complexo uma vez que um indivduo pode carregar consigo uma grande variedade de expresses, ao contrrio de objetos, que se apresentam de forma singular. O rastreamento facial em tempo real possui aplicaes bastante interessantes tais como, vigilncia por vdeo e monitoramento de segurana, interface avanada homem-mquina, vdeo conferncia, realidade virtual e anlise de gestos. No entanto para que ocorra um rastreamento efetivo, necessrio que o sujeito ou objeto a ser rastreado encontre-se sempre presente dentro do campo de viso da cmera. Para isso, a cmera deve se movimentar de maneira autnoma e pouco dispendiosa para que esta tarefa seja cumprida de maneira eficaz. Este projeto tem como objetivo o desenvolvimento de um sistema bsico para rastreamento em tempo real, de indivduos, com uma cmera montada sobre uma estrutura de motores montados em configurao de pan e tilt, onde sua imagem ser analisada e ento convertida em movimento atravs dos motores. Primeiramente montou-se uma estrutura para que dois servo-motores de hobby fossem posicionados de maneira a permitir movimentos de pan e tilt, criando-se assim o suporte para a cmera de vdeo. Em seguida, a partir de um exemplo da biblioteca OpenCV, construiu-se um cdigo quer fosse capaz de produzir dados de posio relativa de um rosto presente na imagem e transferir estes atravs de uma porta serial para que posteriormente fossem utilizados pelo micro controlador, Arduino. Neste passo, o Arduino, responsvel pelo controle do servos, se utilizando das informaes do software, reportaria os motores para a uma posio de maneira a corrigir o erro de posio do rosto em relao ao centro da imagem gerada pela cmera. Testes foram efetuados alterando-se parmetros do programa com a finalidade de se descobrir quais deles seriam os mais apropriados para a execuo, com maior eficincia, da tarefa de rastreamento proposta.

2. REVISO BIBLIOGRFICA
Uma identidade, usualmente identificada atravs do reconhecimento das caractersticas peculiares a um determinado indivduo ou objeto. Para um humano, essa tarefa to natural e cotidiana, que muitas vezes passa sem ser notada e no demanda ateno extra, uma vez que nossos olhos esto acostumados a identificar e se adaptar a padres distintos. Tornando o reconhecimento atravs da viso, um processo bastante simples e automtico.[9][10] No entanto para mquinas e computadores, esta realidade bastante semelhante, uma vez que para serem entendidas, as imagens devem ser, antes, processadas. No entanto, este processo demanda um alto custo computacional, isto , para a execuo de um movimento, o motor necessita de um sinal gerado pelo micro controlador aps receber uma informao de controle proveniente do software que processou as imagens. O que, em outras palavras, demandava um tempo expressivo e inviabilizava o rastreamento em tempo real. No entanto, o desenvolvimento de novos chips, processadores e tcnicas de processamento de dados bem como a evoluo do OpenCV, uma caixa de ferramentas que contm bibliotecas criadas para viso computacional, auxiliaram na otimizao deste processo e contriburam para a gerao de um processamento menos custoso computacionalmente. Contudo, agora a barreira passaria a ser o hardware. Contudo, devido ao grande avano em relao criao de sensores (CCD e CMOS, entre outros), mini e micro cmeras leves e de tamanho diminuto, foram desenvolvidas, tornando-as facilmente manipulveis sem a necessidade de esforo significativo.[9] Dessa maneira, acoplando-se dois mini servo-motores a fim de atingir a configurao de um dispositivo de Pan-Tilt (vide Figura 1) garantindo a liberdade de movimento de aproximadamente 90 graus na vertical e 180 na horizontal, e posicionando-se uma mini cmera no topo obtm-se um hardware bsico pronto para o rastreamento de indivduos ou objetos.[8]

Figura 1 Configurao de servo-motores em pan-tilt.[7]

2.1.

OpenCV
O OpenCV uma biblioteca de algoritmos de softwares de viso computacional

desenhada para aplicativos de viso e pesquisa em computadores pessoais. Em 2000, a Intel liberou uma verso beta do software para a comunidade Open Source. No ano de 2008, a empresa Willow Garage se tornou responsvel pelo OpenCV que recentemente, passou por uma expanso visando melhorias e atualizaes a fim de proporcionar suporte para uma maior gama de processadores embarcados e sistemas operacionais. Atualmente em sua verso 2.3, o OpenCV uma ferramenta multi-plataforma (disponvel para Linux, Macintosh, PC e plataformas mveis como Apple iOS e Android OS), com um grande foco em aplicaes em tempo real, escrita em C/C++ otimizado, contendo mais de 2.500 funes e inmeros exemplos de como aplic-las.[1]

10

As rotinas em OpenCV podem ser escritas atravs de programas que utilizam linguagens tais quais C, C++ e Python. Alm disso, possvel encontrar na rede, pacotes que tornam simples a comunicao entre o OpenCV e outros softwares como o Processing possibilitando que se desenvolva um aplicativo em Java utilizando a prpria biblioteca de viso computacional aberta. Para isso, deve-se instalar no computador em questo a caixa de ferramentas (Tool box) do OpenCV e, posteriormente, dentro do prprio ambiente de desenvolvimento, uma biblioteca necessria para a utilizao correta da ferramenta. A comunidade OpenCV conta com mais de quarenta e sete mil membros ao redor do mundo e uma completa documentao e descrio da ferramenta em seu portal online (http://www.opencv.org). A utilizao do software vai da criao de arte interativa explorao de minas, seja pela juno de mapas na web ou atravs de robtica avanada.[2]

2.2.

Processing

Processing, uma linguagem de programao e ambiente de desenvolvimento que desde 2001 promove o ensino de software dentro das artes visuais. Inicialmente, o software foi criado para a servir como um caderno de desenho via software bem como para ensinar fundamentos de programao de computadores dentro de um contexto visual. O Processing rapidamente evoluiu para uma ferramenta de trabalho tornando possvel a criao e acabamento de trabalhos profissionais. O ambiente de desenvolvimento uma opo livre (open source) que serve de alternativa a ferramentas de softwares com licenas caras, tornando-o acessvel a escolas e alunos. Por se tratar de uma licena livre, contribuidores e usurios so encorajados a compartilhar seus cdigos, pesquisas e bibliotecas, expandindo as reas de aplicao do software e facilitando o entendimento do mesmo. O Processing foi criado por Ben Fry e Casey Reas, ambos alunos do Laboratrio de Mdia do MIT, e posteriormente passou por avanos e melhorias nas Universidade Carnegie Mellon e UCLA O software Processing multi-plataforma, podendo ser rodado tanto em Linux/GNU, Macintosh ou Windows. Atravs de seu ambiente de desenvolvimento possvel gerar 11

aplicativos independentes e applets, bem como arquivos PDF, DXF e TIFF dentre outros. Apesar de ter sido construdo em Java, linguagens como JavaScript, ActionScript, Ruby, Python e Scala, foram adaptadas para funcionar com algumas verses experimentais do Processing.[3] Os aplicativos em Processing so estruturados da seguinte maneira: Primeiramente declara-se as variveis a serem utilizadas, no inicio do programa, fora de qualquer estrutura. Em seguida o cdigo inserido na funo void setup() rodado apenas uma vez. Desta forma, aqui que entram comandos para criao de janelas e obteno de imagem, por exemplo. Por ltimo, todo o contedo da funo void draw() roda, continuamente, de cima a baixo at que o programa seja parado. Exigindo ento que as funes determinadas para o programa entrem aqui. O Processing tambm permite comunicao via porta serial. Para isso, deve-se iniciar a instncia Serial dentro da funo void setup() no comeo do programa. Posteriormente, dentro da funo void draw(), deve se utilizar o comando Serial.write() para o envio dos comandos via serial.

2.3.

Arduino

Devido a sua ampla disseminao, o Processing gerou outro projeto. O Wiring, que por sua vez, se utiliza da IDE (Integrated Development Environment Ambiente de Desenvolvimento Integrado, em portugus) do Processing com uma verso simplificada da linguagem C++ para ensinar artistas como programar micro controladores.[4] A criao do framework do Wiring levou ao surgimento de outro projeto, denominado Arduino. Originado em Wiring, o Arduino conta com linguagem de programao exclusiva com sintaxes simples que em sua essncia se assemelha a C/C++. Se utiliza de IDE prpria derivada do Processing e tem por objetivo criar e desenvolver ferramentas acessveis, de baixo custo, flexveis e fceis de usar por artistas e amadores. Alm do ambiente de desenvolvimento, o Arduino conta com a plataforma microcontrolada e credenciada sob licena creative commons (CC) baseada no chip microcontrolador ATmega168, ou ATmega328. Possui 14 pinos de entrada ou sada digitais (sendo 6 passveis de uso para PWM) e 6 entradas analgicas. 12

Sua memria interna para programa pode variar de 16Kb, para controladores ATmega168 a 32Kb, para o ATmega328. Os chips ATmega168 ou 328, oferecem suporte comunicao serial UART TTL (5v) disponveis nos pinos 0 (Rx) e 1 (Tx). Para a comunicao com o computador, um chip FT232RL, porta a informao para transmisso via USB, e seu driver virtual, disponibiliza uma porta COM virtual, no computador.[7]

Figura 2 Plataforma Arduino (modelo Duemilanove). O micro-controlador embarcado na placa, vem com um bootloader pr programado, o que torna possvel a transferncia de programas sem a necessidade de qualquer hardware externo. O Arduino programvel atravs de uma IDE prpria. A linguagem utilizada tambm prpria, no entanto muito parecida com C e aspectos de C++. Sua estrutura de programa, baseia-se em dois componentes principais: Setup e Loop. Setup, configura os pinos de entrada e sada, bem como as variveis contidas no programa. O loop, contm as linhas de cdigo e arquitetura do programa .

13

Por ser de baixo custo e possuir interface intuitiva, o Arduino possui uma grande comunidade de desenvolvedores e entusiastas, tornando-o bastante verstil e de simples utilizao.[3][5]

2.4.

Deteco de face com OpenCV

O exemplo de detector de faces do OpenCV[12] utiliza o mtodo que Paul Viola e Michael Jones[14] publicaram em 2001. Usualmente chamado de mtodo de Viola-Jones, esta aproximao, para detectar objetos em imagens, combina quatro conceitos chave: Caractersticas retangulares simples, denominadas caractersticas Haar Uma Integral de Imagem para deteco rpida de caractersticas O mtodo AdaBoost de aprendizado de mquina Um classificador em cascata para combinar com eficincia tais caractersticas

As caractersticas que Viola e Jones usaram so baseadas em pequenas ondas Haar. Ondas Haar so ondas quadradas de comprimento nico. Em duas dimenses, uma onda quadrada um par de retngulos adjacentes um claro e outro escuro.

Figura 3 As duas primeiras caractersticas Haar na cascata original de Viola-Jones. As combinaes reais de retngulos usadas para deteco visual de objetos no so ondas Haar verdadeiras. Na verdade, contm combinaes de retngulos mais apropriadas para tarefas de reconhecimento visual. Devido a esta diferena, estas caractersticas so denominadas caractersticas Haar, ao invs de ondas Haar. 14

Figura 4 Exemplo de caractersticas Haar usados no OpenCV. A presena de uma caracterstica Haar determinada subtraindo o valor mdio do pixel da regio escura do valor mdio do pixel da regio clara. Se a diferena estiver acima de um limite (estabelecido durante o processo de aprendizagem), a caracterstica dada como presente. Para determinar a presena ou ausncia de centenas de caractersticas Haar em toda localizao da imagem e em diferente escalas com eficincia, Viola e Jones utilizaram uma tcnica chamada Integral de Imagem. Em geral, integrar significa somar pequenas unidades. Neste caso, pequenas unidades so valores de pixels. O valor integral para cada pixel a soma de todos os pixels acima e a sua esquerda. Comeando do lado superior esquerdo e atravessando at o canto inferior direito, a imagem inteira pode ser integrada com poucas operaes integrais por pixel.

Figura 5 Truque da Integral de Imagem. Figura 5 1) Aps integrar, o pixel em (x, y) contm a soma de todos os valores de pixel no retngulo hachurado. Figura 5 2) Analogamente figura 5 1, a soma dos valores de pixel no retngulo D (x4, y4) - (x2, y2) - (x3, y3) + (x1, y1). 15

Como mostrado na Figura 5 1, aps a integrao, o valor no local de cada pixel, (x, y), contem a soma de todos os valores de pixels dentro de uma regio retangular que tem um canto na parte superior esquerda da imagem e outro em um local (x, y). Para encontrar o valor mdio do pixel neste retngulo, necessrio apenas dividir o valor em (x, y) pela rea do retngulo. Se for necessrio saber o valor somado para qualquer outro retngulo que no tenha um canto do lado superior esquerdo, deve se fazer o que ilustra a Figura 5 2. Supondo que fosse necessrio obter os valores somados em D. Podemos fazer A+B+C+D, menos a soma dos retngulos A+B e A+C, mais a soma dos valores dos pixels em A. Em outras palavras, D = A + B + C + D (A+B) (A+C) + A. Para selecionar as caractersticas Haar especficas para usar, e estabelecer os nveis de limite, Viola e Jones utilizam um mtodo de aprendizado de maquina denominado AdaBoost. O AdaBoost combina muitos classificadores fracos para criar um classificador forte. Aqui, fraco significa que o classificador apenas obtm a resposta certa com um pouco mais de freqncia do que uma adivinhao aleatria teria. No entanto, com uma grande quantidade de classificadores fracos e cada um pressionando um pouco para a direo correta, teremos uma forte fora combinada para chegar resposta correta. O AdaBoost seleciona um conjunto de classificadores fracos para combinar e atribuir um peso para cada um. Esta combinao balanceada o classificador forte.

16

Figura 6 Classificador em cascata uma cadeia de filtros. Viola e Jones combinaram uma serie de classificadores AdaBoost como um filtro de cadeia, mostrado na figura 6, que especialmente eficiente para a classificao de regies de imagens. Cada filtro um classificador AdaBoost com um nmero bastante pequeno de classificadores fracos. O limite de aceitao em cada nvel estabelecido baixo o suficiente para passar todos, ou quase todos, exemplos de face no conjunto de treinamento. Os filtros em cada nvel so treinados para classificar imagens de treinamento que passaram por todos os estgios anteriores. (o conjunto de treinamento um grande banco de dados de faces) Durante o uso, se algum desses filtros falhar em passar uma regio de imagem, esta regio imediatamente classificada como Sem Face. Quando um filtro passa 17

uma regio de imagem, ela vai para o prximo filtro da cadeia. Regies de imagem que passam atravs de todos os filtros na cadeia so classificadas como Face. A ordem dos filtros na cascata baseada no peso da importncia que atribuda ao AdaBoost. Os filtros mais pesados devem antes, para eliminar regies de imagem sem face o quanto antes, tornando mais simples a tarefa de identificar faces.

Figura 7 Exemplo de deteco de uma, ou mais faces com o programa em Processing

2.5.

Rastreamento facial

Usualmente, para efetuar-se tarefas de rastreamento em um vdeo, utiliza-se algoritmos prprios como o CamShift[15] (Continuously Adaptive Mean Shift), que se baseia na cor do objeto para distingui-lo do fundo. Todavia, o rastreamento facial, para esta aplicao, conta com a utilizao das tcnicas de deteco de face, descritas previamente. Atravs do mtodo de Viola Jones[14], no vdeo apresentado pela web cmera, faces so detectadas quadro a quadro e sinalizadas atravs de retngulos como apresenta a figura 7. O vdeo gerado pela cmera, visto pelo programa em Processing, como uma sequncia de imagens estticas, o que torna possvel a identificao de caractersticas Haar, e posteriormente sinalizao (atravs de um retngulo) das faces presentes.

18

2.6.

Servo motores de hobby

Os servo motores de hobby[6], doravante denominados servos, foram criados com a finalidade de eliminar a necessidade da criao de um sistema de controle para cada diferente aplicao. Atravs da utilizao de servos, etapas como o projeto de sistema de controle, anlise de resposta transiente, ajuste da malha de realimentao, escolha de motor e escolha de proporo de engrenagens foram muito simplificadas fazendo com que sua utilizao fosse difundida. Os servo motores, desde a dcada de 1990, tm usado um padro de modulao por largura de pulso para controlar a posio do eixo de sada. O pulso enviado ao servo via linha de controle. A linha de controle no fornece tenso diretamente ao motor e sim a uma entrada do chip de controle, presente dentro da estrutura do servo, que por sua vez controla o motor que utiliza uma fonte externa de alimentao. Consequentemente, pode-se utilizar qualquer tecnologia(CMOS, TTL ou componentes discretos) para gerar o sinal de controle. Como a tenso suprida separadamente, o terra de tenso deve ser o mesmo terra de controle para que o dispositivo tenha os mesmos parmetros e funcione corretamente. Apesar de possuir apenas trs fios, os fabricantes no padronizaram os pinos, no entanto, em sua maioria, os servos tem um fio preto que indica o terra, vermelho para a tenso de fonte e o branco para o controle. Os fios de tenso transportam a maioria da corrente ao motor. A corrente varia de quase 0 a 9.6mA, quando o servo no recebe nenhum sinal de controle a um mximo de corrente de 600mA quando operando com carga mxima. A tenso nominal dos servos de 5 Volts, ao passo que se aplicado um valor maior, estes podem ser danificados. O sinal de controle, como mencionado antes, feito atravs de modulao por largura de pulso, ou PWM. Para um sinal baixo a tenso do sinal deve ser de 0 volts (0 lgico) e 5 volts para um sinal alto (1 lgico).

19

Figura 8 relao entre largura de pulso e posio do servo. O controle lgico do servo, antes do sinal modulado (PWM), precisa de um sinal de no mnimo um milissegundo para A parte de controle do sinal fragmentada em tempos mnimos de 1ms, o sinal PWM de 1ms descrito previamente, e um delay de aproximadamente 20ms. Este delay no to crtico como outras partes do sinal de tempo. Essencialmente, este o tempo ocioso entre os sinais de controle. Se os sinais de controle forem repetidos muito rapidamente (ex. delay de 10ms), o servo ir zunir e ficar instvel. Se os sinais forem repetidos muito vagarosamente (ex. delay de 70ms) o servo ser desligado entre os sinais e sua posio no permanecer constante.

Os servos possuem seu prprio circuito embarcado em sua estrutura. Este circuito consiste em um comparador de largura de pulso, que compara o sinal de entrada com um temporizador que possui perodo que depende da resistncia de um potencimetro conectado ao eixo do motor. A realimentao responsvel pela estabilidade do circuito de controle. A diferena entre o sinal de controle e o sinal de realimentao o sinal de erro. Este sinal de erro usado para controlar um flip-flop que altera a direo que a corrente flui pelo motor. A sada do flip-flop controla um circuito de Ponte H que entrega uma maior corrente ao motor.

20

3. OBJETIVO DO PROJETO
Este projeto tem como propsito o desenvolvimento de um sistema autnomo bsico, de baixo custo, para a identificao de indivduos, e posteriormente mant-los no campo de viso da cmera de acordo com seus movimentos. Para o desenvolvimento experimental do projeto, foi utilizado uma web cmera VGA comum, servo motores, plataforma micro controlada, Arduino, para controle de motores e um programa em Processing para o manipulamento de imagem e gerao do sinal de controle.

4. MATERIAIS E METODOLOGIA
Para que este projeto fosse realizado, os materiais listados e a metodologia a seguir foram utilizados.

4.1.

Materiais

Foram utilizados os seguintes materiais: Cmera de vdeo para aquisio de imagens (web cmera VGA comum). Servo-motores de 9G, comumente utilizados em aplicaes de hobby para modelos radio controlados. Configurao para servos em Pan e Tilt. OpenCV. Processing. Arduino.

4.2.

Metodologia

O projeto foi dividido da seguinte maneira: 1. Planejamento Consistiu em pesquisa bibliogrfica e incio do desenvolvimento do software a ser 21

utilizado para a manipulao de imagens. 2. Desenvolvimento Consistiu no desenvolvimento do projeto, concluso do desenvolvimento do software, montagem dos motores em configurao pan-tilt, calibrao do software e programao do micro controlador. 3. Fase experimental Foram realizados testes para averiguar a velocidade de resposta, preciso e viabilidade do sistema criado. 4. Concluso Atravs dos resultados obtidos com as etapas anteriores, e anlise crtica do processo, obteve-se uma concluso.

5. DESENVOLVIMENTO
Com base na Figura 1, desenvolveu-se uma estrutura capaz de suportar dois servomotores na configurao necessria. Como resultado, obteve-se a estrutura apresentada na foto a seguir.

22

Figura 9 Foto da estrutura de Pan e Tilt dos servo-motores. De posse da configurao de servos em pan e tilt juntamente com a cmera, foram feitas conexes eltricas de maneira a controlador. Como o Arduino possui, em sua estrutura, um regulador de tenso que fornece sadas estveis de tenso em 5 e 3.3V, para esta aplicao no foi necessria a utilizao de fonte externa, uma vez que os servos necessitam de uma tenso de 5v e o ATMEGA 168 de 3.3V para funcionarem corretamente. Outra funcionalidade da plataforma Arduino, a criao de escudos que podem ser facilmente conectado sobre a placa, tornando as ligaes eltricas mais organizadas e menos laboriosas. Com este fim, foi criado um escudo que apresenta as mesmas ligaes da figura a seguir. conectar os motores sada de sinal do micro

23

Figura 10 Arduino conectado aos servos de pan e tilt. Para facilitar o entendimento, gerou-se o diagrama de blocos que pode ser visto na prxima figura.

Figura 11 Diagrama de blocos do hardware. 24

A figura a seguir mostra, em detalhe, o escudo criado para acoplagem do hardware ao Arduino.

Figura 12 Foto do escudo para acoplagem do hardware ao Arduino.

25

A imagem a seguir apresenta o detalhe do escudo montado sobre o Arduino.

Figura 13 Escudo montado sobre o Arduino. Detalhe do conjunto completo, isto , Arduino com escudo montado e cmera montada sobre a estrutura de pan e tilt.

Figura 14 Hardware completo. 26

Com o hardware pronto, para implementao, utilizou-se a plataforma Mac, uma vez que todos os aplicativos necessrios so multi-plataforma. Garantindo o mesmo funcionamento em outras plataformas suportadas desde que sob arquitetura Intel. Foram instalados os aplicativos Arduino, Processing, a biblioteca de OpenCV para Processing e Fritzing (necessrio para gerar as Figuras 10 e 11). Uma vez que a IDE do Arduino provm do Processing, a sua estrutura se mostrou mais eficaz quanto a comunicao serial, necessria para transmitir dados obtidos atravs da cmera para o micro controlador. O que fez portanto, o Processing, ser escolhido como ambiente de desenvolvimento da aplicao. Alterou-se o cdigo de um exemplo de reconhecimento facial que acompanha a biblioteca de OpenCV, para que o mesmo, alm de rastrear faces, fosse capaz de gerar dados da posio do retngulo, que delimita a face, em relao ao quadro fazendo com que posteriormente o programa do micro controlador pudesse corrigir o ngulo e manter o retngulo sempre no centro do quadro. O programa exemplo, inicializa a cmera, gera uma janela de 320x240 pixels e aplica um filtro deixando a imagem em escala de cinza, de maneira a reduzir substancialmente os detalhes desta, podendo assim, de maneira mais simples, com menor quantidade de memoria alocada e menor custo computacional, executar o reconhecimento e posterior rastreamento da face presente no quadro. Aps a aplicao do filtro, o software se utiliza do algoritmo de reconhecimento facial do OpenCV, e gera um retngulo atravs de comandos e classes do Processing ao redor da face a ser rastreada. Para tornar possvel a correo da posio do quadro por intermdio do motor, foi necessrio a criao de variveis, para armazenar o valor referente ao meio da tela, e em seguida comparar com a posio do retngulo gerado previamente. A fim de eliminar a constante correo de desvio de angulo, para evitar a tremulao na imagem, adicionou-se uma varivel para armazenar um intervalo de valor, fazendo com que apenas haja correo do quadro quando a diferena entre o centro da tela e do retngulo for maior que esta varivel. Resultando em uma imagem mais estvel e agradvel. Como apresenta a figura a seguir.

27

Figura 15 Deteco de face dentro da zona de erro. O cdigo comentado para o aplicativo em Processing pode ser visto no Apndice 1. Tendo em mos os dados obtidos atravs da anlise da imagem gerada pela cmera, optou-se por transmiti-los via comunicao serial ao Arduino, por ser mais simples e eficaz. Alm do fato de a IDE do Arduino ser derivada do Processing fazendo com que ambos programas, se comuniquem muito bem, tornando esta escolha uma opo ainda mais atrativa em relao ao OpenCV puro. Via serial, so enviados comandos que consistem em dois bytes. O primeiro a identidade do servo, ou seja, qual dos motores ser selecionado. O segundo consiste na posio para qual o servo deve se mover. Para o envio dos bytes, foi necessrio selecionar a porta serial COM1 (valor que pode ser alterado atravs do programa em Processing caso o Arduino seja utilizado por outra porta). Caso o micro controlador receba um byte que condiz com a identidade de um dos servos, ele aguarda pelo prximo byte de posio atribuindo assim, o valor recebido ao servo previamente identificado. O programa em Arduino se utiliza da biblioteca de servos, para facilitar e tornar mais limpa sua implementao. Basicamente foram criadas duas instncias. Uma para cada servo, atribuindo pinos para sada do sinal de controle gerado pelo micro controlador. E uma varivel para armazenar os dados recebidos via porta serial. 28

O programa utiliza um Baud Rate de 57.600bps para a transferncia de dados. Apesar de suportar transferncias de at 150.000bps, a taxa de 57.600 foi escolhida a fim de se respeitar o delay de 20ms imposto pelo servo para que seu comparador tenha tempo de processar a informao, evitando perda de dados e impedindo que o servo motor se torne instvel. Desta maneira, ao alimentar o Arduino, ambos os servos se reportam posio inicial de 90 graus e do inicio ao loop de programa que passa a aguardar por informaes na porta serial agindo apenas se o caractere adquirido for condizente com a identidade de um dos servos e reportando a correo indicada pela prxima informao. Executando assim, a funo desejada. Como indica o fluxograma a seguir.

Aguarda Caractere na Porta COM

No

Confere com identidade do servo?

Sim

No atua

Verifica prximo bit de dados

Atualiza posio dos servos Figura 16 Fluxograma de controle de servos. O programa em Arduino se utiliza de uma biblioteca interna para o controle dos servos. No entanto, esta biblioteca tem basicamente a funo de transformar os dados de movimento do servo de graus para milissegundos e ento gerar o sinal requerido para mover o motor. O 29

Arduino trabalha em uma frequncia de 16MHz, conta com um temporizador de 8 bits (variando a escala de 0 a 255), um fator de reduo de escala de 64 (devido ao temporizador interno utilizado do ATMEGA168) e outro temporizador que conta tempo de subida e descida (onda triangular). Se o temporizador contar de 0 at 255 e voltar a zero, existiro 510 pulsos de clock, que devero ser divididos por 2 (para compensar subida e descida) resultando em um valor mximo de 255, que utilizado para calcular a freqncia de sada PWM. Desta forma a freqncia de sada PWM de aproximadamente 500Hz, gerando um ciclo de trabalho de 2ms
[13]

. De posse deste valor e como ilustra a figura 7, a biblioteca tem como

funo, de acordo com a posio desejada e atravs de uma regra de trs, converter o valor em graus para um valor em ciclo de trabalho em milissegundos. Que por conseguinte reportar o servos posio desejada. O cdigo comentado para o aplicativo em Arduino pode ser visto no Apndice 2.

CONCLUSO
O primeiro passo, foi a criao da estrutura de apoio para movimentos em pan e tilt dos servos, baseado na figura 1 e observando o alcance mximo dos movimentos para que se obtivesse um dispositivo que tivesse seus movimentos limitados apenas pelas limitaes de hardware dos servos. Em seguida, montou-se os motores sobre a estrutura deixando-a completamente funcional. Calibrou-se o hardware pronto, para que a posio inicial fosse de 90 graus em amos os servos e em seguida acoplou-se a cmera sobre a estrutura, conferindo a esta, movimento em ambas direes de pan e tilt. Para movimentar a cmera de forma autnoma, utilizou-se dados obtidos atravs da imagem fornecida por esta. Um programa, escrito em Processing, utilizou bibliotecas do OpenCV para encontrar faces na imagem e mant-las sob rastreamento. O mesmo programa ainda foi responsvel por entregar ao Arduino, via comunicao serial, os dados para a movimentao dos motores pertinentes correo de erro desejada. Ainda no programa em Processing, alguns parmetros foram mudados por motivos de avaliao e testes.

30

O primeiro a ser variado foi o erro de centro de tela. Foram testados valores entre 1 e 20. Concluiu-se que o valor de erro igual a 15 ideal, pois abaixo deste valor, o sistema tende a corrigir a posio muito frequentemente tornando a imagem instvel. Acima de 15, a correo se mostrou lenta e no to eficaz pois o indivduo pode se mover com maior liberdade dentro do quadro e no ter a posio da cmera corrigida. Posteriormente, variou-se o grau de correo a ser aplicado aos servos. Concluiu-se que quanto menor o grau, mais preciso foi a correo, portanto para este parmetro, o melhor valor encontrado foi de 1. Desta maneira, os motores apresentaram um movimento suave e certeiro. As vantagens da utilizao de softwares como Processing e Arduino, bastante visvel na facilidade de comunicao e troca de informaes entre ambos, devido a uma origem comum. No entanto, a necessidade de manter a IDE do Arduino aberta para a recepo de dados pode representar uma desvantagem quando operando em computadores com recursos restritos. Alm disso, como o Processing utiliza uma linguagem de mais alto nvel do que a utilizada pelas interfaces do OpenCV, o custo computacional se torna maior tornando a aplicao ligeiramente mais lenta. Uma alternativa para esta desvantagem, seria a utilizao do OpenCV com uma interface em linguagem de mais baixo nvel como C, para otimizar o cdigo e obter uma resposta em menos tempo. No entanto, como o sistema deve respeitar velocidade de operao do servo, que muito menor do que aquela necessria para o OpenCV encontrar faces no aplicativo em Processing, concluiu-se que a utilizao da metodologia descrita suficiente para esta aplicao. O programa em Processing capaz, atravs do OpenCV, de encontrar mais de uma face no mesmo quadro, caso presente. No entanto, o rastreamento ser feito apenas para aquela que possuir menor distncia a partir da cmera, ou seja, o rosto que possuir o maior quadrado o delimitando. O sistema mostrou se funcional e responsivo para tanto para movimentos nos eixos de pan e de tilt separadamente, quanto em ambos simultaneamente, cumprindo assim, o propsito deste trabalho.

31

REFERNCIAS
[1] GREGORI, E. - Introduo a viso embarcada e a biblioteca OpenCV, disponvel em: http://www.embedded.com/Home/PrintView?contentItemId=4372167 - acessado em Outubro de 2012. [2] OpenCV, disponvel em: http://www.opencv.org/about.html - acessado em Outubro de 2012. [3] Processing, disponvel em: http://www.processing.org/about - acessado em Outubro de 2012. [4] Wiring, disponvel em: http://wiring.org.co/about.html - acessado em Outubro de 2012. [5] Especificaes da Placa Arduino Duemilanove, disponvel em: http://www.arduino.cc/en/Main/ArduinoBoardDuemilanove - acessado em Abril de 2011. [6] SAWICZ, D. - Hobby Servo Fundamentals, disponvel em: http://www.princeton.edu/~mae412/TEXT/NTRAK2002/292-302.pdf - acessado em Abril de 2011. [7] Datasheet ATMEGA168, disponvel em: http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf - acessado em Abril de 2011. [8] Kit de pan and tilt para servos, disponvel em: http://letsmakerobots.com/node/11421 - acessado em Abril de 2011. [9] Sensores CCD Vs. CMOS, comparaes, disponvel em: http://www.dalsa.com/corp/markets/ccd_vs_cmos.aspx - acessado em Abril de 2011. [10] SEBE, N. Machine Learning in Computer Vision, FACIAL EXPRESSION RECOGNITION, p. 187 200. 2005 - Springer [11] CHEN, C. H.; WANG, P. S. P., Handbook of Pattern Recognition and Computer Vision, Pattern Recognition with Local Invariant Features, p. 71 90. 2004 - World Scientific. [12] HEWITT, R. Seing With OpenCV - SERVO Magazine Pg. 48 - 52, Fevereiro de 2007, T & L Publications, Inc. [13] SHIRRIFF, K. Secrets of Arduino PWM. Disponvel em: http://www.arcfn.com/2009/07/secrets-of-arduino-pwm.html - acessado em Novembro 2012. 32

[14] VIOLA; JONES, Viola, P.; Jones, M., Rapid Object Detection using a Boosted Cascade of Simple Features, Procedings of CVPR, Pg. 511-518, 2011 [15] ALLEN, G.; XU, R.; JIN, J. Object Tracking Using CamShift Algorithm and Multiple Quantized Feature Spaces. In: NSW 2006, 2006.

33

Apndice 1
Cdigo comentado para o aplicativo em Processing. import hypermedia.video.*; //Inclui a biblioteca de video para capturar imagens da camera. import java.awt.Rectangle; //Inclui uma classe de retangulos que a juda a manter o controle das coordenadas da face. import processing.serial.*; //Inclui a biblioteca serial necessaria para a comunicao com o arduino. OpenCV opencv; //Valores de contraste e brilho. Int contrast_value = 0; int brightness_value Serial port; = 0; //A porta serial para a comunicao. //Identidades para a interface serial de comando em Arduino para os servos de Pan e Til char CanalTilt = 0; char CanalPan = 1; //Variveis para armazenar a localizao x e y do meio da face detectada. int midFaceY=0; int midFaceX=0; //Variveis que correspondem ao meio da tela e sero comparadas aos valores do meio da face. int midScreenY = (height/2); int midScreenX = (width/2); int midScreenWindow = 15; //"Erro" aceitvel para o meio de tela. //Grau de correo que ser aplicado a cada servo cada hora que a posio for atualizada int stepSize=1; void setup() { //Cria uma janela para o aplicativo. 34 //Cria uma instncia da biblioteca OpenCV.

size( width, height ); opencv = new OpenCV( this ); opencv.capture(width, height); opencv.cascade( OpenCV.CASCADE_FRONTAFACE_ALT); println(Serial.list()); //Abre stream de video. //Carrega a descrio de deteco

// Lista portas COM disponveis (Utilizado para descobrir qual porta serial est seno utilizaada pelo Arduino) //Seleciona a primeira porta serial da lista (altere o valor entre [] se o aplicativo falhar em conectar o Arduino) port = new Serial(this, Serial.list()[1], 57600); //Baud rate selecionado em 57600 //Print de como utilizar. println( "Drag mouse on X-axis inside this sketch window to change contrast" ); println( "Drag mouse on Y-axis inside this sketch window to change brightness" ); //Envia os ngulos iniciais de Pan e Tilt ao arduino para o Arduino fazer com que o dispositivo olhe para cima e para frente. port.write(CanalTilt); port.write(servoTiltPosition); port.write(CanalPan); port.write(servoPanPosition); } public void stop(){ opencv.stop(); super.stop(); } void draw() { opencv.read(); opencv.convert(GRAY ); opencv.contrast( contrast_value ); opencv.brightness( brightness_value ); //Pega um novo quadro. //Converte para cinza. //Envia a identidade do Servo de Tilt. //Envia a posio de Tilt (Atualmente 90 graus). //Envia a identidade do Servo de Pan. //Envia a posio de Pan (Atualmente 90 graus).

35

//Procede com a deteco. Rectangle[] faces = opencv.detect( 1.2, 2, OpenCV.HAAR_DO_CANNY_PRUNING, 40, 40 ); //Apresenta a imagem. image( opencv.image(), 0, 0 ); //Desenha rea de face (s). noFill(); stroke(255,0,0); for( int i=0; i<faces.length; i++ ) { rect( faces[i].x, faces[i].y, faces[i].width, faces[i].height ); } //Descobre se alguma face foi detectada. if(faces.length > 0){ //Se uma face foi detectada, encontra o ponto mdio da primeira face no quadro. //NOTA: As coordenadas x e y correspondem ao canto superior esquerdo do retngulo. //portanto, manipulamos estes valores para achar o ponto mdio do retngulo. midFaceY = faces[0].y + (faces[0].height/2); midFaceX = faces[0].x + (faces[0].width/2); //Descobre se a componente y da face est abaixo do meio da tela. if(midFaceY < (midScreenY midScreenWindow)){ //Se estiver abaixo do meio if(servoTiltPosition >= 5)servoTiltPosition da tela, atualiza a varivel de -= stepSize; posio para abaixar o servo de Tilt. } //Descobre se a componente y est acima do meio da tela. else if(midFaceY > (midScreenY //Atualiza a varivel de + posio para elevar o servo de midScreenWi Tilt. ndow)){ if(servoTiltPosition <= 175)servoTiltPosition +=stepSize; } 36

//Descobre se a componente X da face est esquerda do meio da tela. if(midFaceX < (midScreenX midScreenWindow)){ //Atualiza a varivel de if(servoPanPosition >= posio de Pan para mover o 5)servoPanPosition -= stepSize; servo para a esquerda. } //Descobre se a componente X da face est a direita do meio da tela. else if(midFaceX > (midScreenX + midScreenWindow)){ //Atualiza a varivel de if(servoPanPosition <= posio Pan para mover o servo 175)servoPanPosition +=stepSize; para a esquerda. } } //Atualiza as posies de servo enviando comando serial para o Arduino. port.write(CanalTilt); //Envia a identidade do servo de port.write(servoTiltPosition); Tilt. port.write(CanalPan); //Envia a posio de Tilt port.write(servoPanPosition); atulizada. delay(1); //Envia a identidade de servo de Pan. //Envia a posio de Pan atualizada. //Altera os valores de Contraste e Brilho. void mouseDragged() { contrast_value = (int) map( mouseX, 0,width, -128, 128 ); brightness_value = (int) map( mouseY, 0,width, -128, 128 ); }

37

Apndice 2
Cdigo comentado para o aplicativo em Arduino #include <Servo.h> //Biblioteca de servos para o controle de Pan e Tilt //Variaveis que armazenam as Identidades dos servos. char CanalTilt=0; char CanalPan=1; //Nome de cada servo. Servo servoTilt; Servo servoPan; //Variavel para armazenar os dados da porta serial. char CharSerial=0; void setup(){ servoTilt.attach(10); //Servo de Tilt anexado ao pino 10. servoPan.attach(11); //Servo de Pan anexado ao pino 11. servoTilt.write(90); //Inicialmente seta os servos para a servoPan.write(90); //posiao de 90 graus. Serial.begin(57600); //Inicia a conexao serial em 57600 } bps. void loop(){ while(Serial.available() <=0); //Aguarda um caractere na porta serial. CharSerial =Serial.read(); //Copia o caractere da porta para a if(CharSerial == CanalTilt){ variavel. //Verifica se o caractere e a identidade while(Serial.available() <=0); do servo de Tilt. //Aguarda pelo segundo byte de servoTilt.write(Serial.read()); comando da porta serial. } //Ajusta o servo de Tilt para o valor recebido pelo segundo byte de comando. else if(CharSerial == CanalPan){ //Verifica se o caractere e a identidade do servo de Pan. while(Serial.available() <= 0); //Aguarda pelo segundo byte de comando da porta serial servoPan.write(Serial.read()); //Ajusta o servo de Tilt para o valor } recebido pelo segundo byte de } comando. //Se o caractere recebido nao for a identidade do servo, sera ignorado.

38