Вы находитесь на странице: 1из 60

UNESP UNIVERSIDADE ESTADUAL PAULISTA CAMPUS EXPERIMENTAL DE SOROCABA

VISO ESTREO: IMPLEMENTAO DE UM PROTTIPO

RENATO QUARENTEI GARDIMAN

Sorocaba 2008

RENATO QUARENTEI GARDIMAN

VISO ESTREO: IMPLEMENTAO DE UM PROTTIPO

Trabalho de concluso de curso apresentado como parte das atividades para obteno do ttulo de Engenheiro, do curso de Engenharia de Controle e Automao da Universidade Unesp Sorocaba, rea de concentrao Robtica.

Orientador: Prof. Dr. Ivando S. Diniz

Sorocaba 2008
i

Dedico este trabalho a toda minha famlia principalmente a meus pais, irmos, avs, tios e tambm a uma pessoa especial.

ii

AGRADECIMENTOS

Agradeo a todos que de alguma forma apoiaram a elaborao deste trabalho em especial a Camila e Flvio Gardiman e Robinson Bruginski.

Tenha em mente que tudo que voc aprende na escola trabalho de muitas geraes. Receba essa herana, honre-a, acrescente a ela e, um dia, fielmente, deposite-a nas mos de seus filhos
Albert Einstein

iii

RESUMO

Este trabalho um estudo relacionado a viso estreo, passando pelos seus conceitos principais, que envolvem sistema humano e robtico de viso, profundidade inferida pelo par estreo e linhas epipolares. Na seqncia, se apresenta um prottipo experimental de baixo custo que possui duas cmeras, uma placa de captura instalada em um computador pessoal para aquisio das imagens e uma placa de controle de servomotores. O sistema conta com um software de reconhecimento de imagens e tambm responsvel por enviar os comandos para os servos via porta serial. Palavras-chave: Viso estreo, Robtica, Viso computacional.

iv

ABSTRACT

This paper presents a study in stereo vision, describing its main concepts, that involves human robotic vision, depth from stereo and epipolar lines. In the sequence it presents a low cost prototype with two cameras, a card capture installed in a personal computer for acquisition of images from cams and a control card for servomotors. This system has a software with image recognition algorithm and sends the control signals via serial port. Keywords: Stereo Vision, Robotics, Computer Vision.

LISTA DE FIGURAS

Figura 1.1.1 Esquema de um olho humano, adaptado da (GONZALES, 2002). .................... 3 Figura 1.2.1 Matriz CCD de 2048 x 2048, adaptado de (SIEGWART, 2004)........................ 4 Figura 1.2.2 Esquema de funcionamento do CCD, adaptado de (SIMES, 2008). ............... 5 Figura 1.2.3 a) Padro Bayer. b) esquema da mscara de filtros RGB, adaptado de (FAZENDO VIDEO, 2004) ....................................................................................................... 5 Figura 1.2.4 Cmera CMOS de baixo custo disponvel comercialmente, adaptado de (SIEGWART, 2004). .................................................................................................................. 6 Figura 2.1.1 Geometria idealizada para Viso Estreo adaptado de (SIEGWART, 2004). .... 8 Figura 2.2.1 Geometria epipolar para um sistema de duas cmeras, adaptado de (OLIVEIRA, 2006)................................................................................................................... 10 Figura 2.3.1 Tringulo genrico ............................................................................................ 11 Figura 3.2.1 Vista isomtrica do modelo no software SolidEdge. ........................................ 13 Figura 3.2.2 a) Caixa para abrigar as cmeras. b) Suporte para sustentar a caixa................. 13 Figura 3.2.3 Servo motor da marca MotorTech, empregado no prottipo (MOTORTECH, 2007). ........................................................................................................................................ 14 Figura 3.2.4 Cmera modelo 208C com sensor CMOS. ....................................................... 14 Figura 3.2.5 Vista isomtrica do modelo em SolidEdge. ...................................................... 14 Figura 3.3.1 Placa de captura Pico2000 ................................................................................ 15 Figura 3.3.2 Placa SSC-32 Servo Controller (LINXMOTION, 2007). ................................. 15 Figura 4.1.1 Diagrama de bloco dos sistema. ........................................................................ 17
vi

Figura 4.1.2 Janela principal do programa Viso Estreo. .................................................... 18 Figura 4.3.1 Mensurando erro a partir do centro de massa do alvo. ..................................... 20 Figura 5.1.1 Vista isomtrica da parte mecnica. .................................................................. 22 Figura 5.1.2 Viso de Topo do prottipo com seus componentes eletrnicos ...................... 23 Figura 5.2.1 Prottipo e os trs alvos usados nos testes. ....................................................... 23 Figura 5.2.2 Posicionamento geral do Alvo 1. ...................................................................... 24 Figura 5.2.3 Posicionamento geral do Alvo 2. ...................................................................... 24 Figura 5.2.4 Posicionamento geral do Alvo 3. ...................................................................... 25 Figura 5.2.5 Grfico das distncias mdias aferidas pelo prottipo versus a distncia real para o Alvo 1. ........................................................................................................................... 25 Figura 5.2.6 Grfico do desvio padro das distncias versus a distncia real para Alvo 1. .. 26 Figura 5.2.7 Grfico das massas mdias versus a distncia real para o Alvo 1. ................... 26 Figura 5.2.8 Grfico do desvio padro das massas versus a distncia real para o Alvo 1. ... 26 Figura 5.2.9 Grfico das distncias mdias aferidas pelo prottipo versus a distncia real para o Alvo 2. ........................................................................................................................... 27 Figura 5.2.10 Grfico do desvio padro das distncias versus a distncia real para Alvo 2. 27 Figura 5.2.11 Grfico das massas mdias versus a distncia real para o Alvo 2. ................. 28 Figura 5.2.12 Grfico do desvio padro das massas versus a distncia real para o Alvo 2. . 28 Figura 5.2.13 Grfico das distncias mdias aferidas pelo prottipo versus a distncia real para o Alvo 3. ........................................................................................................................... 29 Figura 5.2.14 Grfico do desvio padro das distncias versus a distncia real para Alvo 3. 29 Figura 5.2.15 Grfico das massas mdias versus a distncia real para o Alvo 3. ................. 29 Figura 5.2.16 Grfico do desvio padro das massas versus a distncia real para o Alvo 3. . 30

vii

LISTA DE ABREVIATURAS E SIGLAS

CCD Dispositivo de carga acoplado (charge-coupled device). CMOS (Complementary Metal Oxide Semiconductor) NTSC (National Television Standards Commitee) PAL (Phase Alternating Line) I/O (Input/Output) IEEE 1394 (Firewire) standard PCI (Peripheral Component Interconnect) Windos API biblioteca de funes do Windows (Aplication Programing Interface) WDM Padro de drivers criado pela Microsoft (Windows Driver Model) RGB Padro de cores Vermelho, Verde e Azul (Red, Green Blue) RAM Memria de Acesso Randmico (Randon Access Memory)

viii

SUMRIO

Introduo .................................................................................................................. 1 1 SITEMA DE VISO HUMANA E ROBTICA. ...................................................... 2


1.1 Elementos da Viso Humana. ....................................................................................... 2 1.2 Elementos da Viso Robtica. ....................................................................................... 4
1.2.1 1.2.2 1.2.3 Tecnologia CCD ........................................................................................................................... 4 Tecnologia CMOS ........................................................................................................................ 6 Consideraes sobre dados de sada. ......................................................................................... 7

2 VISO ESTREO .................................................................................................. 8


2.1 Coordenadas em um sistema binocular (estreo). ........................................................ 8 2.2 Geometria epipolar ...................................................................................................... 10 2.3 Determinao de distncia por triangulao ................................................................ 10

3 IMPLEMENTAO PRTICA. ............................................................................ 12


3.1 Idealizao. ................................................................................................................. 12 3.2 Definies da parte mecnica. .................................................................................... 12 3.3 Definies da parte eltrica e eletrnica. ..................................................................... 15

4 INTEGRAO DO SISTEMA COM O SOFTWARE............................................ 17


4.1 Arquitetura do sistema................................................................................................. 17 4.2 Driver da Placa de Vdeo............................................................................................. 19 4.3 Programao da Viso Estreo ................................................................................... 20

5 RESULTADOS ..................................................................................................... 22
5.1 Aparncia final............................................................................................................. 22 5.2 Resultado de medies de distncia com a Viso Estreo .......................................... 23

Consideraes finais .............................................................................................. 31 Apndice A Programa Principal ............................................................................. 34 Apndice B Desenho do Prottipo ........................................................................ 45 Anexo A libcoreblob ................................................................................................ 46
ix

INTRODUO

A viso o nosso sentido mais rico, atravs dela recebemos uma quantidade enorme de informao a respeito do ambiente que nos possibilita uma interao rica e inteligente dentro de um espao dinmico (SIEGWART, 2004). Portanto, um grande esforo realizado para prover s mquinas a habilidade da viso humana. Pode-se definir viso computacional como sendo um conjunto de algoritmos atravs dos quais sistemas baseados em computadores podem extrair informaes dos pixels1 que compem a imagem (BERTHOLD, 1986). Muitos trabalhos envolvendo veculos autnomos promovidos pelo DARPA (Defense Advanced Research Projects Agency) no Gran Challenge2 usam a viso estreo agregada a um conjunto de sensores para avaliar o ambiente externo evitar colises e respeitar as leis de trnsitos. Tambm em trabalhos cientficos nacionais como vemos em (SILVEIRA, el al) e (BEZZERRA, 2007) onde se propem e estudam-se as caractersticas da viso estreo, alm de sugerir solues para os principais problemas da viso estereoscpica. Este trabalho pretende mostrar a viso estereoscpica aplicada robtica atravs de conceitos e algoritmos. Para isso, compara-se o conceito de viso humana e viso robtica atravs dos sensores mais comumente usados na robtica. Aps essa breve comparao o trabalho apresenta os conceitos fundamentais da geometria e aplicao. Em seguida, apresentada uma plataforma de testes desenvolvida para viso estreo e os resultados alcanados.

1 2

Pixel Aglutinao de elemento de imagem em ingls (Picture Element) Gran Challenge um evento promovido pela DARPA para fomentar desenvolvimento de desenvolvimento de veculos autnomos.

1 SITEMA DE VISO HUMANA E ROBTICA.

A finalidade deste captulo introduzir conceitos relacionados viso biolgica e sua respectiva correspondente robtica. A seo 1.1 apresenta brevemente os mecanismos do sistema humano de viso incluindo a descrio do olho humano e a formao da imagem em seu interior. A seo 1.2 discorre sobre os principais sensores usados na robtica como anlogo ao olho humano.

1.1 Elementos da Viso Humana.


A Figura 1.1.1, a seguir, mostra uma seo horizontal do olho humano, nela se observa que o olho quase esfrico e tem dimetro de aproximadamente 20mm. Trs membranas recobrem o olho: crnea e esclera juntas forma a membrana externa, depois temos coride e a retina. A crnea um tecido transparente e resistente que reveste a parte anterior do olho, a continuao dessa membrana na parte posterior chamada de esclera uma membrana opaca que circunda o globo ptico (GONZALEZ, 2002).

Figura 1.1.1 Esquema de um olho humano, adaptado de (GONZALES, 2002).

A coride vem logo depois da esclera. Essa membrana contm a rede de vasos sanguneos que serve de fonte de nutrientes para o olho. A coride a uma capa bem pigmentada que ajuda a diminuir a quantidade de luz estranha que entra e o rebatimento de luz dentro do olho. Na parte anterior a coride se divide em corpo ciliar e o diafragma da ris que contrai e expande para regular a quantidade de luz que entra. Essa contrao e dilatao alteram o tamanho da pupila em dois a oito milmetros. A parte frontal da ris contm o pigmento do olho. Por sua vez, o cristalino formado por uma concentrao de clulas fibrosas que so conectadas ao corpo ciliar. Sua constituio varia entre 60 a 70% de gua, cerca de 6% de gordura e mais protenas que qualquer tecido do olho. O cristalino levemente amarelado e essa pigmentao aumenta com a idade. A membrana mais interna do olho a retina, que recobre a parte interna posterior. Quando foca-se a viso em algum objeto, a luz externa forma uma imagem na retina. A retina contm dois tipos de clulas sensveis a luz, que so os cones e os bastonetes. Os primeiros so responsveis pela percepo das cores e um olho possui entre 6 a 7 milhes que concentramse na regio central chamada fvea, sendo que para cada cone existe uma terminao com neurnio, a qual permite extrair mais detalhes dos objetos. O numero de bastonetes muito maior: cerca de 75 a 150 milhes e esto distribudos sobre a superfcie da retina. A grande rea de distribuio e o fato de vrios bastonetes estarem ligados a um nico neurnio diminuem a quantidade de detalhes discernveis por estes

receptores. Os bastonetes servem para dar uma viso geral da cena observada. Eles no esto envolvidos com as cores da viso e so sensveis a baixos nveis de iluminao.

1.2 Elementos da Viso Robtica.


No grande esforo que voltado para prover as mquinas automticas de sensores que imitem as capacidades do sistema de viso humana, o primeiro passo justamente os dispositivos sensoriais que captam a mesma matriz de informao de luz que o olho humano. Nessa seco descrevem-se as duas tecnologias para criao de sensores de viso: CCD e CMOS, os quais possuem limitaes especficas em desempenho quando comparados ao olho humano e tambm quando comparados um ao outro. 1.2.1 Tecnologia CCD O sensor CCD (Charged Coupled Device) ou traduzindo de maneira aproximada para o portugus, Dispositivo de Carga Acoplada que pode ser visto na Figura 1.2.1, um arranjo de elementos fotossensveis (pixels) que varia de entre 20.000 a alguns milhes no total, da vem o termo Megapixels muito divulgado pelas fabricantes de cmeras digitais atualmente.

Figura 1.2.1 Matriz CCD de 2048 x 2048, adaptado de (SIEGWART, 2004).

Cada pixel pode ser comparado a capacitores de descarga sensveis a luz, que variam de 5 a 25m em tamanho. No processo de captura da imagem, esses capacitores iniciam-se carregados e durante o perodo de exposio, os ftons de luz que entram pelo orifcio atingem esses capacitores liberando eltrons e acumulando cargas variveis de acordo com variao luminosa. Aps o perodo de exposio, as cargas individuais de todos os capacitores so congeladas e precisam ser lidas, o processo de leitura realizado em um canto do sensor, que l um pixel de cada vez. Para isso a fila de baixo transportada para o canto e lida, em seguida o processo repedido para a segunda fila, e assim por diante at varrer toda a matriz.

Figura 1.2.2 Esquema de funcionamento do CCD, adaptado de (SIMES, 2008).

Isso significa que cada carga deve ser transportada atravs do chip e seu valor deve ser preservado durante o transporte, o que requer um circuito especializado de controle e tcnicas customizadas pelos fabricantes para assegurar a estabilidade do transporte das cargas, como pode ser visto na Figura 1.2.2. O fotodiodo usado no CCD no tem a mesma sensibilidade a todas as freqncias de luz, sendo mais sensvel a luz infravermelha e menos a ultravioleta. O processo de captura independente da cor, pois est relacionado aos ftons que incidem sobre cada pixel. Existem dois tipos de soluo para gerar uma imagem colorida. Uma delas agrupar os elementos de imagens em grupos de 4 (quatro), ento filtros de cor verde, vermelha e azul so aplicados a cada elemento. Normalmente 2 (dois) pixels medem a intensidade do verde, enquanto o vermelho e azul so medidos por apenas um, numa distribuio proposta pelo pesquisador da Kodak chamado Bryce Bayer, conhecida como padro Bayer (FAZENDO VDEO, 2005), e pode ser visualizado na Figura 1.2.3.

a)

b)

Figura 1.2.3 a) Padro Bayer. b) esquema da mscara de filtros RGB, adaptado de (FAZENDO VIDEO, 2004) 5

O uso dessa soluo traz o problema da diminuio da resoluo, o numero de pixels no sistema foi diminudo por um fator de 4 (quatro). A segunda soluo evita esse problema quando divide o feixe de luz que entra em trs cpias que so direcionadas para sensores CCD diferentes com filtros de cores RGB. Essa soluo resolve o problema da resoluo mas como era de se esperar, torna o dispositivo excessivamente caro. A cmera CCD possui muitos parmetros que afetam o seu comportamento. Em alguns casos esses valores so fixos, em outros, so constantemente alterados com base em loops de realimentaes internos, esses parmetros alteram o brilho e as cores da imagem, dos quais a manipulao para garantir que uma camisa verde seja sempre verde em condies adversas de iluminao ainda se mantm como um problema aberto na comunidade de viso computacional. Uma segunda caracterstica desfavorvel aos sensores CCD o efeito chamado blooming que se trata de um ofuscamento dos pixels adjacentes, ocasionada por uma fonte luminosa mais intensa na imagem. 1.2.2 Tecnologia CMOS O sensor CMOS (Complementary Metal Oxide Semiconductor), que pode ser visto na Figura 1.2.4, semelhante ao CCD, pois tambm formado por uma matriz de pixels, porm cada pixel possui transistores especficos que realizam a transformao do sinal de carga acumulada nos capacitores para tenso eltrica.

Figura 1.2.4 Cmera CMOS de baixo custo disponvel comercialmente, adaptado de (SIEGWART, 2004).

Com essa soluo construtiva, os sensores CMOS possuem uma srie de vantagens sobre a tecnologia CCD. A primeira, e mais importante, ausncia de circuitos perifricos especializados como ocorre com os chips CCD. Isso tambm significa que a fabricao do chip
6

CMOS mais simples, tanto que a quantidade de empresas capazes de fabricar o sensor muito maior, gerando uma economia de escala. O sensor CMOS to mais simples que consegue consumir 1% (um por cento) da energia consumida por um sensor CCD, essa caracterstica o faz ideal para a rea da robtica. Por outro lado, temos algumas desvantagens, das quais a mais importante a menor sensibilidade causada pelo fato dos transistores existentes prximos a cada pixel utilizarem rea til. Dessa forma, os ftons que atingem esses transistores no so transformados em sinais, portando, diminui sua sensibilidade a luz. A segunda desvantagem o fato da tecnologia CMOS ainda ser jovem, assim o melhor modelo ainda significativamente inferior aos ltimos modelos de sensores CCD. No entanto, tudo indica que no futuro, a tecnologia CMOS ser a mais adotada. 1.2.3 Consideraes sobre dados de sada. A maioria das cmeras possui uma sada inerente que geralmente NTSC (National Television Standards Commitee) e PAL (Phase Alternating Line). Esses sistemas de cmeras incluem conversores D/A (Digital para analgico). Quando esse tipo de sinal usado em um sistema computacional para aquisio de imagens, ironicamente sofre uma transformao inversa por um conversor A/D. Esse processo injeta rudo o que prejudica a qualidade do sinal. Mais recentemente, os sensores pticos tanto CCD quanto CMOS j so fabricados com um sistema de sada de sinal digital que pode ser diretamente tratado pelos sistemas robticos embarcados. Em um nvel mais bsico, o chip de imagem fornece uma porta paralela de I/O (Input/Output) que permite o acesso direto ao valor de cada pixel da imagem. Em um nvel avanado da robtica, os pesquisadores usam protocolos mais rpidos para comunicao com os sensores, sendo o mais comum o IEEE 1394 standard (tambm conhecido como Firewire) e o USB 2.0 standard. Entretanto no presente trabalho foi utilizado o sistema de comunicao NTSC.

2 VISO ESTREO

O intuito deste captulo apresentar os fundamentos tericos que envolvem a viso estereoscpica, passando pela fundamentao matemtica, conceito da geometria epipolar e determinao de profundidade por triangulao.

2.1 Coordenadas em um sistema binocular (estreo).


Considerando-se um caso simplificado no qual duas cmeras so posicionadas com seus eixos pticos paralelos e uma separao b entre elas (SIEGWART, 2004), a idealizao da geometria vista na Figura 2.1.1.

Figura 2.1.1 Geometria idealizada para Viso Estreo adaptado de (SIEGWART, 2004).

Um ponto sobre o objeto descrito com as coordenadas (x,y,z) com relao a origem localizada entre as duas cmeras. A posio dos pontos que os raios luminosos projetam sobre a imagem das cmeras representada em um sistema de coordenadas especfico para cada uma, tal sistema local tem sua origem no centro das lentes e escrito como ( , reita e ( , ) para o sistema da esquerda. ) para cmera di-

A partir da geometria da figura se tem: = = (1)

E tambm se tem a seguinte relao para o plano fora da pagina: = Onde = (2)

a distncia entre as duas lentes e o plano da imagem. Note tambm que da (1) obtm-se: = (3)

Onde a diferena (

) chamada de disparidade e muito importante para viso es-

treo, pois atravs dela que se consegue obter a informao de profundidade. Usando a disparidade e resolvendo as 3 (trs) equaes consegue-se determinar as frmulas para o ponto que est sendo visto pelo sistema. = ; = ; = (4)

A partir da observao dessas equaes pode-se concluir que: A distncia inversamente proporcional disparidade, e quando objetos esto prximos s cmeras, pode ser medida com mais preciso. Para robs mveis isso perfeitamente aceitvel quando empregada em desvio de obstculos A disparidade proporcional ao parmetro , e se aumentado a distncia entre as cmeras que compem o sistema estreo, aumenta-se a preciso da inferncia da distncia. Mas na medida em que aumentamos alguns objetos podem aparecer em uma

cmera e no em outra, devido separao fsica entre elas. Tais objetos por definio no tero valor da disparidade logo no sero aferidos.

Um ponto visvel para as duas cmeras produzir duas imagens, uma em cada vista, essas imagens de pontos so chamados de par conjugado ou pontos correspondentes. Tais pontos so distribudos ao longo das linhas epipolares, que sero abordadas no prximo tpico.

2.2 Geometria epipolar


A busca pelo par conjugado chamada de emparelhamento ou machting (verso em ingls), considerada um dos principais problemas para a viso estreo, entretanto a geometria epipolar restringe o conjunto de candidatos a apenas uma dimenso (OLIVEIRA, 2006) diminuindo o espao de busca, uma vez que as disparidades sempre ocorrem ao longo das linhas epipolares. As linhas epipolares so a interseco do plano de triangulao (definidos pelos pontos , ,e na Figura 2.2.1) com os planos de projeo e dependem somente da posio e ori-

entao relativas entre as cmeras (parmetros extrnsecos) e do modelo de cmera (parmetros intrnsecos).

Figura 2.2.1 Geometria epipolar para um sistema de duas cmeras, adaptado de (OLIVEIRA, 2006)

2.3 Determinao de distncia por triangulao


Muito utilizada em topografia, baseia-se na Lei dos Senos, que permite inferir os lados do tringulo, quando se tem o valor de um dos lados, e o valor de dois ngulos dentro de um tringulo. Seja um triangulo qualquer descrito na Figura 2.3.1.

10

Figura 2.3.1 Tringulo genrico

=
Equao 5

Aplicando a Lei dos Senos viso estreo, considera-se um dos lados do tringulo como sendo a distncia entre as cmeras (C e B), e dois ngulos ( e ) que so inferidos a partir da varivel de posio do servo. Duas equaes so usadas para determinar a distncia L: = . ( ( ) )

Equao 6

= .
Equao 7

Onde no caso da viso estreo, o prpria cmera direita.

seria a distncia do objeto,

seria a distncia com rela-

11

3 IMPLEMENTAO PRTICA.

A idia principal deste captulo mostrar os detalhes da montagem do prottipo robtico de viso estreo. Passando pela idealizao at a montagem final.

3.1 Idealizao.
A princpio objetivou-se a construo de um prottipo com materiais baratos que pudessem ser facilmente encontrados. Desenvolveu-se uma estrutura cujo objetivo abrigar os servos e as cmeras e ainda possuir uma parte mvel para realizar os movimentos. Com realao a parte eltrica e eletrnica de controle para facilitar os testes e baratear o projeto foi escolhida uma arquitetura de controle no embarcada, facilitando principalmente a visualizao das imagens capturadas, o que no seria possvel com um processador de imagens embarcado.

3.2 Definies da parte mecnica.


Com o fito de usar materiais baratos escolheu-se a madeira como material estrutural. Um modelo foi elaborado no software SolidEdge V16, para documentar o prottipo, suas partes e suas medidas, alm de servir como referncia para o trabalho do marceneiro. A Figura 3.2.1 mostra a estrutura mecnica feita de madeira.

12

Figura 3.2.1 Vista isomtrica do modelo no software SolidEdge.

Estruturalmente o prottipo formado por duas peas, sendo uma delas a caixa onde se abrigam as cmeras e a outra o suporte para essa caixa com os rolamentos para dar liberdade ao movimento, identificadas na Figura 3.2.2. Foram utilizados 2 (dois) rolamentos do tipo fixo com uma carreira de esferas, com dimetro externo de 18 (dezoito) mm, dimetro interno de 7 (sete) mm e largura de 6 (seis) mm.

a)

b)
Figura 3.2.2 a) Caixa para abrigar as cmeras. b) Suporte para sustentar a caixa.

Na parte dos atuadores foram usados servomotores da marca MotorTech, conforme se v na Figura 3.2.3, que so fabricados para posicionamento de antenas parablicas. Esses atuadores so fixados estrutura por parafusos M3 de fenda de rosca soberba com 10 mm de comprimento.
13

Figura 3.2.3 Servo motor da marca MotorTech, empregado no prottipo (MOTORTECH, 2007).

Para os sensores da viso foi optado o uso de cmeras do modelo 208C com sensor CMOS colorido com sinal de sada NTSC, ilustrado na Figura 3.2.4.

Figura 3.2.4 Cmera modelo 208C com sensor CMOS.

Aps descritos todos os componentes mecnicos do prottipo, traz-se a Figura 3.2.5 com a vista isomtrica do modelo com as cmeras e os servomotores montados.

Figura 3.2.5 Vista isomtrica do modelo em SolidEdge.

14

3.3 Definies da parte eltrica e eletrnica.


Seguindo o objetivo de baixo custo, optou-se pela placa modelo Pico2000 para fazer a captura da imagem, a qual pode ser vista na Figura 3.3.1. Esta placa possui 4 (quatro) entradas de sinal NTSC/PAL e inserida no sistema computacional pelo slot3 de expanso PCI.

Figura 3.3.1 Placa de captura Pico2000

O sistema computacional de controle adotado foi uma plataforma PC Sempron 2800+ com 768 megabytes de memria RAM com sistema operacional Windows XP Professional SP2. O Sinal de controle dos servomotores gerado por uma placa da marca Linxmotion modelo SSC-32 Servo Controller, a qual se pode ver na Figura 3.3.2.

Figura 3.3.2 Placa SSC-32 Servo Controller (LINXMOTION, 2007).

SLOT - um termo em ingls para designar ranhura, fenda, conector, encaixe ou espao. Sua funo ligar os perifricos ao barramento do computador.

15

Dentre os principais atributos da placa, destacam-se: Baseada no microcontrolador da Atmel ATMEGA168-20PU trabalhando a 14,75MHz; Interface de porta serial RS-232; Pode controlar at 32 servos; Tem 4 (quatro) entradas (estticas ou latching4 e analgicas ou digitais); Range do servo 180; Resoluo de 1s; Distribuio da alimentao dos servomotores.

Finalizando assim as definies eltricas e eletrnicas.

Latching um tipo de entrada mantm o valor lido no instante determinado por um sinal.

16

4 INTEGRAO DO SISTEMA COM O SOFTWARE.

Neste captulo ser apresentado como foi realizada a integrao dos sistemas mecnico eltrico e eletrnico mediante ao software desenvolvido durante o trabalho.

4.1 Arquitetura do sistema.


O sistema formado por basicamente trs componentes: o computador pessoal, o mdulo de controle dos servos e a parte mecnica com os atuadores e sensores. Esses componentes so integrados por conexes ilustradas na Figura 4.1.1.

Figura 4.1.1 Diagrama de bloco dos sistema.

A linguagem de programao utilizada foi C, compilada com o compilador Lcc-win32, que um compilador para Windows livre para usos no comerciais (NAVIA, 2002). Utilizando biblioteca de funes do Windows chamada de API. (Aplication Programing Interface). Atravs das funes de vdeo do API do Windows includa no programa com vfw.h e um driver5 do dispositivo compatvel com o WDM Windows Driver Model, a aquisio da

Driver - programa ou rotina usada para interfacear e gerenciar um dispositivo de entrada/sada ou outros perifricos.

17

imagem e alocao em uma matriz RGB realizada por uma srie de funes que se encontram no APNDICE A. A comunicao serial realizada por um conjunto de basicamente 3 (trs) funes: inicializa, envia e a finaliza. Alm das funes, existem tambm os parmetros da porta serial que devem ser configurados para que funcione corretamente, dentre eles destacam-se a taxa de transferncia (BaudRate), a paridade (Parity), bit de parada (StopBit) e o tamanho em bits do caractere (ByteSize). Essas funes e a configurao desses parmetros so apresentadas no APENDICE A. O controle dos servos realizado ao enviar pela porta serial um conjunto de caracteres que define qual o servo e a posio final do movimento. Os caracteres enviados seguem o seguinte modelo estabelecido pelo fabricante SSC-32: # <ch> P <pw> <cr>. Onde <ch> o nmero do canal de sada, ou seja, aqui que selecionado o servo que vai efetuar o movimento. Na seqncia tem-se <pw>, que o tamanho do pulso em s, podendo variar de 500 a 2500, determinando a posio final do movimento. Por ltimo, necessrio o caractere <cr> que significa o Carry Return para que a placa execute o comando. Por exemplo, o seguinte vetor # 0 P 1500 \r, carregado e enviado para porta serial, vai fazer com que o servo que est ligado no canal 0 (zero) mova-se para uma posio que aproximadamente o meio curso do servomotor. O software visual e apresenta-se em uma grande janela contendo a imagem de uma cmera, alguns botes e algumas caixas de texto usadas para depurar o programa durante o desenvolvimento, os quais podem ser vistos na Figura 4.1.2.

Figura 4.1.2 Janela principal do programa Viso Estreo. 18

Na janela principal tem-se 6 (seis) botes do tipo push-button6 e suas funes sero descritas a seguir: V1 Mostra a viso da cmera DIREITA V2 Mostra a viso da cmera ESQUERDA DEBUGGER Usado durante a depurao do programa, sem funo especfica SERIAL Inicializa a porta serial FR Volta os servos para posio inicial CORE Liga a funcionalidade Estrea

4.2 Driver da Placa de Vdeo


A placa de vdeo Pico2000 foi desenvolvida especificamente para gerenciamento de cmeras de circuito fechado de televiso comumente utilizado em segurana. Assim sendo o driver de dispositivo que vem com o fabricante no tem suporte ao WDM. Por isso foi necessrio utilizar um driver genrico de cdigo aberto (TAGLE, 2003), desenvolvido para o controlador CONEXANT FUSION BT878A que empregado na placa Pico2000. Na seqncia, encontrou-se dificuldade de selecionar a entrada de vdeo da placa de captura, pois o driver genrico no dava suporte especfico a uma placa de 4 (quatro) entradas. Para solucionar esse problema utilizou-se de uma ferramenta que l e altera um valor de memria dentro da regio de endereamento do barramento PCI. Utilizando um software chamado RW-Everything (CHAN, 2003) foi possvel identificar qual posio de memria era responsvel pela seleo da entrada de vdeo. De posse dessa informao foi necessrio acrescentar uma biblioteca chamada TVicPortque pertence a um kit gratuito de desenvolvimento para portas diretas I/O em aplicativos Win327, da empresa EnTech Taiwan. Esse kit inclui um suporte transparente, fornecendo aos programadores mtodos padro para acesso em tempo real a portas e memrias mapeadas I/O

6 7

Push-button tecla de comando do tipo boto de presso. Aplicativos Win32 Sistemas desenvolvidos para o Windows.

19

- sem requerer que se escreva um dispositivo virtual personalizado ou um driver no modo kernel8. Assim, desenvolveu-se uma funo dentro do programa que faz o acesso a uma posio de memria do barramento PCI e altera seu valor, com isso pode-se alterar a cmera capturada pela placa. O cdigo dessas funes pode ser vistos no APNDICE A.

4.3 Programao da Viso Estreo


Uma das aplicaes da viso estreo vistas no captulo 2 a determinao da distncia por triangulao. Na teoria, consegue-se inferir a distncia do ponto a partir dos 2 (dois) ngulos e da distncia entre as cmeras do sistema estreo. Para determinar o centro do objeto procurado, utilizou-se um conjunto de funes pertinentes a libcoreblob implementadas por (BRUGINSKI, 2007), essas funes buscam a imagem por um pixel que esteja dentro de um intervalo previamente estabelecido e fazem a expanso da rea para encontrar o objeto inteiro, determinando a sua massa e o seu centro e podem ser conferidas no ANEXO A. Com a informao do centro do objeto, aplica-se um controle PI para manter o alvo no centro da imagem e assim, extrair a informao de distncia com o valor dos ngulos. O controle PI baseia-se no erro relativo ao centro de massa do alvo com o centro da imagem que medido em pixels, esse sinal de erro passa por um ganho proporcional e um integrador para somar ao sinal de sada de posio dos servomotores.

Figura 4.3.1 Mensurando erro a partir do centro de massa do alvo.

A partir da Figura 4.3.1 acima fica claro que se mensura erro na horizontal (erro x) e na vertical (erro y), e para cada um existe uma malha de controle e variveis separadas para atribuir seus respectivos ganhos, totalizando 3 (trs) malhas, pois na horizontal controla-se os

Kernel Ncleo do Sistema Operacional

20

motores independentemente, enquanto que na vertical os erros so somados e tira-se a mdia pois as duas cmeras esto dentro da mesma caixa e sujeitas ao mesmo movimento. O respectivo cdigo fonte que implementa essa rotina encontra-se no APNDICE A. Para inferir a distncia desenvolveu-se um algoritmo baseado na geometria do triangulo e na Lei dos Senos, que foi programado em uma funo C e pode ser visto no APNDICE A.

21

5 RESULTADOS

Este captulo destina-se a apresentar os resultados finais, mostrando algumas imagens do prottipo real e um grfico de resultado da determinao da distncia.

5.1 Aparncia final


Ao final da montagem e programao o prottipo mostrou-se apto a realizar os movimentos e as tarefas propostas, a seguir as Figura 5.1.1 e Erro! Fonte de referncia no encontrada. revelam a aparncia do prottipo real.

Figura 5.1.1 Vista geral da parte mecnica.

22

Figura 5.1.2 Viso de Topo do prottipo com seus componentes eletrnicos

5.2 Resultado de medies de distncia com a Viso Estreo


A metodologia usada para verificar o desempenho do prottipo baseou-se em posicionar 3 (trs) tipos de alvo vistos na Figura 5.2.1 em posies pr-determinadas com auxlio de uma trena como pode ser visto na Figura 5.2.2.

Figura 5.2.1 Prottipo e os trs alvos usados nos testes.

23

Figura 5.2.2 Posicionamento geral do Alvo 1.

Duas sries de 28 (vinte e oito) leituras, uma srie para distncia e outra para massa, ambas relativas ao alvo foram tomadas a cada variao de 1 (um) centmetro at a distncia total de 1 metro. A primeira medida foi de 6 (seis) centmetros devido as caractersticas construtivas do prottipo, ou seja, essa a distncia da linha de base das cmeras com a extremidade do prottipo. A seguir as prximas 2 (duas) figuras ilustram um posicionamento genrico dos outros dois tipos de alvos usados nos testes.

Figura 5.2.3 Posicionamento geral do Alvo 2.

24

Figura 5.2.4 Posicionamento geral do Alvo 3.

Foi programado um boto para disparar as leituras realizadas pelo prprio programa, onde foi criada uma varivel de vrias posies para armazenar temporariamente os dados e disponibiliz-los em duas caixas de texto respectivamente relacionadas distncia e a massa, cujo contedo (dados) foi transferido para o programa Excel da Microsoft. No Excel, cada srie de leituras foi extrada uma mdia e um desvio padro, assim gerouse os 12 (doze) grficos, 4 (quatro) para cada alvo sendo um para as distncias, um para o desvio padro das distncias, um para as massas e um para o desvio padro das massas. Todos os grficos so visualizados a seguir. ALVO 1 Distncias Mdias x Distncia Real (cm)
1000,00 800,00 600,00 400,00 200,00 0,00 0 5 10 15 20 25 30 35

Figura 5.2.5 Grfico das distncias mdias aferidas pelo prottipo versus a distncia real para o Alvo 1.

25

250,00 200,00 150,00 100,00 50,00 0,00 0 5

ALVO 1 Desvio Padro das Distancias

10

15

20

25

30

35

Figura 5.2.6 Grfico do desvio padro das distncias versus a distncia real para Alvo 1.

ALVO 1 Massas Mdias x Distncia Real (cm)


200,00 150,00 100,00 50,00 0,00 0 5 10 15 20 25 30 35

Figura 5.2.7 Grfico das massas mdias versus a distncia real para o Alvo 1.

50,00 40,00 30,00 20,00 10,00 0,00 0 5

ALVO 1 Desvio Padro das Massas

10

15

20

25

30

35

Figura 5.2.8 Grfico do desvio padro das massas versus a distncia real para o Alvo 1.

26

Durante os testes com o primeiro alvo, a partir de uma distncia de 30 (trinta) centmetros o algoritmo de busca e expanso coreblob no encontrava o objeto causando falhas nas leituras, por conta disso os grficos apresentados para o Alvo 1 trazem dados at 30 (trinta) centmetros apenas. A seguir os grficos obtidos com as leituras do Alvo 2. Alvo 2 Distncias Mdias x Distncia Real (cm)
2.000,00 1.800,00 1.600,00 1.400,00 1.200,00 1.000,00 800,00 600,00 400,00 200,00 0,00 0 20 40 60 80 100 120

Figura 5.2.9 Grfico das distncias mdias aferidas pelo prottipo versus a distncia real para o Alvo 2.

Alvo 2 Desvio Padro


200,00 180,00 160,00 140,00 120,00 100,00 80,00 60,00 40,00 20,00 0,00 0 20 40 60 80 100 120

Figura 5.2.10 Grfico do desvio padro das distncias versus a distncia real para Alvo 2.

27

Alvo 2 Massas Mdias x Distncia Real (cm)


800,00 700,00 600,00 500,00 400,00 300,00 200,00 100,00 0,00 0 20 40 60 80 100 120

Figura 5.2.11 Grfico das massas mdias versus a distncia real para o Alvo 2.

Alvo 2 Desvio Padro


160,00 140,00 120,00 100,00 80,00 60,00 40,00 20,00 0,00 0 20 40 60 80 100 120

Figura 5.2.12 Grfico do desvio padro das massas versus a distncia real para o Alvo 2.

Durante os testes com o segundo alvo, ficou mais evidente a dificuldade com a iluminao, em alguns momentos foi necessrio ajustar a iluminao para que o objeto continuasse com as mesmas caractersticas de cores RGB. Um segundo detalhe aqui que a partir de 25 (vinte e cinto) centmetros as leituras de distncias foram gradativamente diminuindo, alm de que na distncia de 16 a 19 centmetros as leituras divergiram bruscamente. A seguir os grficos do Alvo 3.

28

Alvo 3 Distncias Mdias x Distncia Real (cm)


2.000,00 1.800,00 1.600,00 1.400,00 1.200,00 1.000,00 800,00 600,00 400,00 200,00 0,00 0 20 40 60 80 100 120

Figura 5.2.13 Grfico das distncias mdias aferidas pelo prottipo versus a distncia real para o Alvo 3.

Alvo 3 Desvio Padro


200,00 180,00 160,00 140,00 120,00 100,00 80,00 60,00 40,00 20,00 0,00 0 20 40 60 80 100 120

Figura 5.2.14 Grfico do desvio padro das distncias versus a distncia real para Alvo 3.

Alvo 3 Massas Mdias x Distncia Real (cm)


1.600,00 1.400,00 1.200,00 1.000,00 800,00 600,00 400,00 200,00 0,00 0 20 40 60 80 100 120

Figura 5.2.15 Grfico das massas mdias versus a distncia real para o Alvo 3.

29

Alvo 3 Desvio Padro


400,00 350,00 300,00 250,00 200,00 150,00 100,00 50,00 0,00 0 20 40 60 80 100 120

Figura 5.2.16 Grfico do desvio padro das massas versus a distncia real para o Alvo 3.

Os resultados com o terceiro alvo trazem grficos parecidos com o segundo alvo, destacando o caso das massas que ficou aparentemente melhor, caracterizando uma curva inversa.

30

CONSIDERAES FINAIS

Ao final observou-se que o prottipo idealizado funcional e demonstrou-se satisfatrio como plataforma de estudo para viso estreo, possibilitando realizao de trabalhos futuros com maior profundidade com o tema de viso computacional com nfase em viso estreo. Os resultados obtidos com os testes mostram que para certas condies o prottipo apresenta um desempenho satisfatrio, como foi o caso do Alvo 1. Para o caso dos outros alvos, os resultados apontam para um ponto de singularidade entre 17 (dezessete) e 19 (dezenove) centmetros de distncia que sugere um problema no mtodo de calculo da distncia por triangulao, o que no tira o mrito do trabalho, pois o objetivo principal aqui foi o desenvolvimento do prottipo e nesse sentido foi bem sucedido porque permite que outros algoritmos de determinao de distncia sejam utilizados. Por outro lado, verificou-se com os resultados que existem alguns problemas de alinhamentos e folgas em decorrncia de escassez de ferramentas adequadas na montagem do prottipo alem dos materiais mais em conta para baratear o projeto, podendo ser facilmente resolvido utilizando-se materiais melhores. Ademais, o projeto foi construdo a um baixo custo econmico com materiais de fcil acesso, tendo assim um grande potencial para se transformar em um Kit de Desenvolvimento de Pesquisas em Viso Computacional. Ante o exposto o presente trabalho demonstrou a diversidade da rea que o curso de Engenharia de Controle de Automao abrange, pois se exercitou conceitos das trs grandes reas: Mecnica, Eltrica e Computao ampliando a formao do futuro Engenheiro.

31

REFERNCIAS BIBLIOGRFICAS

BEZZERA, J. P. A. Um Sistema de Viso para Navegao Robusta de uma Plataforma Robtica Semi-Autnoma. 2007. 69f. Dissertao (Mestrado em Engenharia Eltrica) - Programa de Ps-Graduao em Engenharia Eltrica, UFRN Universidade Federal do Rio Grande do Norte, Natal, 2007. BRUGINSKI, R. Biblioteca em C LibCoreBlob, Sorocaba: UNESP, 2007. CHAN, J. RW Read Write Utility v0.30. Disponvel em <http://rweverything.phpnet.us/index.htm > Acesso em 29 de janeiro de 2008. ENTECH TAIWAN, TCicPort. Disponvel em <http://www.entechtaiwan.com/dev/port/index.shtm> Acesso em 2 fevereiro de 2008. FAZENDO VIDEO Dicas e Informaes Tcnicas, disponvel em <http://www.fazendovideo.com.br/>. Acesso em 30 maio de 2008. GASPAR, J. A. Viso para Robtica Mvel: Deteco de Obstculos sobre Pavimento Plano. 1994. 104f. Dissertao (Mestrado em Engenharia Eltrica e Computao) - Departamento de Engenharia Electrotcnica e de Computadores, Instituto Superior Tcnico, Universidade Tcnica de Lisboa, Lisboa, Portugal, 1994. GONZALEZ, R. WOODS, E. Digital Image Processing. Prentice Hall. Ney Jersey, 2002. Captulo 2. HORN, B. K. Robot Vision. MIT Press. Cambridge, 1986. LINXMOTION Robot Kits, disponvel em < http://www.lynxmotion.com> Acesso em 26 maio de 2008. MOTORTECH Tecnologia em transmisses de imagens, disponvel em <http://www.motortech.com.br/>. Acesso em 25 maio de 2008. NAVIA, J. Lcc-Win32: A compiler sistem for Windows, disponvel em <http://www.cs.virginia.edu/~lcc-win32/> Acesso em 20 de janeiro de 2008. OLIVEIRA, M. A. Correlacionamento Estreo de Complexidade Linear Baseado em Indexao de Regies. 2006. 65f. Dissertao (Mestrado em Cincia da Computao) - Programa de Ps-Graduao em Cincia da Computao, UFSC Universidade Federal de Santa Catarina, Florianpolis, 2006. ROCHA, J. A. Modelo de Trabalho de Concluso de Curso (TCC). Modelo de documento digital do programa OpenOffice 2.0 disponvel em

32

<http://www.meiradarocha.jor.br/uploads/1021/196/modelo_de_projeto_de_TCC-2006-0612a.sxw>. Acesso em: 12 jan. 2008. SIEGWART, R. e NOURBAKHSH, I. Introduction to Autonomous Mobile Robots. MIT Press. Cambridge, 2004. Captulo 4 SILVEIRA, R. W. et al. Robosense: Modelagem Estrutural, Reduo e Abstrao de Dados da Cabea Estreo. UFRN, 2005. SIMES, A. S. Notaes de aula de Robtica Mvel, disponvel em <http://www.sorocaba.unesp.br/professor/assimoes/rm/percepcao.pdf> Acesso em 30 de maio de 2008. TAGLE, E. J. WDM bt848/bt878 video adquisition driver. Disponvel <http://btwincap.sourceforge.net/> Acesso em 25 de janeiro de 2008.

33

APNDICE A PROGRAMA PRINCIPAL

#include <windows.h> #include <vfw.h> #include <math.h> #include <stdio.h> #include <tvicport.h> #define LIMIT 50 //////////////////DEFINES PARA COMUNICAO SERIAL// #define BUFFER 100 #define PARIDADE NOPARITY #define BAUD CBR_115200 ////////VARIVEIS GLOBAIS PARA COMUNICAO SERIAL// HANDLE hCom; DCB dcb; COMMTIMEOUTS CommTimeouts; DWORD BytesEnviados; DWORD BytesRecebidos; //////FUNES DA PORTA SERIAL///ENVIA///// int envia(char *buf,int size){ int send; //nao utilizado WriteFile(hCom,buf,size,&send,NULL); return send; }//end envia ////FUNES DA PORTA SERIAL////FINALIZA///// void finaliza(void) { CloseHandle(hCom); }//end finaliza int gdwFrameNum=0; /////VARIVEIS TVICPORT//
34

BOOL ULONG UCHAR char HFONT

DriverOpened = FALSE; PhysAddr = 0xF3000000; membuffer[256]; buffer[255]; hFontMemdump = 0;

//////////* This is the handle for our window *//// HWND hwnd,hwndEdit,hwndbutton1, hwndbutton2, hwndbutton3, hwndbutton4, hwndbutton5,hwndbutton6,hwndEdit1,hwndEdit2,hwndEdit3; ////////////////FUNES DA PORTA SERIAL// void inicializa(); int envia(char *buf,int size); void finaliza(); ///////Varveis para debugar/// unsigned int ContCoreblob=0; unsigned int ContCoreblob1=0; unsigned int cont=0,flag; FILE *log1; int pulse0=1550; int pulse1=1550; int pulse2=1595; float erro0=0,erro1=0,erro2=0; unsigned int cam=1; ///////FUNO MUDA DE CAMERA void MudaCamera(int cam){ //ESQUERDA cam==0 e DIREITA cam==1 char *PointPhys = NULL; PointPhys=(int *)0xF3000000; DriverOpened = OpenTVicPort(); PointPhys = (char*)MapPhysToLinear(PhysAddr, 256); if(cam==0) PointPhys[4]=0x09; if(cam==1) PointPhys[4]=0x29; UnmapMemory(PhysAddr,256); if (DriverOpened==TRUE) CloseTVicPort(); } //FUNO QUE DETERMINA A DISTNCIA// void distancia(int pl0, int pl1){ float tet0,tet1,db=95,d0,RC,MC; char LocalChar[32]; tet0=M_PI-(((float)pl0-750)*M_PI/1500); tet1=((float)pl1-750)*M_PI/1500; d0=db*sin(tet1)/sin(M_PI-tet0-tet1);
35

RC=sin(tet0)*d0; MC=sqrt((db/2-d0*cos(tet0))*(db/2-d0*cos(tet0))+RC*RC); sprintf(LocalChar,"Distncia = %g ",MC); SetWindowText(hwndEdit3,LocalChar); LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr) { if(flag==1) { if(cam==0) {MudaCamera(1);cam=1;} else {MudaCamera(0);cam=0;} //cam=1;//trava camera setcolor(glob,cam,20,0,20,0,150,65,5); //BGR coreblob(glob,2,lpVHdr->lpData,320,240); char buf[138]; sprintf(buf,"Achado %d | Xcenter: %d | Ycenter: %d | Massa %d",glob[cam].flag,glob[cam].xcenter,glob[cam].ycenter,glob[cam].mass); SetWindowText(hwndEdit,buf); //PI################################################### char buffer1[31]; int temp0, temp1, temp2; pulse2=1595; temp2=120-glob[cam].ycenter; if(glob[cam].flag) {erro2=erro2-(float)temp2*0.08-temp2/2; pulse2=pulse2+erro2;} if(cam==0 & glob[0].flag) { pulse0=1525; temp0=160-glob[0].xcenter; erro0=erro0+(float)temp0*0.08+temp0; pulse0=pulse0+erro0; sprintf(buffer1,"# %d P %d # 2 P %d \r",cam,pulse0,pulse2); } if(cam==1 & glob[1].flag) { pulse1=1525; temp1=160-glob[1].xcenter; erro1=erro1+(float)temp1*0.08+temp1; pulse1=pulse1+erro1; sprintf(buffer1,"# %d P %d # 2 P %d \r",cam,pulse1,pulse2); } distancia(pulse0,pulse1);//DETERMINA DISTNCIA //SATURAO DO SINAL DO SERVO P PROTEGER O SISTEMA MECNICO if(pulse0>1700) pulse0=1700; if(pulse0<1300) pulse0=1300; if(pulse1>1700) pulse1=1700;
36

if(pulse1<1300) pulse1=1300; if(pulse2>1600) pulse2=1600; if(pulse2<1400) pulse2=1400; envia(buffer1,strlen(buffer1)); } //########## Cor do ponto central char txCore[128]; unsigned int R,G,B; ContCoreblob1++; G=lpVHdr->lpData[115681]; R=lpVHdr->lpData[115682]; B=lpVHdr->lpData[115683]; sprintf(txCore,"(R,G,B)=(%d,%d,%d)",R,G,B); SetWindowText(hwndEdit2,txCore); return 0; } /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "Capture Pascal"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ HWND hWndC,hWndC1; //handler of capture window CAPDRIVERCAPS CapDrvCaps; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */
37

wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Viso Estreo - UNESP", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 920, /* The programs width */ 535, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); //create a textbox hwndEdit = CreateWindow("EDIT", // predefined class NULL, // no window title WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 650, 0, 260, 320, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); // pointer not needed hwndEdit1 = CreateWindow("EDIT", // predefined class NULL, // no window title WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 500, 0, 140, 40, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); hwndEdit2 = CreateWindow("EDIT", // predefined class NULL, // no window title WS_CHILD | WS_VISIBLE | WS_VSCROLL |
38

ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 500, 50, 140, 40, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL);

hwndEdit3 = CreateWindow("EDIT", // predefined class NULL, // no window title WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 500, 100, 140, 40, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); //create a button hwndbutton1 = CreateWindow("BUTTON", // predefined class "V1", // no window title WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 650, 330, 40, 20, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); // pointer not needed hwndbutton2 = CreateWindow("BUTTON", // predefined class "V2", // no window title WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 700, 330, 40, 20, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); hwndbutton3 = CreateWindow("BUTTON", // predefined class "DEBUGGER", // no window title WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 750, 330, 85, 20, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); hwndbutton4 = CreateWindow("BUTTON", // predefined class "SERIAL", // no window title WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
39

650, 360, 50, 20, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); hwndbutton5 = CreateWindow("BUTTON", // predefined class "CORE", // no window title WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 650, 390, 60, 20, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); hwndbutton6 = CreateWindow("BUTTON", // predefined class "FR", // no window title WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 770, 360, 20, 20, // set size in WM_SIZE message hwnd, // parent window (HMENU) NULL, // edit control ID hThisInstance, NULL); //create a CAPTURE WINDOW hWndC = capCreateCaptureWindow ( (LPSTR) "My Capture Window", // window name if pop-up WS_CHILD | WS_VISIBLE, // window style 0, 0, 640, 480, // window position and dimensions (HWND) hwnd, (int) 1 /* child ID */); //CONECT CAPTURE WINDOW TO THE HARDWARE capDriverConnect(hWndC, 0); //0 i think is first device capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS)); // Video display dialog box. capDlgVideoDisplay(hWndC); // Video source dialog box. capDlgVideoSource(hWndC); // Video format dialog box. capDlgVideoFormat(hWndC); //set preview rate and display capPreviewRate(hWndC, 15); //normal 33 capPreview(hWndC,TRUE); // capOverlay(hWndC,TRUE);
40

//Get a frame //capGrabFrame(hWndC); //set callback with buffer of the frame capSetCallbackOnFrame(hWndC,FrameCallbackProc); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); //capGrabFrame(hWndC); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; case WM_COMMAND: ///////////////////////////////////MUDA P CAMERA DIREITA//////////////////////////////////////// if((HWND)lParam==hwndbutton1) { MudaCamera(1); SetWindowText(hwndEdit," DIREITA "); }//END IF ///////////////////////////////////MUDA P CAMERA ESQUERDA///////////////////////////////////// if((HWND)lParam==hwndbutton2) { MudaCamera(0); SetWindowText(hwndEdit," ESQUERDA "); }//END IF /***DEBUGA************************************************/ if((HWND)lParam==hwndbutton3) {
41

}//END IF /****BOTO INICIALIZA SERIAL*********************************/ if((HWND)lParam==hwndbutton4) { inicializa(); char tx[64]; sprintf(tx," COMUNICA "); SetWindowText(hwndEdit,tx); }//END IF /*******CORE*********************************************/ if((HWND)lParam==hwndbutton5) if (flag!=1)flag=1; else flag=0; /********BOTO olha pra frente******************************/ if((HWND)lParam==hwndbutton6) { char buffer1[64]; sprintf(buffer1,"# 0 P 1550 T 10000 # 1 P 1550 T 10000 # 2 P 1550 T 10000 \r"); envia(buffer1,strlen(buffer1)); finaliza(); SetWindowText(hwndEdit,buffer1); }//END IF /********************************************************/ default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } //////FUNES DA PORTA SERIAL////INICIALIZA//////////////////////////////// void inicializa() { char sucesso; char *NomePorta="COM1"; //-----------------------------------------------------------------------------//Acessando a porta serial //-----------------------------------------------------------------------------hCom = CreateFile(NomePorta, GENERIC_READ|GENERIC_WRITE,0, NULL,OPEN_EXISTING,0,NULL); if(hCom == INVALID_HANDLE_VALUE) { printf("\nImpossibilidade de acesso a porta serial COM1!\n"); printf("\nVerificar se o dispositivo jah nao estah em uso!!\n");/
42

} //-----------------------------------------------------------------------------//Definindo configuraoes da porta serial //-----------------------------------------------------------------------------if(!GetCommState(hCom, &dcb)) printf("\nProblemas na verificacao da configuracao atual da porta serial!\n"); else { dcb.BaudRate = BAUD; dcb.ByteSize = 8; dcb.Parity = PARIDADE; dcb.StopBits = ONESTOPBIT; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fRtsControl = RTS_CONTROL_DISABLE; } sucesso=SetCommState(hCom, &dcb); if(sucesso==0) printf("\nProblemas na confirmacao da configuracao da porta serial COM1!\n"); //-----------------------------------------------------------------------------//Configurando tempos de parada //-----------------------------------------------------------------------------sucesso=GetCommTimeouts(hCom, &CommTimeouts); if(sucesso==0) printf("\nProblemas na verificacao dos temporizadores da porta serial COM1!\n"); else { CommTimeouts.ReadIntervalTimeout = 2; CommTimeouts.ReadTotalTimeoutMultiplier = 10; CommTimeouts.ReadTotalTimeoutConstant = 5; CommTimeouts.WriteTotalTimeoutMultiplier = 5; CommTimeouts.WriteTotalTimeoutConstant = 5; } sucesso=SetCommTimeouts(hCom, &CommTimeouts); if(sucesso==0) printf("\nProblemas na confirmacao da configuracao dos temporizadores da porta serial COM1\n"); //-----------------------------------------------------------------------------//Configurando pinos DTR e RTS
43

//-----------------------------------------------------------------------------if(!EscapeCommFunction(hCom,CLRDTR)) printf("\nProblemas com o pino DTR!\n"); if(!EscapeCommFunction(hCom,CLRRTS)) printf("\nProblemas com o pino RTS!\n"); }

44

APNDICE B Desenho do Prottipo

45

ANEXO A LIBCOREBLOB

struct color { unsigned char Rmax,Rmin,Gmax,Gmin,Bmax,Bmin; //RGB/YUV color to search unsigned int mass,minmass; //number of pixels , minmass to search unsigned char flag; //finded=1 or not finded=0 unsigned int xmin,xmax,ymin,ymax; //box of color unsigned int xcenter,ycenter; //center of color area (xcenter=xsum/mass) unsigned int xsum,ysum; //used to calc the center mass }glob[3];//this struct define as cores a serem procuradas, e as informaes a serem resolvidas. unsigned char nextpixel(unsigned int *nx,unsigned int *ny,unsigned char *img,struct color *S,unsigned int c,unsigned char dir,unsigned char cont,unsigned int imgxsize,unsigned int imgysize) { unsigned int x,y; x=nx[0]; y=ny[0]; //printf("DEBUG: nextpixel x=%u y=%u count=%u\n",x,y,cont); if(cont>3) return 5; cont++; if(y>=(imgysize-1) && dir==2) dir=3; if(x==0 && dir==3) dir=0; if(y==0 && dir==0) dir=1; if(x>=(imgxsize-1) && dir==1) dir=2; if(y>=(imgysize-1) && dir==2) dir=3; switch(dir) { case 0: //printf("DEBUG: nextpixel case 0\n"); y--; if((S[c].Rmin<=img[x*3+y*imgxsize*3]) && (S[c].Rmax>=img[x*3+y*imgxsize*3])) if((S[c].Gmin<=img[1+x*3+y*imgxsize*3]) &&
46

(S[c].Gmax>=img[1+x*3+y*imgxsize*3])) if((S[c].Bmin<=img[2+x*3+y*imgxsize*3]) && (S[c].Bmax>=img[2+x*3+y*imgxsize*3])){ ny[0]=y; return 3; }//end of if comp return nextpixel(nx,ny,img,S,c,1,cont,imgxsize,imgysize); break; case 1: //printf("DEBUG: nextpixel case 1\n"); x++; if((S[c].Rmin<=img[x*3+y*imgxsize*3]) && (S[c].Rmax>=img[x*3+y*imgxsize*3])) if((S[c].Gmin<=img[1+x*3+y*imgxsize*3]) && (S[c].Gmax>=img[1+x*3+y*imgxsize*3])) if((S[c].Bmin<=img[2+x*3+y*imgxsize*3]) && (S[c].Bmax>=img[2+x*3+y*imgxsize*3])){ nx[0]=x; return 0; }//end of if comp return nextpixel(nx,ny,img,S,c,2,cont,imgxsize,imgysize); break; case 2: //printf("DEBUG: nextpixel case 2\n"); y++; if((S[c].Rmin<=img[x*3+y*imgxsize*3]) && (S[c].Rmax>=img[x*3+y*imgxsize*3])) if((S[c].Gmin<=img[1+x*3+y*imgxsize*3]) && (S[c].Gmax>=img[1+x*3+y*imgxsize*3])) if((S[c].Bmin<=img[2+x*3+y*imgxsize*3]) && (S[c].Bmax>=img[2+x*3+y*imgxsize*3])){ ny[0]=y; return 1; }//end of if comp return nextpixel(nx,ny,img,S,c,3,cont,imgxsize,imgysize); break; case 3: //printf("DEBUG: nextpixel case 3\n"); x--; if((S[c].Rmin<=img[x*3+y*imgxsize*3]) && (S[c].Rmax>=img[x*3+y*imgxsize*3])) if((S[c].Gmin<=img[1+x*3+y*imgxsize*3]) && (S[c].Gmax>=img[1+x*3+y*imgxsize*3])) if((S[c].Bmin<=img[2+x*3+y*imgxsize*3]) && (S[c].Bmax>=img[2+x*3+y*imgxsize*3])){ nx[0]=x; return 2; }//end of if comp return nextpixel(nx,ny,img,S,c,0,cont,imgxsize,imgysize);
47

break; default: return 5; }//end switch }//end of nextpixel. void expandarea(struct color *S,unsigned int c,unsigned char *img,unsigned int imgxsize,unsigned int imgysize) { /*1-expande a direita e anota o ultimo X (anotar novos valores de xmin e xmax) 2-pula linha, e verifica o xminInter se for valido corre para a esquerda se nao corre para a direita e anota novo xminInter verifica o xmaxInter se for valido corre para direita se nao esquerda e anota novo xmaxInter 3-verifica os limites do xmin e xmax e retorna ao passo 2 ## Este metodo s detecta a borda do color blob nao analizando o interior para acelerar o processo. */ int x,y,x0,y0; unsigned char dir=0; //printf("DEBUG: Init expandarea\n"); S[c].mass=0; S[c].xsum=x0=x=S[c].xmax=S[c].xmin; S[c].ysum=y0=y=S[c].ymax=S[c].ymin; //printf("DEBUG: DIR expandarea x=%u y=%u\n",x,y); dir=nextpixel(&x,&y,img,S,c,0,0,imgxsize,imgysize); //printf("DEBUG: DIR expandarea %u x=%u y=%u\n",dir,x,y); if(dir==5) return; S[c].mass++; while(x0!=x || y0!=y) { if(x>S[c].xmax) S[c].xmax=x; //For BOX if(x<S[c].xmin) S[c].xmin=x; if(y>S[c].ymax) S[c].ymax=y; if(y<S[c].ymin) S[c].ymin=y; S[c].xsum+=x; //For center of mass S[c].ysum+=y; dir=nextpixel(&x,&y,img,S,c,dir,0,imgxsize,imgysize); if(dir==5) {/*printf("ERROR\n");*/return;} S[c].mass++; }//end while //printf("DEBUG: expandarea MASS %d\n",S[c].mass); if(S[c].mass>S[c].minmass) S[c].flag=1; else return; S[c].xcenter=S[c].xsum/S[c].mass;
48

S[c].ycenter=S[c].ysum/S[c].mass; //printf("DEBUG: END expandarea\n"); }//end function expandarea void coreblob(struct color *S,unsigned int ncolor,unsigned char *img,unsigned int imgxsize,unsigned int imgysize) { //esta funo procura as cores da estrutura /* Metodo do algoritimo de procura de blob color -comea a scanear a imagem linha a linha fazendo os seguintes passos. 1-verifica se a posio x atual nao pertence a nenhum color blob jah achado -se sim pula para o xmax da area jah achada e repete operao 2-compara o valor da regiao com as variaveis de busca de todos os blobs a ser achados -se achar um valido expande a area, terminado repete o 1 -se nao incrementa o x e repete 1 Analise do metodo: como as cores jah achadas excluem as suas areas da busca o numero de cores procuradas nao deve influenciar na velocidade do algoritimo, inclusive como a area registrada quadrada normalmente vai ter uma acelerao quando se achar areas, sobretudo areas grandes. O problema do metodo que uma regiao concava pode esconder um blob interno ao seu BOX de contorno obscurecendo a regiao. */ unsigned int x,y,c; //printf("DEBUG: Init coreblob search for %d %d %d %d %d %d\n", S[0].Rmin,S[0].Rmax,S[0].Bmin,S[0].Bmax,S[0].Gmin,S[0].Gmax); for(y=0;y<imgysize;y++) for(x=0;x<imgxsize;x++) { for(c=0;c<ncolor;c++) if(S[c].flag==1) if((S[c].xmin<=x) && (S[c].xmax>=x) && (S[c].ymin<=y) && (S[c].ymax>=y)) {x=S[c].xmax+1;if(x>=imgxsize) break;} //Passo 1 (##OPTIMIZE EXPADIR IFS) for(c=0;c<ncolor;c++) if(S[c].flag==0) if((S[c].Rmin<=img[x*3+y*imgxsize*3]) && (S[c].Rmax>=img[x*3+y*imgxsize*3])) if((S[c].Gmin<=img[1+x*3+y*imgxsize*3]) && (S[c].Gmax>=img[1+x*3+y*imgxsize*3])) if((S[c].Bmin<=img[2+x*3+y*imgxsize*3]) && (S[c].Bmax>=img[2+x*3+y*imgxsize*3])){ S[c].xmin=x;S[c].ymin=y; //printf("\ncolor Finded color=%d x=%d
49

y=%d\n",c,x,y); expandarea(S,c,img,imgxsize,imgysize); //expand a area and get data to struct break; }//end if bmin }//end forX //printf("DEBUG: End coreblob\n"); }//end of coreblob void setcolor(struct color *S,unsigned int c,unsigned char Rmax,unsigned char Rmin,unsigned char Gmax,unsigned char Gmin,unsigned char Bmax,unsigned char Bmin,unsigned int minmass) { S[c].minmass=minmass; S[c].Rmax=Rmax; S[c].Rmin=Rmin; S[c].Gmax=Gmax; S[c].Gmin=Gmin; S[c].Bmax=Bmax; S[c].Bmin=Bmin; S[c].mass=0; S[c].flag=0; S[c].xmin=S[c].xmax=S[c].ymin=S[c].ymax=50000; //fora da figura S[c].xcenter=S[c].ycenter=130; //fora da figura S[c].xsum=S[c].ysum=0; } //end setcolor

50