• Sonuç bulunamadı

Rekabet etmeme borcu

A- Kiraya verenin borçları

4. Rekabet etmeme borcu

Para o desenvolvimento de t´ecnicas de controle de gestos (vis˜ao computacional) usou-se a biblioteca OpenCV 2.4.10 para facilitar a integra¸c˜ao entre C++ (visual Studio C++) e a API 1.1 do Robotino.

O desenvolvimento do software e seus respectivos testes foram feitos em uma sala cujas dimens˜oes eram de 3,90 m x 2,85 m, com uma fonte de ilumina¸c˜ao artificial cujos dados podem ser visualizados na tabela (1).

Tabela 1 - Informa¸c˜oes sobre a fonte de ilumina¸c˜ao artificial

Lˆampada Fluorecente - OSRAM

Potˆencia Nominal 23,0 W Tens˜ao Nominal 220 V .. 240 V Corrente Nominal 0,23 A Fluxo Luminoso 1280 lm Temperatura da Cor 6500 K Tonalidade da Luz 865

Tonalidade de Acordo com EM 12464-1 Daylight ´Indice de Reprodu¸c˜ao de Cor Ra 80

Fonte: (OSRAM,2015)

O software tamb´em pode testar as rea¸c˜oes do robˆo utilizando-se para isso o simulador virtual do Robotino, figura (23), que pode ser baixado direto do site da Festo (Robotino SIM) para verificar se o robˆo responderia adequadamente aos comandos, sem que o mesmo esteja presente fisicamente. Isto ´e muito importante, pois, nem sempre ´e poss´ıvel ter o robˆo a disposi¸c˜ao durante todo o tempo de testes. O IP utilizado para os testes foi o endere¸co local 127.0.0.1:8080.

Figura 23 - Exemplo de utiliza¸c˜ao do Robotino SIM

tantes para que o robˆo respondesse de forma adequada aos gestos apresentados.

Inicialmente ´e passado para o programa o endere¸co IP default (172.26.201.1) pas- sado pelo roteador do Robotino. Caso o usu´ario queira passar outro endere¸co IP para o programa basta apenas inserir o mesmo na linha de execu¸c˜ao, por exemplo, nome pro- grama.exe [IP] <enter>.

Ap´os a passagem do endere¸co o programa checa se a cˆamera foi devidamente inici- alizada, caso negativo, apresenta uma mensagem de erro e sai do programa. Se a cˆamera tiver sido devidamente inicializada o programa executa uma rotina para inicializar o robˆo, usando-se para isso a API 1.1 do Robotino. Ap´os a checagem da inicializa¸c˜ao do robˆo o programa apresenta uma tela contendo uma legenda onde constam todos comandos com- preendidos pelo robˆo para servir de orienta¸c˜ao ao usu´ario, como pode ser visto na figura (24).

Figura 24 - Janela ativa contendo a legenda de comandos

Continuando-se com a execu¸c˜ao do software, se utiliza o procedimento de autoria do desenvolvedor skinExtract()), que aplica na imagem recebida os filtros Mediana e Gaussi- ano, converte-se o espa¸co de cor RGB em YCbCr e gera-se uma imagem bin´aria.

Finalizando-se o procedimento, aplica-se os filtros Dilata¸c˜ao e Eros˜ao para a redu- ¸c˜ao de falsos positivos (uma vez que a imagem j´a recebeu dois filtros anteriormente) e suaviza¸c˜ao final da imagem, figura (22)b.

Prosseguindo-se com a execu¸c˜ao normal do programa, ´e chamada a fun¸c˜ao findCon- tours() do OpenCV para se conseguir extrair o contorno da imagem bin´aria, figura (25) que j´a foi suavizada pelo procedimento descrito anteriormente. Cada contorno detectado ´e armazenado em um vetor de pontos.

Figura 25 - Contorno de uma imagem

Ap´os a passagem da fun¸c˜ao de contorno, verifica-se se o tamanho do contorno ´e diferente de zero, caso verdadeiro o programa segue normalmente, caso falso o programa volta ao in´ıcio e procura por uma nova imagem.

Uma vez que ´e constatado que o tamanho do contorno ´e diferente de zero, se utiliza um la¸co for() para varrer o vetor de pontos que cont´em o contorno armazenado para se calcular a ´area total do contorno atrav´es da fun¸c˜ao do OpenCV contourArea(). Isso ´e importante pois atrav´es de testes experimentais (em tempo de execu¸c˜ao) viu-se que com uma ´area total de imagem de no m´ınimo 5000 pixels se consegue reduzir falsos positivos e a carga computacional, visto que, todas as ´areas menores que 5000 pixels s˜ao desprezadas pelo software. Outro ponto percebido foi que, mesmo com uma imagem maior que 5000 pixels se a mesma ficar muito longe da cˆamera (al´em de 60 cm de distˆancia) as imagens ficavam distorcidas, figura (21).

Ap´os a constata¸c˜ao que a ´area do contorno ´e maior que 5000 pixels se utiliza o pro- cedimento on trackbar() (de autoria do desenvolvedor) para desenhar na tela o contorno encontrado e prosseguir-se com a execu¸c˜ao normal do programa.

Com o prosseguimento do programa, utiliza-se a fun¸c˜ao C COG() (de autoria do desenvolvedor) que ´e respons´avel pela obten¸c˜ao do centro geom´etrico da figura cujo o contorno foi previamente identificado. A fun¸c˜ao em quest˜ao utiliza a fun¸c˜ao do OpenCVmoments() que calcula todos os momentos at´e a terceira ordem de um pol´ıgono ou forma rasterizada. Ap´os o c´alculo, a fun¸c˜aoC COG() desenha um ponto vermelho na imagem e retorna a coordenada do centro geom´etrico (x, y), figura (26)).

Figura 26 - Ponto vermelho central: COG com sua respectiva coordenada (x, y).

A seguir, tem-se o chamamento da fun¸c˜ao Dist Focagem() (de autoria do desenvol- vedor) que usa as informa¸c˜oes vindas da fun¸c˜ao de contorno findContours() e da fun¸c˜ao C COG() juntamente com as fun¸c˜oes do OpenCV convexHull() e convexityDefects() para o reconhecimento das pontas dos dedos na imagem.

A fun¸c˜ao em quest˜ao, utiliza um la¸co for() para vasculhar inteiramente o vetor de dados retornado pela fun¸c˜ao de contorno e aplica em cada itera¸c˜ao as fun¸c˜oes do convexHull() e convexityDefects() para guardar as informa¸c˜oes referentes ao contorno e desenhar na tela as informa¸c˜oes advindas da fun¸c˜ao convex hull. Uma vez que as informa- ¸c˜oes foram armazenadas nos respectivos vetores pontos do convex hull e convexity defect ´e utilizado mais um la¸co for() para encontrar a m´edia de pontos de cada massa de dados do convexity defect (para cada itera¸c˜ao o vetor do convexity defect armazena o ponto inicial o ponto final e o ponto mais distante do convex hull dentro do convexity defect) para a partir da´ı, selecionar um ´unico ponto por itera¸c˜ao.

Novamente ´e utilizado mais um la¸co for() que abrange o c´alculo da distˆancia entre os pontos encontrados e o centro do contorno e verifica-se atrav´es de um la¸co condicional if() se os pontos encontrados est˜ao situados na parte superior, laterais e abaixo do centro geom´etrico do contorno.

Uma vez que essas informa¸c˜oes s˜ao conhecidas, pode-se determinar se os pontos podem ser considerados como ponta dos dedos ou n˜ao. Caso se determine que o ponto encontrado ´e v´alido (ponta do dedo), se tra¸ca um circulo representativo e uma linha unindo o centro geom´etrico da imagem ao ponto rec´em descoberto.

Ap´os a identifica¸c˜ao positiva da existˆencia da ponta dos dedos na imagem, figuras (27) e (28), se executa a estrutura seletiva switch() para se verificar quantas pontas de dedos foram encontradas e chama-se o procedimento drive() (de autoria do autor) para estabelecer o movimento que o robˆo deve seguir.

Figura 27 - Visualiza¸c˜ao dos pontos interpretados: 0, 1 e 2

Figura 28 - Visualiza¸c˜ao dos pontos interpretados: 3, 4 e 5

O programa fica em execu¸c˜ao at´e que o usu´ario pressione a tecla <ESC >, quando finalmente o programa ´e encerrado.