Reconhecimento de Objetos em Tempo Real Utilizando
Transcrição
Reconhecimento de Objetos em Tempo Real Utilizando
DEPARTAMENTO ACADÊMICO DE SISTEMAS, PROCESSOS E CONTROLES ELETRO-ELETRÔNICO COORDENAÇÃO DE SISTEMAS DE INFORMAÇÃO Reconhecimento de Objetos em Tempo Real Utilizando Visão Computacional para o Futebol de Robôs Felype Nery de O. Vasconcelos Raphael Passos Gibson Recife Agosto - 2014 Felype Nery de O. Vasconcelos Raphael Passos Gibson Reconhecimento de Objetos em Tempo Real Utilizando Visão Computacional para o Futebol de Robôs Trabalho de Conclusão de Curso apresentado ao curso de Tecnologia em Análise e Desenvolvimento de Sistemas, como prérequisito para obtenção do título de Tecnólogo em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de Educação, Ciência e Tecnologia de Pernambuco - IFPE. Orientador: Prof. Msc. Paulo Abadie Guedes Recife Agosto – 2014 ii iii AGRADECIMENTOS Agradecemos primeiramente a Deus e às nossas famílias por todo apoio e confiança, sem eles nada seria possível. Ao professor Paulo Abadie por toda a dedicação e paciência conosco durante a graduação e orientação neste trabalho, ao professor Anderson Moreira por sempre se mostrar disponível para ajudar e contribuir com o projeto e aos outros professores e funcionários do curso que de alguma forma contribuíram com o nosso amadurecimento profissional, pessoal e acadêmico. Agradecemos também às amizades que fizemos durante o curso que sempre nos incentivaram e tornaram nossa graduação mais divertida, não temos dúvidas que todos serão excelentes profissionais. iv LISTA DE ACRÔNIMOS BPP Bit Per Pixel F180 Categoria Small Size Robot Soccer FIRA Federation International of Robot soccer Association EAPH Exoesqueletos para Aumento de Performance Humana GPU Graphics Processing Unit GUI Graphical User Interface HSI Hue, Saturation and Intensity HSV Hue, Saturation and Value IDE Ambiente Integrado de Desenvolvimento IEEE Institute of Electrical and Electronics Engineers IFPE Instituto Federal de Educação, Ciência e Tecnologia de Pernambuco NASA National Aeronautics and Space Administration OpenCV Open Source Computer Vision Library PERCRO Perceptual Robotics Laboratory RAM Random Access Memory RGB Red, Green , Blue RoboCup Robot World Cup Initiative ROI Region of Interest SSL Small Size League SVC Sistema de Visão Computacional VM Virtual Machine VRAM Video RAM v LISTA DE EQUAÇÕES Equação 1 - Convolução Contínua ........................................................................................... 19 Equação 2 - Convolução Discreta ............................................................................................ 19 Equação 3- Transformação de RGB para HSI.......................................................................... 21 Equação 4 - Transformação de HSI para RGB......................................................................... 21 Equação 5 - Erosão de A por B ................................................................................................ 22 Equação 6 - Dilatação de A por B ............................................................................................ 22 Equação 7 - Condição de Limiarização .................................................................................... 23 Equação 8 - Momentos de ordem p+q ...................................................................................... 26 Equação 9 - Momentos aplicados a imagens ............................................................................ 26 Equação 10 - Momentos centrais.............................................................................................. 26 Equação 11 - Variância em X e Y ............................................................................................ 27 Equação 12 - Direção do Objeto............................................................................................... 27 vi LISTA DE FIGURAS Figura 1 - Imagem do PERCRO BE.......................................................................................... 5 Figura 2 - Projeto Andar Denovo ............................................................................................... 6 Figura 3 - Humanoid League ...................................................................................................... 8 Figura 4 - Middle Size League ................................................................................................... 8 Figura 5 - Simulation League 2D e 3D, respectivamente........................................................... 9 Figura 6 - Robôs Aibo e Nao, respectivamente ......................................................................... 9 Figura 7 - Robôs da categoria F180.......................................................................................... 10 Figura 8 - Sistema do Futebol de Robôs .................................................................................. 11 Figura 9 - Representação de um sistema de visão computacional genérico ............................. 13 Figura 10 - Adaptador gráfico simples ..................................................................................... 15 Figura 11 - 256 Níveis de intensidade ...................................................................................... 15 Figura 12 - Monitor colorido .................................................................................................... 16 Figura 13 – Versão 8 bits, 16 bits e 64 bits do personagens Mario .......................................... 17 Figura 14 - Conceito de 4-vizinhança, vizinhança diagonal e 8-vizinhança ............................ 18 Figura 15 - Representação do cubo RGB ................................................................................ 20 Figura 16 - Repreentação do cone HSI..................................................................................... 20 Figura 17 - Exemplo de Binarização ........................................................................................ 24 Figura 18 - Tela do SSL-Vision ............................................................................................... 28 Figura 19 - Tela do Projeto Find-Object ................................................................................. 30 Figura 20 - Exemplo de detecção de faces com OpenCV ........................................................ 31 Figura 21 - Câmera na posição vertical .................................................................................... 34 Figura 22 - Campo Colocado na Parede .................................................................................. 34 Figura 23 - Passos para a calibração da câmera ...................................................................... 35 Figura 24 - Definição da Região de Interesse........................................................................... 35 Figura 25 - Calibração das cores dos marcadores .................................................................... 36 Figura 26 - Fluxograma do processamento .............................................................................. 37 Figura 27 - Identificação dos objetos no campo ....................................................................... 38 Figura 28 - Significado dos marcadores nos robôs................................................................... 39 Figura 29 - Reconhecimento dos robôs e da bola ..................................................................... 40 Figura 30 - Gráfico do tempo em segundos Vs Quantidade de robôs ...................................... 42 Figura 31 - Criando um exemplo no Qt Studio ........................................................................ 53 Figura 32 - Qt Studio configurado com o OpenCV.................................................................. 54 vii Figura 33 - Vista em corte do olho humano ............................................................................. 75 Figura 34 - Como a imagem chega ao cérebro ......................................................................... 75 Figura 35 - Abertura e fechamento da córnea .......................................................................... 76 viii RESUMO O futebol de robôs se apresenta à comunidade científica com o intuito de ser um problema padrão para a pesquisa nas áreas de inteligência artificial, robótica e visão computacional. O problema consiste em realizar uma partida de futebol utilizando robôs autônomos como jogadores. Este tipo cenário envolve diversos problemas relacionados a muitas áreas do conhecimento, fazendo com que os participantes apliquem soluções com uma equipe multidisciplinar. Este trabalho descreve o projeto e a implementação de um módulo de visão computacional para futebol de robôs que utiliza uma abordagem por espaço de cores HSV e descritores, de forma que utilizam o método estatístico dos momentos. O módulo desenvolvido foi capaz de oferecer informações sobre a posição e identificação dos jogadores e da bola através da aquisição e processamento de imagens em tempo real, permitindo que ações possam ser tomadas automaticamente pela equipe. Palavras-chave: Visão Computacional, Futebol de Robôs, OpenCV, Descritores, HSV ix ABSTRACT The robot soccer presents itself to the scientific community in order to be a standard problem for research in the areas of artificial intelligence, robotics and computer vision. The problem consists in bringing a soccer match using autonomous robots as players where this scenario involves several kinds of issues relating to many areas of knowledge, causing the participants to apply technical solutions with a multidisciplinary team. This work describes the project and the implementation of a computer vision module for robot soccer that uses an approach by the HSV color space and shape descriptors using the statistical method of moments. The module developed was able to providing information about the location and identification of the players also the ball through the acquisition and processing of images in real time, allowing actions to be taken automatically by the team. Keywords: Computer Vision, Robot Soccer, OpenCV, Descriptors, HSV x SUMÁRIO 1. 2. INTRODUÇÃO ............................................................................................................................................ 1 1.1. MOTIVAÇÃO ........................................................................................................................................... 1 1.2. OBJETIVO GERAL.................................................................................................................................... 2 1.3. OBJETIVOS ESPECÍFICOS ......................................................................................................................... 2 FUNDAMENTAÇÃO TEÓRICA ............................................................................................................... 4 2.1. ROBÓTICA............................................................................................................................................... 4 2.2. FUTEBOL DE ROBÔS ................................................................................................................................ 6 2.2.1. Modalidades .................................................................................................................... 7 2.2.2. Small Size League ......................................................................................................... 10 2.3. MÓDULO DE VISÃO DO FUTEBOL DE ROBÔS ......................................................................................... 11 2.4. VISÃO COMPUTACIONAL ...................................................................................................................... 12 2.5. PROCESSAMENTO DE IMAGENS ............................................................................................................. 14 2.5.1. Imagem Digital .............................................................................................................. 14 2.5.2. Vizinhanças de um Pixel ............................................................................................... 17 2.5.3. Conectividade ................................................................................................................ 18 2.5.4. Convolução com Máscaras............................................................................................ 18 2.5.5. Modelos de Cor ............................................................................................................. 19 2.5.6. Operações Morfológicas ............................................................................................... 21 2.5.7. Limiarização .................................................................................................................. 23 2.5.8. Região de Interesse........................................................................................................ 24 2.5.9. Segmentação.................................................................................................................. 24 2.5.10. Descritores de Forma .................................................................................................... 25 2.5.11. Momentos ...................................................................................................................... 25 2.6. 3. FERRAMENTAS...................................................................................................................................... 27 2.6.1. SSL-Vision .................................................................................................................... 27 2.6.2. Find-Object.................................................................................................................... 29 2.6.3. OpenCV......................................................................................................................... 30 2.6.4. IDEs............................................................................................................................... 32 METODOLOGIA ....................................................................................................................................... 33 3.1. CAPTURA DA IMAGEM .......................................................................................................................... 33 xi 3.2. CALIBRAÇÃO ........................................................................................................................................ 35 3.3. PROCESSAMENTO ................................................................................................................................. 37 3.4. EXIBIÇÃO DAS INFORMAÇÕES ............................................................................................................... 39 4. RESULTADOS ........................................................................................................................................... 41 5. CONCLUSÕES E TRABALHOS FUTUROS ......................................................................................... 43 6. BIBLIOGRAFIA ........................................................................................................................................ 44 7. APÊNDICES ............................................................................................................................................... 50 7.1. APÊNDICE 1 - INSTALAÇÃO DO OPENCV .............................................................................................. 50 7.2. APÊNDICE 2 - CONFIGURAR O ECLIPSE, NETBEANS E QT STUDIO ......................................................... 51 7.2.1. Eclipse ........................................................................................................................... 51 7.2.2. NetBeans ....................................................................................................................... 51 7.2.3. Qt Studio ....................................................................................................................... 52 7.3. 7.3.1. tcc.pro ............................................................................................................................ 55 7.3.2. main.cpp ........................................................................................................................ 55 7.3.3. mainwindow.ui .............................................................................................................. 60 7.3.4. mainwindow.h ............................................................................................................... 61 7.3.5. mainwindow.cpp ........................................................................................................... 61 7.3.6. Objeto.h ......................................................................................................................... 61 7.3.7. Objeto.cpp ..................................................................................................................... 62 7.3.8. Bola.h ............................................................................................................................ 64 7.3.9. Bola.cpp......................................................................................................................... 64 7.3.10. Marcador.h .................................................................................................................... 64 7.3.11. Marcador.cpp................................................................................................................. 65 7.3.12. Robo.h ........................................................................................................................... 66 7.3.13. Robo.cpp ....................................................................................................................... 67 7.4. 8. APÊNDICE 3 – CÓDIGO-FONTE DO TRABALHO ...................................................................................... 55 APÊNDICE 4 – BUG: UVCVIDEO ............................................................................................................ 72 ANEXOS...................................................................................................................................................... 74 8.1. SISTEMA DE VISÃO HUMANA ............................................................................................................... 74 xii “No! Try not! Do... or do not. There is no try” Master Yoda, Star Wars V 1. Introdução Este capítulo tem como objetivo introduzir o tema da pesquisa. Para isto, será explanado de forma simples o que incitou a pesquisa e por qual razão desenvolvê-la, bem como os objetivos gerais e específicos deste trabalho. 1.1. Motivação Encontramos diversas pesquisas no meio acadêmico sobre a utilização de sistemas de visão por máquina. Sua aplicabilidade é imensa, desde a robótica na exploração espacial até a medicina com a detecção de tumores. Dessa forma podemos afirmar que não existe uma implementação padrão para a resolução destas aplicações, o desenvolvimento vai depender dos objetivos de cada problema. Muitas vezes é necessário utilizar técnicas de inteligência artificial para poder avaliar o resultado encontrado de forma autônoma ou mesmo melhorar os parâmetros de entrada do sistema, tornando mais complexo de ser desenvolvido, porém mais robusto. A utilização destes algoritmos não estão limitados ao meio acadêmico e científico. Encontramos soluções com a utilização das técnicas na indústria e no comércio, como por exemplo, na automação industrial e no controle de qualidade (RUDEK; COELHO; CANCIGLIERI, 2001). Já o futebol de robôs é um desafio que é fortemente utilizado para estudos em diversas áreas como na eletrônica, mecânica e computação. Essa complexidade vem atraindo os olhares da comunidade acadêmica já que em um único campo de pesquisa podemos unir o fascínio do esporte com os desafios da robótica. Como é um ambiente dinâmico e de tempo real1, o futebol de robôs torna-se um ótimo campo de estudo de caso para as técnicas de análise e processamento de imagens com objetivo de 1 Um sistema em tempo real é aquele que tem um tempo de resposta limite a um evento é pré-definido. Esse tempo de resposta é chamado de prazo da tarefa e a perda de um prazo, isto é, o não cumprimento de uma tarefa dentro do prazo esperado, caracteriza uma falha do sistema, que no nosso caso seria a não identificação do robô em um tempo limite de alguns milisegundos. Introdução reconhecer a posição e o movimento de cada objeto com a necessidade que ocorra um retorno rápido e preciso para o sucesso na partida de futebol. Uma das etapas mais importantes para o desenvolvimento de uma equipe de futebol de robôs é a implementação de seu sistema de visão. Basicamente, o sistema de visão computacional será responsável por localizar os elementos participantes (a bola e jogadores) e interpretar as informações adquiridas para a definição da melhor estratégia e ações a serem tomadas. 1.2. Objetivo Geral O objetivo do nosso trabalho é o desenvolvimento do módulo de visão computacional do time de futebol de robôs do IFPE que identifique os robôs e a bola no campo, através de ferramentas de código aberto. 1.3. Objetivos Específicos Desenvolver um módulo de visão computacional com base nos resultados obtidos com o OpenCV e com outros projetos que foram pesquisados e documentados neste trabalho com ferramentas open-sources. O módulo deve implementar um algoritmo para calibração e reconhecimento dos elementos aplicados ao futebol de robôs. Criar um tutorial simples para a configuração completa do ambiente de desenvolvimento no Linux, voltado à criação de sistemas de visão computacional. Antes de aplicar a metodologia escolhida vamos explicar os principais conceitos que serão necessários para criação de um sistema de visão computacional aplicado à robótica no capítulo 2. Serão abordados a história da robótica, criação do futebol de robôs bem como suas organizações e categorias. Depois partiremos para os principais conceitos da visão computacional e de processamento de imagens. No capítulo 3 analisamos as bibliotecas que são definidas pelas regras da competição e outras que são genéricas, mas voltadas para o objetivo do trabalho. Levantamos os custos da aquisição dos componentes necessários para criação da estrutura de apoio da equipe, como câmeras e placa de captura. Testamos alguns projetos e por fim implementamos nossa soluçãoo algoritmo para calibração e reconhecimento dos elementos aplicados ao futebol de 2 Introdução robôs que esta disponível no apêndice 3. Os resultados encontrados e conclusões estão no capítulo 4 e 5 respectivamente. 3 Fundamentação Teórica 2. Fundamentação Teórica Neste capítlo serão abordados a história da robótica, criação do futebol de robôs bem como suas organizações, categorias e regras. Depois partiremos para os principais conceitos da visão computacional e de processamento de imagens. 2.1. Robótica Podemos definir a robótica mais do que a união de conhecimentos da engenharia eletrônica, mecânica e da computação. A diversidade de tipos de robôs impedem que tenha uma definição que seja universalmente aceita. Acredita-se que o termo robótica foi usado pela primeira vez pelo escritor de ficção científica Isaac Asimov. Em 1941, foi lançada uma de suas mais famosas obras literárias, o livro I, Robot (Eu Robô). Nessa obra, Isaac Asimov descreveu as três leis da robótica, que segundo o autor, foram criadas exclusivamente para manter a segurança da humanidade. Segundo (RIA) um robô é um dispositivo mecânico articulado reprogramável, que de forma autônoma e recorrente à sua capacidade de processamento obtem informação do meio através de sensores, toma as decisões do que fazer de acordo com uma base de informações ou manipula objetos através de atuadores. Tal preocupação já citadas em obras científicas são justificadas atualmente. Em muitos setores da indústria existem sistemas de automação com robôs. Seja na realização de tarefas perigosas para os seres humanos ou atividades repetitivas que necessitam de uma alta demanda humana, a utilização de robôs no dia a dia é uma realidade. Uma das aplicações que demostram a importância da robótica é o projeto Mars Exploration Program (NASA, 2004) que desde 1997 apresenta resultados e descobertas, até então inalcançável através de robôs de exploração. Outra execelente aplicação são os Exoesqueletos para Aumento de Performance Humana que pertencem a uma classe especial de sistemas robóticos que são concebidos para aumentar as capacidades da força humana como demonstrado em (SIMONE et al., 2011) e (CASSADIO et al., 2011). A principal característica destes tipos de dispositivos é que o operador humano "veste" o robô e controla os movimentos do mesmo, movendo seus membros de forma natural. EHPA são geralmente destinados a aplicações de dispositivos 4 Fundamentação Teórica de apoio aos idosos, pessoas com deficiências locomotoras, na área militar e em aplicações no qual a manipulação de materiais pesados em ambientes não estruturados ou estreitos são necessários. O laboratório PERCRO da Scuola Superiore Sant’Anna completou recentemente o desenvolvimento e avaliação funcional do sistema Extensores Corporais – BE. O sistema é composto por quatro membros robóticos com cinemática antropomórficas e tem um total de 22 graus de liberdade como visto na Figura 1. A perna dá locomoção e da força com uma servo-amplificação onde permite operações em ambientes que são de difícil acesso pelos convencionais sistemas de manuseio, preservando a sensibilidade durante a manipulação das tarefas. Figura 1 - Imagem do PERCRO BE (PERCRO, 2014) O brasileiro e neurocientista Miguel Nicolelis está desenvolvendo o primeiro exoesqueleto controlado apenas pela mente no mundo em conjunto com pesquisadores de vários países. O projeto se chama Walk Again ou Andar de novo (tradução oficial) e é um resultado de anos de pesquisa de Miguel Nicolelis na Universidade de Duke, EUA (NICOLELIS, 2014), onde o objetivo inicial seria um cadeirante levantar e andar como na Figura 2. 5 Fundamentação Teórica Figura 2 - Projeto Andar Denovo (BLOGDACOPA, 2014) O projeto já apresentou resultados positivos com macacos e já está na fase final de treinamento com seres humanos. Na abertura da Copa do Mundo de Futebol no Brasil, foi feita a primeira demonstração com seres humanos para bilhões de pessoas em todo mundo, onde um paraplégico deu o pontapé inicial da primeira partida da Copa de 2014 que foi entre as seleções do Brasil e Croácia. Esses projetos e tantos outros, demonstram o poder e a importância da robótica para a sociedade (MOREIRA; VASCONCELOS, 2010) (YASUTOMI; MIRANDA, 2011) (BECKER, 2000). 2.2. Futebol de Robôs Diversas áreas de pesquisa utilizam, como base para seus estudos, problemas de interesse público, de fácil entendimento e que apresentem resultados práticos. Esta prática estimula o ingresso de pesquisadores nestas áreas, além de divulgar os trabalhos realizados para o público em geral. Um problema de crescente aceitação acadêmica é o uso de robôs autônomos em partidas de futebol (PEREZ et al., 2012). Problemas de domínio simbólico, como o jogo de xadrez, possuem um ambiente estático com acesso total às suas informações. Em contraste, o futebol de robôs é realizado em um ambiente dinâmico e em tempo real. Uma partida de futebol com robôs autônomos pode ser utilizado como objeto de pesquisa em diversas áreas da engenharia e da ciência da computação (MEHL et al., 2001). Dentre estas áreas estão a robótica, a inteligência artificial, os sistemas multiagentes, a visão computacional e os sistemas de tempo real (COSTA; PEGORARO, 2000) (ASSIS et al., 2005) (DALBEM, 2010) (NEVES; TADDEI; 6 Fundamentação Teórica BANDEIRA, 2004). O objetivo geral de uma equipe pode ser dividido em vários objetivos secundários, como obter a posse da bola, identificar a posição dos agentes no campo e fazer ou evitar gols. Levando em consideração a situação do jogo, cada membro da equipe deve ter um comportamento cooperativo, flexível e rápido para alcançar os objetivos do time. Os pesquisadores organizaram-se em torno do tema futebol de robôs com o objetivo de disseminar a utilização deste problema como plataforma de pesquisa. Paralelamente duas organizações foram criadas, ambas com o intuito de organizar competições internacionais de futebol de robôs e assim incentivar a produção científica na área e o aperfeiçoamento das equipes (KITANO et al., 1997). A Federation International of Robot Soccer Association organiza competições internacionais para a promoção do futebol de robôs desde 1996. A RoboCup é uma iniciativa internacional que incentiva a pesquisa sobre futebol de robôs através da organização de competições internacionais anuais desde 1997, (FIRA, 2014) no qual seu objetivo é em que 2050 o campeão do RoboCup vença o time campeão mundial humano (BURKHARD et al., 2002). As competições na RoboCup são divididas em várias modalidades, que variam quanto aos limites do campo e à forma dos robôs. Além de robôs reais, a FIRA e a RoboCup possuem modalidades no qual a partida é simulada. 2.2.1. Modalidades No RoboCup existem outras competições envolvendo robôs autônomos, entre elas estão as modalidades Rescue que promove a pesquisa e desenvolvimento no domínio socialmente significativo que é a de resgate em desastres onde a vida humana é colocada em risco, a modalidade @Work que desenvolvem robôs que operam em cenários relacionados ao trabalho e a modalidade @Home que visa desenvolver serviços de tecnologia assistida robótica com alta relevância para futuras aplicações domésticas pessoais. Ainda tem a modalidade Júnior que envolvem jovens estudantes desde a escola primária até alunos de graduação envolvidos em desafios de dança, futebol e resgate com robôs. Na parte de futebol, temos as modalidades: a. Humanoid: Robôs autônomos com um corpo e sensores parecidos com o de um humano para jogar futebol um contra o outro. Entre as muitas questões de pesquisa 7 Fundamentação Teórica investigadas nesta liga estão as dinâmicas como andar, correr e chutar a bola, manter o equilíbrio, percepção visual da bola, de outros jogadores, e no campo, a auto localização e o jogo em equipe como visto na Figura 3. Figura 3 - Humanoid League (TECHNO, 2011) c. Middle Size: Robôs de tamanho médio de diâmetro não superior a 50 cm que deve jogar futebol em equipes de até seis robôs com uma bola de tamanho normal da FIFA em um campo semelhante a um campo de futebol humano em escala. Todos os sensores são on-board. Robôs podem usar a rede sem fio para se comunicar. O foco da pesquisa está em plena autonomia e cooperação a nível do plano e de percepção mostrado na Figura 4. Figura 4 - Middle Size League (NIPPON, 2012) d. Simulation: Esta é uma das ligas mais antigas da RoboCup Soccer. O foco nesta liga é em inteligência artificial e estratégia da equipe. Em simuladores, agentes de forma e movimentos independentes jogam futebol em um campo virtual dentro de um computador. Há duas subligas: 2D e 3D. Na Figura 5 é possível ver como são as ligas. 8 Fundamentação Teórica Figura 5 - Simulation League 2D e 3D, respectivamente (DIGPLANET, 2014) (NEXUS, 2009) e. Standard Platform: Neste campeonato todas as equipes usam robôs padronizados. Portanto, as equipes se concentram no desenvolvimento do software apenas, enquanto usam o estado da arte em robôs. Usar visão omnidirecional não é permitido, forçando a tomada de decisão de compartilhamento do campo de visão de cada robô para a auto-localização e localização da bola. O campeonato substituiu o grande sucesso Four-Legged League, baseado nos robôs cão Aibo da Sony, e agora é baseada em robôs humanóides Nao na Figura 6. Figura 6 - Robôs Aibo e Nao, respectivamente (IGREBOT, 2014) (IAUBS, 2010) 9 Fundamentação Teórica 2.2.2. Small Size League A SSL é uma das diversas modalidades de futebol de robôs da Robocup. Para essa categoria são utilizados robôs com o modelo especificado nas regras F180 2 (Small Size Robot Soccer). Segundo o manual da FIRA a modalidade SSL tem como característica o foco na cooperação entre os agentes e controle inteligente em um ambiente altamente dinâmico, com um sistema híbrido centralizado mostrado na Figura 7. Figura 7 - Robôs da categoria F180 (CORAL, 2010) A competição ocorre entre duas equipes de até seis robôs com medidas limitadas a 18 cm de diâmetro e 15 cm de altura, que participam de uma partida de futebol com uma bola laranja. Eles são identificados e monitorados por duas câmeras acopladas em cima do campo e conectadas a um computador como visto na Figura 8. O campo tem o formato retangular, feito com tapete ou carpete verde e com duas opções de tamanho, único com 6050mm x 4050mm e o dobrado com 8090mm x 605 mm. As demarcações do campo são feitas com linhas brancas de 10mm e o sistema de visão através das duas câmeras, localizadas uma em cada parte do campo, é compartilhada para as duas equipes onde os dados são enviados via Ethernet seguindo o protocolo do software SSLVision, que será mencionado na metodologia. 2 As regras da modalidade F180 estão disponíveis em http://goo.gl/Up60Y5 Acessao em 2014 10 Fundamentação Teórica Figura 8 - Sistema do Futebol de Robôs (LAB, 2008) 2.3. Módulo de Visão do Futebol de Robôs O módulo de visão computacional envolve as etapas de aquisição e identificação. Ele deve obter informações referentes aos componentes do jogo visualmente, permitindo a decisão de estratégia da equipe (SCHOUTE; POEL; HEIJDEN, 2003). Os componentes do jogo relevantes a este módulo são: os jogadores da equipe adversária, a bola e os jogadores da própria equipe. Existem duas abordagens possíveis em um módulo de visão para futebol de robôs: visão embarcada e visão global (MCMAHAN; BUNTING; MIDDLETON, 2014) (AIRES; ALSINA; MEDEIROS, 2001) (SCHWARTZ et al., 2003). No modelo de visão embarcada as imagens são adquiridas com a perspectiva dos jogadores, sendo que cada um dos robôs carrega consigo uma câmara (ANDRADE; MATOS; FREIRE, 2006). Diferente deste modelo, a visão global consiste na visualização de todo o campo (GARCIA et al., 2007). O primeiro passo da identificação visual é localizar a posição da bola e de todos os robôs, adversários ou não, no campo. Entretanto, antes deste passo o sistema vai naturalmente precisar de uma etapa de calibração de modo a se adaptar às condições de iluminação do campo, que será descrita na parte da metodologia deste trabalho. A representação da posição de cada um destes componentes pode ser feita através da sua posição relativa ou absoluta. Enquanto a posição relativa é dada pela sua distância em 11 Fundamentação Teórica duas dimensões até um determinado ponto, a posição absoluta é representada por um par ordenado indicando sua posição no plano cartesiano que representa o campo. Para identificar a movimentação da bola e dos robôs adversários, é necessário determinar a direção do movimento de cada um e sua velocidade. Esta identificação é feita através de um acompanhamento temporal da posição global destes componentes. Os robôs que pertencem à equipe devem ser identificados para que o módulo de estratégia saiba a quem atribuir as ações (FIRA, 2014). Esta identificação pode ser feita através de uma associação pelo acompanhamento temporal ou através de marcas colocadas sobre cada um dos robôs. Marcas também devem ser utilizadas para possibilitar a identificação da orientação de cada robô, outra informação necessária para o módulo de estratégia. Além de responder ao sistema com confiabilidade, exatidão, regularidade e latência mínima, o módulo de visão deve ser robusto a alterações da iluminação e a mudanças na cor do campo de jogo, e deve suportar as variações de cores utilizadas pela equipe adversária. Estas características indicam a qualidade da implementação do módulo e determinam o sucesso da equipe em competições (BIANCHI; REALI-COSTA, 2000) (MARTINEZGOMEZ; WEITZENFELD, 2004). 2.4. Visão Computacional Um SVC é um sistema computadorizado capaz de adquirir, processar e interpretar imagens correspondentes a cenas reais (GONZALES; RICHARD, 2000). As etapas são semelhantes ao sistema visual humano, como visto no Anexo 1. A Figura 9 mostra esquematicamente um diagrama de blocos de um SVC, onde as etapas deste são: aquisição de imagens, pré-processamento, segmentação, extração de características, reconhecimento e interpretação. Vale ressaltar que nem todos os os SVCs possuem todas estas etapas (BALLARD; BROWN, 1982). 12 Fundamentação Teórica Figura 9 - Representação de um sistema de visão computacional genérico (FILHO; NETO, 1999) A aquisição da imagem envolve a escolha do tipo de sensor, o conjunto de lentes a utilizar, as condições de iluminação da cena, os requisitos de velocidade de aquisição (assumindo que os robôs estariam a todo momento mudando de lugar), a resolução e o número de níveis de cinza da imagem que poderiam estar digitalizada, dentre outros. O pré-processamento consiste em aprimorar a qualidade da imagem para as etapas subsequentes. As operações efetuadas nesta etapa são ditas de baixo nível porque trabalham diretamente com os valores de intensidade dos pixels. A imagem resultante desta etapa é uma imagem digitalizada de melhor qualidade (com menos ruídos) que a original. A tarefa básica da etapa de segmentação é a de dividir uma imagem em suas unidades significativas, ou seja, nos objetos de interesse que a compõem. Esta tarefa, apesar de simples de descrever, é uma das mais difíceis de implementar. Reconhecimento é o processo de atribuição de um rótulo a um objeto baseado em suas características, traduzidas por seus descritores. A tarefa de interpretação, por outro lado, consiste em atribuir significado a um conjunto de objetos reconhecidos. Todas as tarefas das etapas descritas acima pressupõem a existência de um conhecimento sobre o problema a ser resolvido, armazenado em uma base de conhecimento, cujo tamanho e complexidade podem variar enormemente. Idealmente, esta base de conhecimento deveria não somente guiar o funcionamento de cada etapa, mas também permitir a realimentação entre elas (RUDEK; COELHO; CANCIGLIERI, 2001) (BIANCHI, 2001). 13 Fundamentação Teórica 2.5. Processamento de Imagens Como um subcampo do processamento digital de sinais, o processamento digital de imagem possui algumas vantagens sobre o processamento analógico de imagem como por exemplo, permitir que uma série mais ampla de algoritmos sejam aplicados aos dados de entrada e poder evitar problemas como a distorção de sinais durante o processamento e o acúmulo de ruídos. Da etapa de aquisição até o reconhecimento e interpretação dos dados é necessário utilizar várias técnicas (como morfológicas), que serão necessárias para resolver o problema em questão. As técnicas relevantes para este trabalho serão abordadas posteriormente. 2.5.1. Imagem Digital Uma imagem digital consiste em um arranjo bidimensional de valores que representam as características luminosas de objetos em uma cena, sendo cada um destes elementos chamado de pixel (picture element). Uma imagem digital pode ser representada por uma função bidimensional f(x,y), onde x indica uma coluna e y uma linha na imagem (FILHO e NETO, 1999). Mas antes da imagem ser exibida na tela, ela tem que primeiro ser escrita para locais de memória RAM endereçáveis. Estes são agora chamados de adaptadores gráficos, mais precisamente descrito como RAM de vídeo. VRAM locais são então digitalizadas e a saída resultante de cada célula ativa um pixel correspondente na tela. (HUMPHRIS, 2013) Na Figura 10 é possível ver um exemplo de um display monocromático de dois níveis, preto e branco, com 150 pixels. Displays monocromáticos requerem apenas um bit por pixel que está definido para binário 1 para a ativação do mesmo ou 0 para desliga-lo. 14 Fundamentação Teórica Figura 10 - Adaptador gráfico simples (HUMPHRIS, 2013) Para aumentar a quantidade de tons discretos é preciso aumentar os níveis da VRAM. Como visto na Figura 11, para se ter 255 tons é preciso ter 8 níveis de VRAM. As posições de linha e coluna são digitalizada exatamente como antes só que desta vez um terceiro valor é calculado o qual é derivado a partir da combinação dos oito níveis. Isso irá produzir um valor equivalente decimal entre 0 e 255, onde desabilita o pixel e 255 habilita totalmente para o máximo de intensidade. O cálculo da posição superior do pixel esquerdo é mostrada como um exemplo na Figura 11. Comparando esta com o exemplo anterior pode-se ver que, para produzir 255 tons requer oito vezes mais memória. Figura 11 - 256 Níveis de intensidade (HUMPHRIS, 2013) 15 Fundamentação Teórica A última etapa no desenvolvimento da compreensão de uma imagem digital, seria a expansão para as cores, que são as combinações de três matrizes VRAMs para as saídas R, G, B, representando respectivamente os componentes vermelho, verde e azul da cor da imagem na posição. Segundo (HUMPHRIS, 2013), cada cor é tratada separadamente; transformando quaisquer dois pixels para fora das três, onde a tríade resultaria em um display colorido único como visto na Figura 12. A mistura de cores é feita dentro do olho humano onde os pixels vermelhos, verdes e azuis são ativados a vários graus como explicado no Anexo 1. Figura 12 - Monitor colorido (HUMPHRIS, 2013) As placas gráficas têm a sua própria memória de vídeo dedicada para armazenar imagens de tela e quanto mais melhor. Normalmente, uma placa de vídeo com 64 MB ou 128MB irá atender a maioria das aplicações, mas esta deve ser aumentada para 256 MB ou trabalhar com Gigabytes para lidar com jogos de computador e renderizações, por exemplo. Segundo (FILHO; NETO, 1999) a profundidade de cor é um termo da computação gráfica que descreve a quantidade de bits usados para representar a cor de um único pixel numa imagem. Este conceito é conhecido também como bits por pixel (bpp) e quanto maior a quantidade de bits presente na imagem, maior é a escala de cores disponível. 16 Fundamentação Teórica A Figura 13 mostra um exemplo deste efeito, na diferença do nível de detalhes do personagem da Nintendo Mario. Neste exemplo, tanto a quantidade de pontos como a quantidade de cores varia significativamente. Figura 13 – Versão 8 bits, 16 bits e 64 bits do personagens Mario3 (PODCASTS, 2014) 2.5.2. Vizinhanças de um Pixel Como dito anteriormente, o pixel p será representado pela coordenada (x,y). Considerando um pixel p, suas coordenadas terão quatro vizinhos horizontais e verticais cujo suas localizações no plano serão representadas da seguinte forma: (x+1, y), ( x-1 , y), (x, y+1) e (x, y-1). Esse conjunto de pixels é conhecido como vizinhança de 4 de p. Cada pixel está a uma distância de (x,y), sendo que alguns vizinhos de p poderão ficar de fora se o pixel em questão estiver em uma borda da imagem digital. Também podemos representar os quatro vizinhos diagonais de p. Suas coordenadas são: (x+1, y+1), ( x-1 , y-1), (x-1, y+1) e (x-1, y-1). Esses pontos junto com a vizinhança de 4 são chamadas de vizinhança de 8 de p. Da mesma forma que a vizinhança de 4, alguns pontos da imagem poderão estar fora se a mesma 3 Todos os direitos do personagem Mario são reservados à Nintendo Company, Limited 17 Fundamentação Teórica se encontrar na borda. Na Figura 14 podemos visualizar os 3 tipos de vizinhanças com os pontos marcados com cinza. Figura 14 - Conceito de 4-vizinhança, vizinhança diagonal e 8-vizinhança (GONZALES; RICHARD, 2000) 2.5.3. Conectividade O conceito de conectividade é fundamental para identificação das bordas e de regiões de interesse de um objeto em uma imagem. Dois pixels estão conectados se os mesmos de alguma forma estão inclusos em algum tipo de vizinhança e se são de valores ou níveis de cinza, similares. (GONZALES; RICHARD, 2000) 2.5.4. Convolução com Máscaras Em processamento de imagens é muito frequente utilizar técnicas como digitalização, detecção de bordas e filtragem de ruídos, nas quais são efetuadas a partir do conceito de convolução de máscaras. A operação de convolução unidimensional entre dois vetores A e B, denotada A*B, pode ser entendida como um conjunto de somas de produtos entre os valores de A e B, sendo que inicialmente o vetor B é espelhado e após cada soma de produtos é deslocado espacialmente de uma posição (FILHO; NETO, 1999). Este raciocínio pode ser expandido para o caso bidimensional, onde a imagem a ser processada é uma matriz relativamente grande e corresponde ao conjunto A, enquanto uma matriz de pequenas dimensões (também chamada máscara ou janela) corresponde ao conjunto B (JÄHNE, 1991). A máscara percorrerá todos os pontos da imagem deslocando-se ao longo de cada linha e entre as várias linhas, da direita para a esquerda, de cima para baixo, até ter processado 18 Fundamentação Teórica o último elemento da matriz imagem. O resultado será armazenado em uma matriz de mesmas dimensões que a imagem original. Matematicamente, na sua forma contínua ela é definida como a integral do produto de uma das funções por uma cópia deslocada e invertida da outra; a função resultante h depende do valor do deslocamento. Se x for a variável independente e u, o deslocamento, a fórmula pode ser escrita como na Equação 1: +∞ (𝑓 ∗ 𝑔)(𝑥) = ℎ(𝑥) = ∫ 𝑓(𝑢) ∙ 𝑔(𝑥 − 𝑢)𝑑𝑢 −∞ Equação 1 - Convolução Contínua (WIKIPÉDIA, 2014) Entretanto, em imagens digitais, é usada a definição de convoluções para funções de domínio discreto como visto na Equação 2. 𝑘 (𝑓 ∗ 𝑔)(𝑘) = ℎ(𝑘) = ∑ 𝑓(𝑗) ∙ 𝑔(𝑘 − 𝑗) 𝑗=0 Equação 2 - Convolução Discreta (WIKIPÉDIA, 2014) No qual f e g são sequências de tamanho n e a fórmula fornece o valor do k-ésimo elemento do resultado. Deve-se notar que o tamanho de h na Equação 2 é 2n-1, isto é, k varia de 0 a 2n-2. 2.5.5. Modelos de Cor 2.5.5.1. O modelo RGB O modelo padrão de representação de cores em imagens digitais é chamado de RGB (Red, Green and Blue). Penharbel, et al. (2004) falam que esse modelo é usado pela maioria dos dispositivos de aquisição e visualização de imagens, podendo ser visto como um cubo de cores na Figura 15 onde os componentes vermelho, verde e azul correspondem aos eixos x, y e z. 19 Fundamentação Teórica Figura 15 - Representação do cubo RGB (PENHARBEL et al., 2004) Os tons de cinza ocorrem quando os três componentes possuem valores iguais, seguindo a diagonal principal do cubo, com a origem (0,0,0), preta, e a extremidade inversa (255,255,255), branca. 2.5.5.2. O modelo de cores HSV O modelo HSV (Hue, Saturation and Value) que tem o formato cilíndrico, também é conhecido no seu formato cônico como HSI (Hue, Saturation and Intensity) e é o modelo de cores que mais se aproxima da percepção humana, onde H significa e representa a matiz e S à saturação visto na Figura 16. O componente V ou I, representa a intensidade da cor, deslocando verticalmente o vetor da cor. Figura 16 - Repreentação do cone HSI (PENHARBEL et al., 2004) 20 Fundamentação Teórica Segundo (CARDANI, 2004) o espaço de cores HSI tem um formato de cone, com H variando de 0 a 360 graus e S e I variando de 0 a 100 por cento, como mostrado na anterior. As equações de transformação do formato de cor do RGB para o HSV, e vice versa, podem ser vistas nas Equações 3 e 4. 𝐻={ 𝛩, 360 − 𝛩, 𝐵≤𝐺 𝐵>𝐺 1 (𝑅 2 − 𝐺) + (𝑅 − 𝐵) 𝛩 = cos −1 ( ) √(𝑅 − 𝐺)2 + (𝑅 − 𝐵)(𝐺 − 𝐵) 𝑆 =1− 3 ∙ (𝑚𝑖𝑛(𝑅, 𝐺, 𝐵)) (𝑅 + 𝐺 + 𝐵) 𝐼= 1 (𝑅 + 𝐺 + 𝐵) 3 Equação 3- Transformação de RGB para HSI 𝑅 = 𝐼 (1 + 𝑆 ∙ 𝑐𝑜𝑠(𝐻) ) cos(60° − 𝐻) 𝐺 = 1 − (𝑅 + 𝐵) 𝐵 = 𝐼(1 − 𝑆) Equação 4 - Transformação de HSI para RGB 2.5.6. Operações Morfológicas Um dos grandes problemas em processamento e análise de imagens refere-se à extração das componentes de interesse contidas na cena original. Os conceitos de processamento de imagens mais utilizados no trabalho foram as operações morfológicas. Basicamente a morfologia matemática consiste em extrair as informações relativo às características de uma imagem e compará-la com um outro conjunto menor e de forma já conhecida. Chamamos esse outro conjunto de elemento estruturante. Logo, sua base consiste na teoria dos conjuntos como visto em (JÄHNE, 1991). As aplicações podem ser utilizadas com objetivos distintos nas várias técnicas para análise de imagem, como segmentação e reconhecimento de bordas, por exemplo. Tais técnicas foram muito utilizadas nesse projeto. A seguir iremos detalhar algumas operações morfológicas importantes e utilizadas nesse trabalho. 21 Fundamentação Teórica 2.5.6.1. Erosão Erosão é uma das operações básicas da morfologia matemática. Inicialmente foi definida para operações com imagens binárias. Porém atualmente sua utilização já foi estendida para imagens em tons de cinzas (GONZALES; RICHARD, 2000). Sejam A e B conjuntos no espaço Z² .A erosão de A por B, denotada A θ B, é definida como: 𝑨𝚯𝑩 = {𝒙|(𝑩)𝒙 ⊆ 𝑨; 𝑨, 𝑩 ∈ 𝒁²} Equação 5 - Erosão de A por B Podemos dizer que a erosão de A por B resulta no conjunto de pontos x tais que B, transladado de x, está contido em A. 2.5.6.2. Dilatação A operação de dilatação, segundo (FILHO; NETO, 1999) também as vezes chamada de dilação, é uma transformação morfológica que combina dois conjuntos usando adição vetorial. Seu símbolo é ⊕. Como o nome diz, o resultado será uma imagem “engordada”. Geralmente utiliza-se um elemento estruturante para aprofundar e expandir as formas contidas em uma imagem. Utilizando um elemento estruturante onde todos os valores são positivos para efetuar uma dilatação numa imagem em níveis de cinza, obtém-se como imagem resultante uma imagem com detalhes escuros atenuados e detalhes claros acentuados. A operação de dilatação em tons de cinza fornece como saída uma imagem com as mesmas dimensões da imagem de entrada e pixels com valores de 0 a 255, para o caso de uma imagem original com 256 níveis de cinza. Matematicamente, podemos definir a operação de dilatação da seguinte forma: ̂ ) ⋂ 𝑨 ≠ ⌀; 𝑨, 𝑩 ∈ 𝒁²} 𝑨 ⊕ 𝑩 = {𝒙|(𝑩 𝒙 Equação 6 - Dilatação de A por B Onde A e B são conjuntos no espaço Z², por exemplo e ⊘ seja o conjunto vazio. 22 Fundamentação Teórica 2.5.7. Limiarização Limiarização, ou thresholding, é um processo que se baseia na diferença dos níveis de cinza que compõe diferentes objetos de uma imagem. Escolhe-se um número (limiar) que servirá de base para definir dois grupos: o grupo de pixels com níveis de cinza abaixo do limiar e o grupo de pixels com níveis de cinza acima do limiar. Em uma imagem limiarizada, atribui-se um valor fixo para todos os pixels de mesmo grupo (FILHO; NETO, 1999). Matematicamente, a operação de limiarização pode ser descrita como uma técnica de processamento de imagens na qual uma imagem de entrada f(x,y) de N níveis de cinza produz à saída uma imagem g(x,y), chamada de imagem limiarizada, cujo número de níveis de cinza é menor que N. Normalmente, g(x,y) apresenta 2 níveis de cinza, sendo: 𝒈(𝒙, 𝒚) = 𝟏 𝒔𝒆 𝒇(𝒙, 𝒚) ≥ 𝑻 { 𝒈(𝒙, 𝒚) = 𝟎 𝒔𝒆 𝒇(𝒙, 𝒚) ≤ 𝑻 Equação 7 - Condição de Limiarização No qual os pixels rotulados com 1 correspondem aos objetos e os pixels rotulados com 0 correspondem ao fundo (background) e T é um valor de tom de cinza pré-definido, ao qual denominamos limiar. Para este exemplo de limiarização dá-se o nome de binarização. Na Figura 17 vemos um exemplo de uma imagem original em escala de cinza (a) e seu histograma (b) e logo abaixo sua imagem binarizada (c) com um limiar indicado em (d). 23 Fundamentação Teórica Figura 17 - Exemplo de Binarização (GONZALES; RICHARD, 2000) 2.5.8. Região de Interesse Para medir um parâmetro dentro de uma imagem, o sistema de processamento precisa distinguir as áreas de interesse. Esta "região de interesse" ou ROI pode ser determinada com base em valores da intensidade do pixel ou uma área determinada pelo usuário (Thresholding and the Region of Interest, 2014). 2.5.9. Segmentação O processo de separação da região de interesse em uma imagem é chamado de segmentação. Uma forma simples de segmentação é considerar um intervalo de valores da intensidade do pixel, para identificação de objetos de interesse em uma imagem. Há outras formas mais sofisticadas de identificação. Quando dividimos uma imagem digital em várias regiões com o objetivo de simplificar sua análise estamos utilizando as técnicas de segmentação de imagens. Com as técnicas de segmentação é possível localizar objetos de interesse e formas em uma determinada imagem (BRUCE; BALCH; VELOSO, 2000). 24 Fundamentação Teórica Atualmente várias técnicas e algoritmos de segmentação já foram desenvolvidos porém não há uma solução definitiva e geral para resolução dos problemas. Na maioria das vezes é necessária uma combinação das técnicas existentes para solução de um determinado problema. Dentre os tipos de segmentação podemos abordar as baseadas em formatos que têm como o objetivo a detecção de pontos, linhas ou bordas por exemplo. As baseadas em características dos pixels que estão em análise na imagem, baseando-se em suas cores e suas intensidades e por fim a segmentação baseada no histograma de uma imagem. Sua aplicação ocorre nas mais diversas áreas, como: no sistema de reconhecimento de faces, análise de imagens médicas (JÄHNE, 1991) para detecção de tumores, volumes de tecidos, estruturas anatômicas e por fim, nos sistemas de visão computacional voltados para robótica como utilizado nesse trabalho. 2.5.10. Descritores de Forma Depois que a imagem foi segmentada em regiões, os pixels agrupados são geralmente representado e descritos em formatos apropriados para o processamento das informações. No qual, de uma maneira simples, podemos representar esta região em termos de suas características externas (sua fronteira), ou em termos de características internas (os pixels que compõem a região) (BASSO, 2002). Geralmente, uma representação externa é escolhida quando o que interessa estiver voltado para características de forma e na representação interna quando for voltada para propriedades como cor ou textura. Os descritores de formas são métodos matemáticos que representam a forma da região ou objeto segmentado, onde idealmente devem possuir invariância a rotação, ponto de início, translação e escala (SILVA et al., 2007). 2.5.11. Momentos A forma dos segmentos da fronteira pode ser descritas quantitativamente através dos momentos. Segundo (SOUZA; PISTORI, 2005) um dos métodos utilizados para a extração das características da imagem são os momentos da imagem, ou momentos estatísticos. 25 Fundamentação Teórica Esses momentos e suas funções podem ser caracterizados como valores numéricos, calculados a partir de uma imagem previamente segmentada e são utilizados para fornecer descrições resumidas da distribuição espacial dos pontos contidos na imagem bidimensionais analisada. Esses momentos de ordem p + q sobre uma função contínua 2D, de acordo com (HU, 1962) são calculados de acordo com a Equação 8. +∞ +∞ 𝑀𝑝𝑞 = ∫ ∫ 𝑥 𝑝 𝑦 𝑞 𝐼(𝑥, 𝑦)𝑑𝑥𝑑𝑦 −∞ −∞ Equação 8 - Momentos de ordem p+q Em (SOUZA; PISTORI, 2005) também fala que uma imagem pode ser visualizada como uma função de duas dimensões discreta F, onde a intensidade de cada pixel é indexada como F(x,y). A Equação 9, como demonstrado em (HU, 1962) é a derivação da Equação 8 de momentos aplicados a imagens, visto que quando estamos trabalhando com imagens digitais, as integrais são substituídas por somatórios. 𝑙𝑎𝑟𝑔𝑢𝑟𝑎 𝑎𝑙𝑡𝑢𝑟𝑎 𝑀𝑝𝑞 = ∑ ∑ 𝑥 𝑝 𝑦 𝑞 𝐼(𝑥, 𝑦) 𝑥=1 𝑦=1 Equação 9 - Momentos aplicados a imagens Em (SILVA et al., 2007) podemos ver que para representar objetos através de momentos, são considerados apenas os pixels pertencentes ao objeto. Através dos momentos é possível achar propriedades interessantes, como por exemplo o centro de massa x e y representados pelos momentos M10 M00 e M01 M00 , onde M00 é o momento que representa a área do objeto. É possível derivar também os momentos centrais para imagens definidos pela Equação 10. 𝑙𝑎𝑟𝑔𝑢𝑟𝑎 𝑎𝑙𝑡𝑢𝑟𝑎 𝑀𝑝𝑞 = ∑ ∑ (𝑥 − 𝑥̅ )𝑝 (𝑦 − 𝑦̅)𝑞 𝐼(𝑥, 𝑦) 𝑥=1 𝑦=1 Equação 10 - Momentos centrais 26 Fundamentação Teórica Onde a partir deste momento central, podemos achar propriedades derivadas como variância em X e Y e a direção do objeto com as fórmulas 11 e 12 (HU, 1962). 𝜎𝑥2 = 𝑢20 𝑢02 , 𝜎𝑦2 = 𝑚00 𝑚00 Equação 11 - Variância em X e Y 𝒕𝒂𝒏 𝜽 = (𝒖𝟎𝟐 − 𝒖𝟐𝟎 − 𝟐𝒖𝟏𝟏 + 𝝀) (𝒖𝟎𝟐 − 𝒖𝟐𝟎 + 𝟐𝒖𝟏𝟏 − 𝝀) Equação 12 - Direção do Objeto Embora os momentos sejam o método mais popular, eles não são os únicos descritores que podem ser usados com esse propósito. Por exemplo, um outro método consiste no cálculo da transformada de Fourier unidimensional, obtendo seu espectro e utilização de seus primeiros componentes para a descrição da função. A vantagem dos momentos em relação a outras técnicas é que sua implementação é direta, além de eles carregarem uma interpretação física da fronteira de uma forma e suas características serem invariantes à escala, à posição e à orientação (HU, 1962). 2.6. Ferramentas Encontramos bibliotecas e projetos que ajudaram a entender os conceitos e aplicações do trabalho, como por exemplo o SSL-Vision, o Find-Object e a biblioteca OpenCV. A primeira plataforma encontrada para o estudo da visão computacional voltada para o projeto foi a SSL-Vision. O motivo da escolha dessa plataforma para o inicio da pesquisa deve-se ao fato da mesma ser atualmente o sistema de captura de vídeo oficial da Robocup categoria SSL (FIRA, 2014). 2.6.1. SSL-Vision Em meados de 2009 o comitê organizador da Robocup decidiu criar um sistema de visão compartilhada para uso de todas as equipes. Esse sistema não só compartilha o software mas também permite que as duas equipes utilizem o mesmo hardware (câmeras acopladas no 27 Fundamentação Teórica suporte acima do campo). Dessa forma é criado um ambiente padrão para realização da competição por diversas equipes como visto na Figura 18 (About the Small Size League, 2008) (ZICKLER et al., 2010). Figura 18 - Tela do SSL-Vision (SSL VISION, 2010) Todas as pesquisas do estado da arte demonstraram resultados satisfatórios dessa plataforma (KAICK et al., 2001) (MARTINEZ-GOMEZ; WEITZENFELD, 2004) (MARTINS; TONIDANDEL; BIANCHI, 2006) (SOUSA; PINTO; PINTO, 2010) (GRITTANI; G.GALLINELLI; RAMŕEZ, 2000) onde mesmo sendo padrão, o ambiente permite que cada equipe desenvolva sua própria estratégia, focando apenas no desenvolvimento dos algoritmos sem se preocupar com interface gráfica e outros requisitos que são essenciais como calibração, comunicação, captura das imagens das duas câmeras e definição de parâmetros. Porém como dito anteriormente, para padronizar os recursos utilizados por todas as equipes da categoria Small Size, as regras definem o tipo de hardware utilizado pelas equipes para o desenvolvimento de sua estratégia. Como um dos objetivos do trabalho é ser de baixo custo, não foi possível utilizar o padrão de câmera e conectores especificado nas regras da categoria. É necessário para completa utilização desse projeto câmeras do tipo IEEE 1394 / DCAM com placas de captura com conexão Firewire para obtenção de uma maior largura de banda. Através de pesquisas de mercado foi identificado o investimento necessário conforme a Tabela 1. 28 Fundamentação Teórica Equipamento Valor Guppy F-046.A 1/2" CCD Color R$ 2.232,50 Placa Captura Firewire Ieee 1394a R$ 139,99 Cabos Firewire Ieee 1394 R$ 22,99 Total R$ 2.395,48 Tabela 1 - Preço dos Equipamentos Como observado na Tabela 1, o investimento médio para a ter todos os equipamentos necessários para a aquisição das imagens do campo é de R$ 2.395,48, tornando uma das partes mais caras do projeto de uma equipe. Dessa forma cancelamos os testes com o SSLVision e iniciamos uma nova pesquisa focada em uma implementação completa, simples e eficiente que possa ser utilizada em um ambiente de captura controlado e com baixo investimento em recursos computacionais. O novo foco se tornou a procura de uma biblioteca que aceitasse comunicações USB para utilização de uma webcam. Contudo, vale ressaltar que toda a parte de aquisição e calibração das imagens já estão implementadas na plataforma, sendo necessário apenas codificar a parte de processamento de imagens se quiser um melhor desempenho com alguma técnica específica. 2.6.2. Find-Object Na procura por novas soluções para o problema encontramos o projeto Find-Object que são implementações de técnicas de processamento de imagens no OpenCV como SIFT, SURF, FAST, BRIEF voltadas para reconhecimento de objetos como visto na Figura 19. 29 Fundamentação Teórica Figura 19 - Tela do Projeto Find-Object (FIND-OBJECT, 2012) Como o projeto é um projeto aberto (LABBÉ, 2012), estudamos o seu código e avaliamos a viabilidade do projeto e das técnicas que utilizam algoritmos de aprendizagem de máquina e redes neurais. Após alguns testes identificamos que o projeto atende as expectativas com relação a identificação de objetos em imagens, porém não atende a um dos principais requisitos necessário nas implementações voltadas para o futebol de robôs: o tempo de processamento. Além da preocupação com a precisão e tolerância à variação de luminosidade no campo, o tempo de processamento é uma dos requisitos fundamentais para o sucesso do projeto. Como o projeto não conseguiu atender as necessidades de um sistema em tempo real, resolvemos utilizar a ferramenta de visão computacional que ele utilizava para implementar os algoritmos de forma mais eficiente e específica. 2.6.3. OpenCV O OpenCV é uma biblioteca multiplataforma desenvolvida pela Intel, disponibilizando o uso do seu código para utilizar em aplicações tanto comerciais como acadêmicas. Ele possui módulos de álgebra linear, processamento de imagens e vídeo, interface gráfica do usuário, estrutura de dados, controle de mouse e teclado, além de mais de 350 algoritmos de visão computacional como: calibração de câmera, filtros de imagem, análise estrutural, reconhecimento de objetos, processamento em tempo real de imagens e outros (BRADSKI; KAUHLER, 2013). 30 31 Fundamentação Teórica As áreas de aplicações desta biblioteca são muito amplas, alguns exemplos são as áreas de sistemas de reconhecimento facial, como mostrado na Figura 20, realidade virtual, identificação de objetos, gravação de vídeos, interface homem-máquina e reconhecimento de movimentos. Figura 20 - Exemplo de detecção de faces com OpenCV (PYFACEDETECT, 2010) Ela foi desenvolvida nas linguagens C/C++ mas tem suporte para as linguagens Python, Java e Visual Basic onde foi estruturada em módulos, no qual segundo (INTEL, 2000) os módulos principais são: a) core - um módulo compacto que define as estruturas de dados básicas, incluindo a matriz multi-dimensional Mat e funções básicas usado por todos os outros módulos. b) imgproc - um módulo de processamento de imagem, que inclui filtragem de imagens linear e não-linear, transformações geométricas de imagem, conversão de espaço de cores, histogramas, e assim por diante. c) video - um módulo de análise de vídeo que inclui estimativa de movimento, subtração de imagens e algoritmos de rastreamento de objetos. d) calib3d - algoritmos básicos de calibração de câmera única e estereoscópica, estimativa de objetos e elementos da reconstrução 3D. e) features2d - detectores de características salientes, descritores e Fundamentação Teórica identificadores de descritores. f) objdetect - detecção de objetos e instâncias de classes predefinidas, como por exemplo: faces, olhos, canecas, pessoas, carros e etc. g) highgui - uma interface simples de usar de captura de vídeo, imagem e codecs de vídeo com possibilidade de fazer simples interfaces gráficas como janelas, botões e barras de rolagem. h) gpu - algoritmos com aceleração de GPU (unidade de processamento gráfico) de diferentes módulos do OpenCV. Tanto o SSL-Vision quanto o Find-Object são projetos que utilizam algoritmos do OpenCV. Os motivos principais para utilização da biblioteca no nosso projeto são os vários algoritmos de visão computacional e sua capacidade de realizar processamento de imagens em tempo real. 2.6.4. IDEs Primeiro, foi instalado o OpenCV na máquina virtual com o sistema operacional Ubuntu instalado como mostrado no Apêndice 1. Depois de testarmos um exemplo pelo terminal, configuramos uma IDE para trabalhar. Como não conseguimos utilizar os projeto citado anteriormente, começamos a desenvolver uma aplicação que conseguisse identificar e rastrear os robôs e a bola em campo. Utilizamos o Git4 e o Meld5 para fazer o controle de versão e gerenciar as mudanças que ocorreram durante o desenvolvimento no projeto e o Qt Studio como ambiente de desenvolvimento como mostrado no Apêndice 2. Depois que configuramos todo o ambiente e começarmos a desenvolver, tivemos vários problemas com compatibilidade de drivers com a máquina virtual e a camera que foram solucionados e documentado no Apêndice 4. De modo geral, o desenvolvimento do projeto teve quatro fases: captura da imagem, calibração, processamento e exibição das informações na tela. 4 5 Git - https://github.com/ Meld - http://meldmerge.org/ 32 Metodologia 3. Metodologia Um módulo de visão computacional aplicado ao futebol de robôs pode ser decomposto em algumas partes: transformação do espaço de cores, classificação de cores, segmentação e localização de objetos. Uma vez que a câmera de vídeo forneça imagens do campo no formato RGB, uma transformação para o espaço de cores HSV é necessária, onde a matiz de cada cor independe da luminosidade existente, tornado o sistema mais robusto a variações da mesma. Como o formato HSV fornece um número muito grande de cores diferentes, é preciso alguma forma de classificação das mesmas para o ambiente de futebol de robôs, fazendo com que todos os pontos que formam a imagem pertençam a um conjunto limitado de cores diferentes, chamadas de classes de cores. Isto é feito a partir de uma calibração, definindo intervalos de tons para cada classe. Com esta classificação o processo de segmentação torna-se mais simples de ser realizado, tendo como objetivo encontrar manchas (conjunto de pontos adjacentes) de cada classe de cores. 3.1. Captura da Imagem Para fazer a parte de captura, teríamos que ter uma imagem dos robôs e da bola, mas como a proposta do trabalho não é o desenvolvimento dos robôs foram impressos, cículos grandes que representariam os robôs e circulos menores para representações dos marcadores. Era necessário colocar a câmera em uma posição que fosse a mais próxima possível de como seria em uma competição de verdade como é possível ver na Figura 21. Foi colocada inicialmente no teto mas descobriu-se ao capturar as imagens que havia pouca iluminação do ambiente e que a câmera estava com defeito pois ficava com muita variação no brilho. 33 Metodologia Figura 21 - Câmera na posição vertical (AUTORES, 2014) A posição da câmera e do campo foi trocada para tentar ter a menor interferência possível das sombras e ter mais iluminação. Após vários testes foi analizado que um bom local seria a parede, porém havia ainda muito ruído na imagem por causa da reflexão da luz nos marcadores de papel que refletiam a luz. Trocamos o material dos marcadores e a câmera, conseguindo imagens melhores como visto na Figura 22. Figura 22 - Campo Colocado na Parede (AUTORES, 2014) Após captura da imagem, começou-se a trabalhar com o streaming de câmera, por causa do requisito do problema que tem que ser em tempo real todo o processamento. 34 Metodologia 3.2. Calibração Mesmo com a imagem melhor, ainda era um problema as bordas fora do campo e qual a faixa das cores capturadas na hora em que realizava as binarizações, portanto foi fundamental a calibração da câmera no ambiente. Para isto seguimos o fluxo da Figura 23: Figura 23 - Passos para a calibração da câmera (AUTORES, 2014) Para tirar os ruídos ditos anteriormente utilizamos a técnica de região de interesse para apenas analisar a área do campo de futebol. Para facilitar a definição dos dois pontos da diagonal principal da região de interesse foi feito o tratamento de evento do mouse na janela e para facilitar a identificação da região, foram invertidos os valores das componentes RGB de cada pixel, negativando a área como visto na Figura 24. Figura 24 - Definição da Região de Interesse (AUTORES, 2014) Depois de selecionada a área onde será processada as informações, o passo seguinte da metodologia foi ver qual o valor do raio e das áreas mínimas de cada objeto em cena. Para conseguir esses parâmetros, foi utilizado o método dos momentos para saber a media das áreas dos robôs e da bola. 35 Metodologia Definidos esses parâmetros, deve-se configurar os limites das cores dos marcadores. Para isto foi criado uma janela com as barras de saturação, da matiz e do brilho onde observou-se qual era o melhor valor para cada cor, pois a regra da RoboCup exige que alguns marcadores sejam sorteados minutos antes das partidas. Assim, a calibração só pode ocorrer depois que os marcadores tenham sido sorteados pelo juís da partida. O melhor resultado seria os valores de HSV que filtrariam apenas a cor selecionada como na Figura 25 que foi filtrada apenas a cor laranja. Figura 25 - Calibração das cores dos marcadores (AUTORES, 2014) Após calibração de todas as cores, coloca-se na biblioteca de parâmetros a quantidade de robôs de cada equipe, quantos marcadores serão utilizados e quais as cores de cada tipo de robô. Foi implementado um padrão de identificação com cinco marcadores, atribuindo a classe do robô um vetor de marcadores com cinco elementos, que seria mais que suficiente para a identificação e rastreamento de cada robô, visto que apenas com dois já é possível ter o mesmo resultado e com menos processamento, porém com esta configuração pode-se testar os limites da abordagem proposta. 36 Metodologia 3.3. Processamento Depois do sistema ser calibrado, pode-se fazer o processamento da região de interesse e fazer a identificação dos robôs e da bola em tempo real. O fluxograma visto na Figura 26, demonstra o processo. Figura 26 - Fluxograma do processamento (AUTORES, 2014) Após a captura do frame, que é a imagem capturada do vídeo, e a filtragem da região, para a identificação dos objetos utilizou-se operações morfológicas e técnicas de processamento de imagem abordadas na fundamentação teórica, mas para isto foi seguido os seguintes passos: 1. Transformar o frame de RGB para HSV 2. Limiarizar pela cor para filtrar os robôs ou a bola 3. Erodir e dilatatar o frame para tirar os ruídos 4. Encontrar os contornos dos objetos filtrados com os conceitos de vizinhança e conectividade, analizar os pontos que são vizinhos e armazenar seu centro em um vetor 5. Utilizar o método dos momentos para a identificação se o contorno é um objeto 6. Armazenar as coordenadas do centro do objeto 7. Identificar se é bola ou robô e qual o tipo de robô 1. Pegar o ROI do objeto que será identificado 2. Repetir do passo 2 até o 6 para todos os marcadores 37 Metodologia 3. Se todos os marcadores forem identificados com o tipo do robô, atribui o nome dele, senão repete o passo 7.2 Inicialmente teve a conversão da imagem RGB para HSV para conseguir binarizar através de um valor mínimo e máximo os pontos de saturação, matiz e brilho. Estes valores foram encontrados na etapa de calibração onde para encontrar os robôs, colocou-se os valores de limiarização da cor preta e para encontrar a bola colocou-se a cor laranja. Com a imagem limiarizada, foi obtida uma imagem ainda com muitos ruídos e se avançasse para a próxima etapa de detectação de contornos, isso levaria muito mais tempo pois o número de contornos encontrados seria muito maior, portanto, aplicou-se as técnicas de erosão e dilatação na imagem para poder eliminar os pequenos ruídos. Com os contornos encontrados, foi utilizado o método estatístico dos momentos citado anteriormente e já implementado pela biblioteca do OpenCV, para poder calcular a área de cada objeto e identificar se é bola, robôs ou apenas ruídos de acordo com os parâmetros de área mínima definida. Logo em seguida, foi armazenado as coordenadas dos centros, já conseguindo distinguir entre robôs e bolas como visto na Figura 27: Figura 27 - Identificação dos objetos no campo (AUTORES, 2014) Depois de identificado os robôs, o próximo passo é classificá-los. Foram definidos os marcadores de cada tipo de robô no arquivo de configuração, colocando o nome da cor no vetor dos marcadores de cada equipe, podendo mudar facilmente a quantidade de marcadores, as cores e a quantidade de robôs por equipe. 38 Metodologia Utilizou-se cinco marcadores para analisar o caso de maior complexidade computacional, visto que na competição, com apenas dois marcadores já daria para classificar e rastrear os robôs. Para conseguir classificar o robô como atacante, zagueiro ou goleiro foi necessário calcular a região de interesse apenas do robô que foi detectado e logo em seguida analisar todos os marcadores com a mesma técnica de antes, porém apenas na ROI escolhida. Feito isto, encontram-se os cinco marcadores e consegue-se saber através da filtragem por cores quais são os cinco identificadores e comparou-se com as definições no arquivo de configuração. 3.4. Exibição das Informações Depois de classificado, a próxima etapa é colocar as informações processadas na imagem original. Como tem a informação do centro de cada objeto detectado, nas coordenadas das suas respectivas regiões de interesse, calculou-se onde ficará cada objeto no frame original e colocou-se a identificação, o número da equipe e as coordenadas x,y na imagem. Com estes dados poderia ser calculado em que lugar cada objeto estaria no campo de verdade, através de proporcionalidade. Para os testes, foram feitas duas equipes, uma na cor vermelha e outra na cor verde, definição essa vista no círculo central de cada robô, e cada equipe com dois atacantes, dois zagueiros e um goleiro cada. O padrão adotado foi o de colocar as rodas com cores iguais e cores diferentes para o marcador de equipe, o da frente e o de trás como visto na Figura 28. Figura 28 - Significado dos marcadores nos robôs (AUTORES, 2014) 39 Metodologia O resultado que obtido foi igual ao mostrado na Figura 29: Figura 29 - Reconhecimento dos robôs e da bola (AUTORES, 2014) Percebe-se na figura anterior que foi colocado propositalmente um marcador na cor preta, no lado esquedo da imagem, para verificar se o algoritmo que foi criado iria identificálo como robô, pois o marcador é da mesma cor, porém como o algoritmo também analiza a área do contorno com o método estatístico dos momentos, esta possibilidade tornou-se inexistente. 40 Resultados 4. Resultados Os testes obtiveram resultados expressivos tanto em relação ao tempo, como em relação a qualidade de detecção. Foram feitos testes de tempo de processamento para cada robô inserido no campo em uma máquina virtual com 2 Gb de RAM, 50 Gb de HD e 2 núcleis conseguimos a Tabela 2. Quantidade de Robôs Menor Tempo Maior Tempo Média de Tempo 1 0.0174139 0.0467508 0.0243215 2 0.0204348 0.0449992 0.0270491 3 0.0218374 0.0518048 0.0289997 4 0.0233299 0.0531306 0.0298047 5 0.0245468 0.056575 0.0315339 6 0.0297778 0.065182 0.0351073 7 0.0310514 0.0688607 0.0365691 8 0.0325722 0.0699962 0.0377235 9 0.0333919 0.0714980 0.0407741 10 0.0356618 0.0754286 0.0429745 Tabela 2 - Tempo de processamento em segundos Estes dados foram obtidos a cada mil ciclos de detecção de todos os objetos no campo, salvando o maior, menor e a média do tempo em segundos para detecção de robôs com cinco marcadores. O tempo mínimo e máximo variam muito de acordo com as mudanças de iluminação no campo e execução de outras aplicações no hospedeiro, entretanto, ao analizar a média de tempo, os dados obtidos foram os esperados, na qual aumentava-se o tempo médio ao colocar mais robôs no campo, como observado na Figura 30. 41 Resultados Figura 30 - Gráfico do tempo em segundos Vs Quantidade de robôs (AUTORES, 2014) Para cada robô inserido no campo o tempo médio subia aproximadamente em 2ms, resultando no gráfico mostrado. Vale ressaltar que no momento das coletas de dados, não houveram alterações nas configurações da máquina virtual, portanto, os resultados podem melhorar mais ao colocarmos mais recursos de processamento na mesma ou colocando o sistema na máquina hospedeira. 42 Conclusões e trabalhos futuros 5. Conclusões e trabalhos futuros Vimos que esta área está repleta de desafios e que os problemas encontrados para o desenvolvimento das técnicas é natural pois exige uma maturidade muito grande do programador nos conceitos e na linguagem de programação escolhida. Mesmo com muitos problemas de infra estrutura, conseguimos implementar um algoritmo que alcançou os objetivos iniciais de detecção dos agentes em campo e que fosse em tempo real. Os resultados obtidos foram muito bons pois tivemos que encontrar soluções para melhorar a qualidade da imagem adquirida, calibrar a câmera e utilizamos um número de marcadores e robôs superiores ao necessário em uma partida de futebol no qual mesmo assim ainda resultou em um tempo de detecção em média menor do que 45ms como visto na tabela de resultados, tornando totalmente viável a aplicação em uma competição, onde as equipes que trabalhavam nessa área obtiveram resultados parecidos. Como trabalhos futuros, seria muito bom para a continuação deste trabalho adquirir as câmeras para podermos utilizar o software recomendado SSL-Vision e preparar um ambiente com as reais dimensões do campo e com uma boa qualidade de iluminação para diminuir os ruídos nas imagens. Também seria importante testar o código desenvolvido em uma máquina real, com um processador de última geração e com mais RAM para coletar mais dados e analizar se há necessidade de trabalhar com placas de aceleração gráfica. Implementar outras técnicas de detecção e reconhecimento e comparar com os resultados das outras equipes como as que envolvem descritores mais sofisticados ou com aprendizagem de máquina como em (JÜNGEL; HOFFMANN;.LÖTZSCH, 2004) (SIMÕES; COSTA, 2001) (ARAUJO; MENDONÇA; FREIRE, 2004) (RILLO, 1989) (NUNES; PRADO, 2002) (DUARTE, 2003) (HOFFMAN; D.SILVA, 2004). Poderia também testar o algoritmo desenvolvido no trabalho com variação de iluminação e no SSL-Vision para analisar o desempenho em comparação com as técnicas que já vem por padrão no software. A contribuição mais relevante para o projeto, seria desenvolver o hardware dos robôs, a parte de comunicação e de estratégia de movimentação para poder juntar com a parte de visão e competir na próxima RoboCup com um time multidisciplinar de futebol do IFPE. 43 Bibliografia 6. Bibliografia ABOUT the Small Size League, 2008. Disponivel em: <http://robocupssl.cpe.ku.ac.th>. Acesso em: Abril 2014. AIRES, K. R. T.; ALSINA, P. J.; MEDEIROS, A. A. D. A global vision system for mobile mini-robots. SBAI Simpósio Brasileiro de Automaçãao Inteligente, 2001. ANDRADE, B. T.; MATOS, L. N.; FREIRE, E. O. Um Sistema de Visão Computacional para Robôs Móveis. XXVI Congresso da SBC, 2006. ARAUJO, G. M.; MENDONÇA, M. M.; FREIRE, E. O. RECONHECIMENTO AUTOMÁTICO DE OBJETOS BASEADO EM COR E FORMA PARA APLICAÇÕES EM ROBÓTICA, 2004. ASSIS, W. O. et al. Desenvolvimento de Robôs Autônomos para Participação em Competição de Futebol. VII SBAI/ II IEEE LARS , Setembro 2005. BALLARD, D.; BROWN, C. Computer Vision. Englewood Cliffs: Prentice-Hall, 1982. BASSO, E. W. Identificação Visual de Posição e Movimento para Futebol de Robôs. Trabalho de Conclusão de Curso, Universidade Luterana do Brasil, 2002. BECKER, M. Aplicação de tecnologias assistivas e tecnicas de controle em cadeiras de rodas inteligentes, 2000. BIANCHI, A. D. C. VISÃO COMPUTACIONAL APLICADA AO CONTROLE DE MICRO ROBÔS. [S.l.]. 2001. BIANCHI, R. A.; REALI-COSTA, A. H. O Sistema de Visão Computacional do time FUTEPOLI de Futebol de Robôs. Congresso Brasileiro de Automática, 2000. Vol. 130, pp. 2156-2162. BLOGDACOPA. Projeto Andar Denovo, 2014. Disponivel em: <http://goo.gl/SlnOh9>. Acesso em: Maio 2014. BRADSKI, G. R.; KAUHLER, A. Learning OpenCV: Computer Vision with the OpenCV Library. Famham: O'Reilly, 2013. BRUCE, J.; BALCH, T.; VELOSO, M. Fast and inexpensive color image segmentation for interactive robots. Intelligent Robots and Systems IEEE/RSJ International Conference. [S.l.]: IEEE. 2000. p. Vol. 3, pp. 2061-2066. 44 Bibliografia BURKHARD, H. D. et al. The road to RoboCup 2050. Robotics & Automation Magazine, 2002. 31-38. CARDANI, D. Adventures in HSV Space, 2004. Disponivel em: <http://www.buena.com/articles/hsvspace.pdf>. Acesso em: Abril 2004. CASSADIO, M. et al. Body machine interface: Remapping motor skills after spina cord injury. IEEE International Conference on Rehabilitation Robotics (ICORR), July 2011. 1-6. CORAL, C. M. U. Small Size Team. Carnegie Mellon University robot soccer CORAL research group, 2010. Disponivel em: <http://goo.gl/f7elQ4>. Acesso em: Maio 2014. COSTA, A. H. R.; PEGORARO, R. Construindo robôs autônomos para partidas de futebol: o time GUARANÁ. SBA Controle & Automação, 2000. 141-149. DALBEM, C. M. RoboPET - arquitetura e desenvolvimento de um time autônomo de futebol de robôs. Salão de Iniciação Científica, 22 Outubro 2010. 18-22. DIGPLANET, 2014. Disponivel em: <http://www.digplanet.com/wiki/RoboCup_2D_Soccer_Simulation_League>. Acesso em: 2014. DR. Rui Costa. Página do Facebook, 2013. Disponivel em: <http://goo.gl/3sDjeI>. Acesso em: Janeiro 2014. DUARTE, G. D. Uso da Transformada de Hough na Detecção de Círculos em Imagens Digitais. Revista Científica do Centro Federal de Educação Tecnológica, p. 51-58, 2003. FILHO, O. M.; NETO, H. V. Procesamento Digital de Imagens. Rio de Janeiro: Brasport, 1999. FIND-OBJECT , 2012. Disponivel em: <https://code.google.com/p/find-object/>. Acesso em: 2014. FIRA. Small League Mirosot Game Rules, 2014. Disponivel em: <http://www.fira.net/soccer/mirosot/overview.html>. Acesso em: Janeiro 2014. GARCIA, R. F. et al. Um arcabouço para a localização de enxames de robôs. Anais do Simpósio Brasileiro de Automação Inteligente, 2007. GONZALES, R. C.; RICHARD, E. W. Processamento de Imagens Digitais. São Paulo: Edgard Blucher, 2000. GRITTANI, G.; G.GALLINELLI; RAMŕEZ, J. Futbot: A vision system for robotic soccer. Advances in Artificial Intelligence Springer Berlin Heidelberg, 2000. 350-358. 45 Bibliografia HOFFMAN, L. T.; D.SILVA, J. Um sistema de visão robótica baseada em aprendizagem por reforço. INPE Programa de Pós-gradução em Computação Aplicada, 2004. HU, M. K. Visual pattern recognition by moment invariants. Information Theory, 1962. 179-187. IAUBS. IAUBS Robot Team, 2010. Disponivel em: <http://www.iaubsroboteam.blogfa.com/>. Acesso em: 2014. IBRO. Visão humana, International Brain Research Organization, 2014. Disponivel em: <http://goo.gl/0X93ol>. Acesso em: Janeiro 2014. IGREBOT, 2014. Disponivel em: <http://wiki.igrebot.fr/images/0/0c/Slides.pdf>. Acesso em: 2014. INTEL. Open Source Computer Vision Library Reference Manual. Intel Corporation. Open Source Computer Vision Library Reference Manual, 2000. Disponivel em: <http://developer.intel.com>. JÄHNE, B. Digital Image Processing: Concepts, Algorithms, and Scientific Applications. Berlin: Springer-Verlag, 1991. JÜNGEL, M.; HOFFMANN, J.;.LÖTZSCH, M. A real-time auto-adjusting vision system for robotic soccer. RoboCup 2003: Robot Soccer World Cup VII Springer Berlin Heidelberg, 2004. 214-225. KAICK, O. M. V. et al. Identificacao e Rastreamento em Tempo Real de Multiplos Agentes Autonomos, 2001. KITANO, H. et al. RoboCup: A challenge problem for AI. AI magazine, p. 73, 1997. LAB, C.-S. A. C. R. Small Size robot, 2008. Disponivel em: <http://goo.gl/oPPqh0>. LABBÉ, M. Find-Object Project, 2012. Disponivel em: <https://code.google.com/p/find-object/>. LEFEO. Olho humano, Laboratório de Espectrofotometria e Ensino de Óptica, 2014. Disponivel em: <http://goo.gl/vZUjQW>. MARTINEZ-GOMEZ, L. A.; WEITZENFELD, A. Real Time Vision System for a Small Size League Team. 1st IEEE-RAS Latin American Robotics Symposium, October 2004. 28-29. MARTINS, M. F.; TONIDANDEL, F.; BIANCHI, R. A. Reconhecimento de Objetos em Tempo Real para Futebol de Robôs. Anais do XXVI Congresso da Sociedade Brasileira de Computação, 2006. 173-182. 46 Bibliografia MCMAHAN, W.; BUNTING, J.; MIDDLETON, R. Robocup Vision Processing Background, 2014. Disponivel em: <http://murray.newcastle.edu.au/users/students/2002/c3012299/bg.html>. Acesso em: Abril 2014. MÉDICO de Olhos. Buraco macular: o que é e como tratar, 2011. Disponivel em: <http://www.medicodeolhos.com.br/2011/08/buraco-macular-o-que-e-e-como-tratar.html>. Acesso em: Janeiro 2014. MEHL, E. L. D. M. et al. FUTEBOL DE ROBÔS" COMO FERRAMENTA TECNOLÓGICA PARA O ENSINO DE ENGENHARIA ELÉTRICA E CIÊNCIA DA COMPUTAÇÃO. [S.l.]. 2001. MOREIRA, A. L. S.; VASCONCELOS, F. N. O. Uso de Robótica Assistiva no Auxílio de Pessoas com Deficiências Visuais. V CONNEPI, 2010. NASA, J. P. L. Mars Exploration Rover Mission: Home. Mars Exploration Rover Mission, Julho 2004. Disponivel em: <http://marsrovers.jpl.nasa.gov/home/index.html>. NEVES, R. S. D.; TADDEI, L.; BANDEIRA, I. Visao Computacional e Estrategias de Controle Aplicadas ao Futebol de Robos. XIX Congresso Regional de Iniciação Científica e Tecnológica em Engenharia – CRICTE, 2004. NEXUS. NEXUS RoboCup Soccer Simulation Team, 2009. Disponivel em: <http://nexus.um.ac.ir/>. Acesso em: 2014. NICOLELIS. Mind-controlled prostheses offer hope for disabled. the Washington Post, Abril 2014. Disponivel em: <http://www.washingtonpost.com/national/health-science/mind-controlledprostheses-offer-hope-for-disabled/2013/05/03/fbc1018a-8778-11e2-98a3b3db6b9ac586_story.html>. NIPPON, 2012. Disponivel em: <http://www.nippon.com/ja/views/b00908/>. Acesso em: 2014. NUNES, L. E. N. P.; PRADO, P. P. L. Reconhecimento de Objetos contidos em imagens atraves de Redes Neurais. Revista Ciencias Exatas, 2002. PENHARBEL, E. A. et al. Filtro de imagem baseado em matriz RGB de cores padrao para futebol de robos. I Encontro de Robotica Inteligente, 2004. PERCRO. Perceptual Robotics Laboratory, 2014. Disponivel em: <http://www.percro.org/>. PEREZ, A. L. F. et al. Desenvolvimento de Robos para Jogos de Futebol de Robos. Revista Técnico Científica do IFSC, p. 53, 2012. 47 Bibliografia PODCASTS, H. T. R. SWITCH TO 24 BIT AUDIO IN WINDOWS [HOW TO], Maio 2014. Disponivel em: <http://www.howtorecordpodcasts.com/switch-24-bit-audio-windows-how-to/>. Acesso em: Maio 2014. PYFACEDETECT. Brainacle, 2010. Disponivel em: <http://brainacle.com/tag/face-detection.html>. Acesso em: 2014. RIA. Robotic Industries Association. Disponivel em: <www.robotics.org>. Acesso em: Agosto 2014. RILLO, A. H. R. C. Sistema de Visao Binaria com Reconhecimento de Pecas Parcialmente Oclusas. Dissertacao de mestrado - Faculdade de Engenharia Industrial de Sao Bernardo do Campo, 1989. RUDEK, M.; COELHO, L. D. S.; CANCIGLIERI, O. Visao Computacional Aplicada a Sistemas Produtivos: Fundamentos e Estudo de Caso. XXI Encontro Nacional de Engenharia de Producao, 2001. SCHOUTE, A.; POEL, M.; HEIJDEN, I. F. The development of a vision system for robotic soccer. [S.l.]: [s.n.], 2003. SCHWARTZ, W. et al. Reconhecimento em tempo real de agentes autônomos em futebol de robôs. VI Simpósio Brasileiro de Automaçao Inteligente-SBAI., 2003. SILVA, J. A. et al. Comparaçao de descritores de formas no reconhecimento de objetos. III Workshop de Visao Computacional, Outubro 2007. SIMÕES, A. S.; COSTA, A. H. R. Classificação de cores por redes neurais artificiais: um estudo do uso de diferentes sistemas de representação de cores no futebol de robôs móveis autônomos. Encontro Nacional de Inteligência Artificial / XXI Congresso da Sociedade Brasileira de Computação, 2001. 182. SIMONE, M. et al. Body Extender: whole body exoskeleton for exoskeleton for human power augmentation. IEEE Intenational Conference on Robotics and Automation, 2011. SOUSA, B. M.; PINTO, L. S.; PINTO, R. S. Estudo sobre o SSL-VISION. São João Del Rei: Universidade Federal de São João Del Rei - UFSJ, 2010. SOUZA, K. P.; PISTORI, H. Implementação de um extrator de características baseado em momentos da imagem. XVIII Brazilian Symposium on Computer Graphics and Image Processing-SIBGRAPI, Outubro 2005. SSL VISION. SSL Vision Project, 2010. Disponivel em: <https://code.google.com/p/sslvision/wiki/ApplicationOverview>. Acesso em: 2014. 48 Bibliografia TECHNO , 2011. Disponivel em: <http://techno.bigmir.net/technology/1510235-Chempionat-mirapo-futbolu-sredi-robotov-projdet-v-Turcii>. Acesso em: 2014. THRESHOLDING and the Region of Interest. Thresholding and the Region of Interest, 11 Maio 2014. Disponivel em: <http://microscopy.berkeley.edu/courses/dib/sections/03IPII/ROI.html>. WIKIPÉDIA. Convolução - Wikipédia, a enciclopédia livre. Wikipédia, a enciclopédia livre, 2014. Disponivel em: <http://pt.wikipedia.org/wiki/Convolu%C3%A7%C3%A3o#Convolu.C3.A7.C3.A3o_discreta>. Acesso em: abr. 2014. YASUTOMI, A. Y.; MIRANDA, A. B. W. Exoesqueleto Robótico de Membro Superior para Estudo do Controle Motor Humano. Monografia de Conclusão de Curso, Escola Politécnica da USP, 2011. ZEISS. Education in Microscopy and Digital Imaging, 2014. Disponivel em: <http://goo.gl/LqYdJO>. Acesso em: Abril 2014. ZICKLER, S. et al. SSL-vision: The shared vision system for the RoboCup Small Size League. RoboCup 2009: Robot Soccer World Cup XIII Springer Berlin Heidelberg. , 2010. 425-436. 49 Apêndices 7. Apêndices 7.1. Apêndice 1 - Instalação do OpenCV Para instalar o OpenCV no Ubuntu é preciso executar o terminal e instalar os pacotes essenciais de compilação como o g++ e o cmake com o seguinte comando: sudo apt-get install build-essential checkinstall cdbs devscripts dh-make fakeroot libxmlparser-perl check avahi-daemon -y Após instalado os pacotes essenciais, é necessário instalar os pacotes que serão necessários para compilar um projeto com o OpenCV com os seguinte comando: sudo apt-get install build-essential checkinstall git cmake ffmpeg libfaac-dev libjack-jackd2dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheoradev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev texi2html yasm zlib1g-dev libtbb-dev libv4l-dev libopenexr-dev libunicap2-dev libavformat-dev libswscale-dev libdc1394-22-dev libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-pluginsgood gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg pythonnumpy && sudo apt-get install libcv2.3 libcv-dev libhighgui2.3 libhighgui-dev libopencv-* -y Outra maneira de instalar seria adicionando o repositório gijzelaar/opencv2.4, atualizando e instalando o com os comando abaixo: sudo add-apt-repository ppa:gijzelaar/opencv2.4 -y && sudo apt-get update sudo apt-get install libopencv-dev opencv-doc -y Após a instalação destes pacotes, o Ubuntu estará apto para rodar os algoritmos e exemplos. Se quiser, é possível também compilar o código fonte e construir apenas os módulos necessários, mas para isto será necessário seguir os passos do site6 onde também poderá ser encontrado os passos para a instalação no Windows.7 6 7 Instalação do OpenCV no Linux - Disponível em: http://goo.gl/dzuqWM Instalação do OpenCV no Windows -Disponível em: http://goo.gl/cVUt1s 50 Apêndices 7.2. Apêndice 2 - Configurar o Eclipse, NetBeans e Qt Studio Inicialmente foi usado o ambiente Eclipse8 pois atende uma das especificações do projeto, que é seguir o padrão open-source. É uma IDE implementada em Java e uma das mais utilizadas em todo mundo. Mesmo sendo implementada em Java, através de plugins pode-se criar projetos em PHP, Python e C/C++, por exemplo. Para implementação dos códigos do OpenCV foi utlizado o Eclipse CDT, ambiente de desenvolvimento voltado para implementação em C/C++. Com os repositórios do Ubuntu, os pacotes necessários foram instalados e a configuração é mostrado em seguida. Foi configurado também a IDE NetBeans9 pois é muito utilizada também pelos desenvolvedores e mais fácil de criar interfaces gráficas, o que não acontece no Eclipse, onde não foi encontrado uma maneira de desenvolver uma GUI em C++. 7.2.1. Eclipse ● Crie um projeto C/C++ (com o Eclipse CDT ou Eclipse tradicional com os plugins configurado para poder compilar projetos em C/C++). ● Nas propriedades do projeto, clique em “C/C++ Build” e depois em “Settings”. ● Em “Tool Settings” vá em “GCC C++ Compiler” e na opção de “Directories” insira os paths do OpenCV. ● Depois vá em GCC C++ Linker e na parte de Libraries adicione na lista as ”libraries” e o “library search path”. 7.2.2. NetBeans ● Crie um novo projeto C/C++, clique com o botão direito no projeto e acesse a opção de Propriedades. 8 9 Eclipse IDE - http://www.eclipse.org/ NetBeans IDE - https://netbeans.org/ 51 Apêndices ● Em “Build”, clique em “C++ Compiler” e adicione os diretórios na lista em “Include Directories”. ● Depois vá na opção de “Linker do Build” e adicione as bibliotecas abaixo: ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ libopencv_calib3d.so libopencv_contrib.so libopencv_core.so libopencv_features2d.so libopencv_flann.so libopencv_gpu.so libopencv_highgui.so libopencv_imgproc.so libopencv_legacy.so libopencv_ml.so libopencv_objdetect.so libopencv_video.so Porém com andamento do trabalho, foi visto que seria necessária a implementação futura de uma interface gráfica e não foi encontrado muitos plugins que facilitem a manipulação de interface gráfica em C++. O que não ocorre quando o projeto é desenvolvido em Java, no qual tanto no NetBeans quanto no Eclipse existem vários plugins onde é possível desenvolver facilmente interfaces bem acabadas. Esse fator foi de suma importância para mudarmos para o QtStudio. 7.2.3. Qt Studio O Qt é um framework para desenvolvimento em C++ multiplataforma. Ele permite desenvolver aplicativos e bibliotecas e compilá-los para diversas plataformas sem que seja necessário alterar o código. Essa facilidade oferecida pela ferramenta pesou positivamente para mudança de IDE do projeto. Basicamente o Qt resolveu a maior parte das dificuldades encontradas durante a utilização do Eclipse e do NetBeans, além de uma melhor usabilidade, a implementação de uma interface gráfica no QtStudio apresentou ser mais prática, tornando uma ferramenta poderosa para o estudo da visão computacional. A instalação do QtStudio e sua integração com OpenCV também poderá ser encontrada abaixo. Como foi utilizado o Qt no trabalho, vamos detalhar um pouco mais a configuração do mesmo. Para instalar basta colocar no terminal os comandos abaixo: 52 Apêndices sudo apt-add-repository ppa:ubuntu-sdk-team/ppa -y && sudo apt-get update sudo apt-get install qtdeclarative5-dev qtdeclarative5-dev-tools qtbase5-* cmake kdelibs5data ubuntu-sdk qtquick1-5-dev -y Com tudo instalado corretamente, é preciso configurar um projeto no Qt Creator que rode um exemplo do OpenCV. Para isto, vá em: “File” escolha “New file or project”, clique em “Qt Widget Project” logo em seguida “Qt GUI Application” e por fim “Choose”. Abra o arquivo .pro e cole o path e as bibliotecas abaixo e salve. INCLUDEPATH += /usr/local/include/opencv INCLUDEPATH += /usr/local/include/opencv2 LIBS += -L/usr/local/lib LIBS += -lopencv_core LIBS += -lopencv_imgproc LIBS += -lopencv_highgui LIBS += -lopencv_ml LIBS += -lopencv_video LIBS += -lopencv_features2d LIBS += -lopencv_calib3d LIBS += -lopencv_objdetect LIBS += -lopencv_contrib LIBS += -lopencv_legacy LIBS += -lopencv_flann Agora abra o arquivo .ui clique e arraste um botão para a janela. Mude seu atributo “objectName” para btnDisplay e seu atributo “text” para Display. Em seguida, clique com o botão direito e escolha “Go to Slot” e logo em seguida “clicked()”. Figura 31 - Criando um exemplo no Qt Studio (AUTORES, 2014) 53 Apêndices Coloque o código abaixo dentro da função do evento: 1. 2. 3. 4. 5. 6. 7. 8. cv::namedWindow("Display"); cv::VideoCapture cap(0); cv::Mat frame; do{ cap >> frame; imshow("Display",frame); }while(cv::waitKey(30)<0) cv::destroyAllWindows(); Não esquecendo de incluir as bibliotecas “core” e “highgui”. O resultado será uma janela mostrando sua câmera quando o botão for clicado. Figura 32 - Qt Studio configurado com o OpenCV (AUTORES, 2014) Depois de instalado o OpenCV, agora pode-se configurar um projeto C/C++ e aproveitar todas as vntagens do IDE em um projeto de visão computacional. Depois de muita pesquisa e testes10, integramos o OpenCV nos ambientes. 10 Todos os tutoriais encontram-se no site www.nerix.org 54 Apêndices 7.3. Apêndice 3 – Código-Fonte do Trabalho Aqui disponibilizamos o código fonte sobre a licensa GPLv311 desenvolvido durante o trabalho. Como dito anteriormente na metodologia, não desenvolvemos uma interface melhor pelo fato de já existir o SSL-Vision com este propósito, aqui focamos mais no algoritmo necessário de detecção e em alguns pontos importantes da calibração da câmera mencionados no trabalho. 7.3.1. tcc.pro 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = tcc TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ Robo.cpp \ Bola.cpp \ Marcador.cpp \ Objeto.cpp HEADERS += mainwindow.h \ Robo.h \ Bola.h \ Marcador.h \ Objeto.h \ Parametros.h FORMS += mainwindow.ui INCLUDEPATH += /usr/include/opencv INCLUDEPATH += /usr/include/opencv2 LIBS += -L/usr/lib LIBS += -lopencv_core LIBS += -lopencv_imgproc LIBS += -lopencv_highgui LIBS += -lopencv_ml LIBS += -lopencv_video LIBS += -lopencv_features2d LIBS += -lopencv_calib3d LIBS += -lopencv_objdetect LIBS += -lopencv_contrib LIBS += -lopencv_legacy LIBS += -lopencv_flann 7.3.2. main.cpp 11 Para saber mais sobre a licensa visite: www.gnu.org/licenses/gpl.html 55 Apêndices 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. #include "mainwindow.h" #include <sstream> #include <string> #include <iostream> #include <QApplication> #include "Robo.h" #include "Bola.h" #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #define BILLION 1000000000L; 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. const bool MODO_CALIBRACAO_AREA = false; cv::Point CALIBRACAO_PONTO1(77,33);//valores iniciais para o ponto 1 cv::Point CALIBRACAO_PONTO2(594,463);//valores iniciais para o ponto 2 const bool MODO_CALIBRACAO = false; //valores iniciais dos filtros minimo e maximo HSV //eles serao mudados usando as barras de rolagem int H_MIN = 0; int H_MAX = 180; //valor maximo para matiz que no opencv nao eh 360 graus int S_MIN = 0; int S_MAX = 255; //valor maximo para a saturaçao int V_MIN = 0; int V_MAX = 255; //valor maximo para o brilho 25. 26. 27. 47. 48. 49. void funcaoCallBackMouse(int event, int x, int y, int flags, void* userdata){ if ( event == EVENT_LBUTTONDOWN ) { cout << "Ponto1(" << CALIBRACAO_PONTO1.x << "," << CALIBRACAO_PONTO1.y << ") Ponto2(" << CALIBRACAO_PONTO2.x << "," << CALIBRACAO_PONTO2.y << ") "; cout << "Botao esquerdo do mouse foi clicado - posicao (" << x << ", " << y << ")" << endl; if (x >= CALIBRACAO_PONTO2.x || y >= CALIBRACAO_PONTO2.y){ cout << "Reposicione o ponto 1!" << endl; } else { CALIBRACAO_PONTO1 = Point (x,y); } }else if ( event == EVENT_RBUTTONDOWN ) { cout << "Ponto1(" << CALIBRACAO_PONTO1.x << "," << CALIBRACAO_PONTO1.y <<") Ponto2(" << CALIBRACAO_PONTO2.x << "," << CALIBRACAO_PONTO2.y << ") "; cout << "Botao direito do mouse foi clicado - posicao (" << x << ", " << y << ")" << endl; if (CALIBRACAO_PONTO1.x >= x || CALIBRACAO_PONTO1.y >= y){ cout << "reposicione o ponto 2!" << endl; } else { CALIBRACAO_PONTO2 = Point (x,y); } } else if ( event == EVENT_MBUTTONDOWN ) { cout << "Ponto1(" << CALIBRACAO_PONTO1.x << "," << CALIBRACAO_PONTO1.y << ") Ponto2(" << CALIBRACAO_PONTO2.x << "," << CALIBRACAO_PONTO2.y << ") "; cout<<"Botao scroll do mouse foi clicado - posicao ("<<x <<", "<< y << ")" << endl; } else if ( event == EVENT_MOUSEMOVE ) { cout << "Ponto1(" << CALIBRACAO_PONTO1.x << "," << CALIBRACAO_PONTO1.y << ") Ponto2(" << CALIBRACAO_PONTO2.x << "," << CALIBRACAO_PONTO2.y << ") "; cout<<"Mouse se movimentando na janela - posicao ("<< x << ", "<< y<< ")"<< endl; } } 50. 51. void on_trackbar( int , void * ){ //Esta funçao eh chamada nao importa 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 56 Apêndices //se a posicao da barra de rolagem foi mudada 52. 53. } 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. void criarBarras(){ //cria uma janela para as barras de rolagem namedWindow(nomeJanelaBarras,0); //cria memoria para armazenar os nomes das barras na janela char TrackbarName[50]; sprintf( TrackbarName, "H_MIN", H_MIN); sprintf( TrackbarName, "H_MAX", H_MAX); sprintf( TrackbarName, "S_MIN", S_MIN); sprintf( TrackbarName, "S_MAX", S_MAX); sprintf( TrackbarName, "V_MIN", V_MIN); sprintf( TrackbarName, "V_MAX", V_MAX); //cria as barras e insere elas na janlea //3 parametros: o endereco da variavel que esta mudando quando a barra eh movida, //o valor maximo que a barra pode mover, //e a funcao que eh chamada onde nao importa se a barra eh movimentada createTrackbar( "H_MIN", nomeJanelaBarras, &H_MIN, H_MAX, on_trackbar ); createTrackbar( "H_MAX", nomeJanelaBarras, &H_MAX, H_MAX, on_trackbar ); createTrackbar( "S_MIN", nomeJanelaBarras, &S_MIN, S_MAX, on_trackbar ); createTrackbar( "S_MAX", nomeJanelaBarras, &S_MAX, S_MAX, on_trackbar ); createTrackbar( "V_MIN", nomeJanelaBarras, &V_MIN, V_MAX, on_trackbar ); createTrackbar( "V_MAX", nomeJanelaBarras, &V_MAX, V_MAX, on_trackbar ); } 76. 77. 78. 79. void desenhaPontosCalibracao(Mat &frame, Point ponto1, Point ponto2){ cv::circle(frame,ponto1,5, cv:: Scalar (0,0,255)); cv::circle(frame,ponto2,5, cv:: Scalar (255,0,0)); } 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. void operacoesMorfologicas(Mat &limiar){ //cria elementos estruturantes que serao usados para dilataçao e erosao da imagem. //o elemento escolinho aqui eh um retangulo de 1px por 1px Mat elementoErosao = getStructuringElement( MORPH_RECT,Size(1,1)); //dilata com um elemento de maior largura para deixar o objeto mais visivel Mat elementoDilatacao = getStructuringElement(MORPH_RECT,Size(3,3)); erode(limiar,limiar,elementoErosao); erode(limiar,limiar,elementoErosao); dilate(limiar,limiar,elementoDilatacao); dilate(limiar,limiar,elementoDilatacao); } void rastrearObjetosFiltrados(Objeto objeto, Mat limiar, Mat &sementeCamera){ vector <Objeto> objetos; Mat temp; limiar.copyTo(temp); //estes dois vetores sao necessarios para encontrar os contornos vector < vector < Point > > contours; vector <Vec4i> hierarchy; //encontrar os contornos do imagem filtrada findContours(temp, contours, hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE); //usa o metodo dos momentos para encontrar o objeto filtrado if (hierarchy.size() > 0) { int numObjects = hierarchy.size(); //se o numero de objetos for maior que than NUM_MAX_OBJETOS entao eh porque tem muito ruido no filtro selecionado 104. if (numObjects<NUM_MAX_OBJETOS){ 105. for (int index = 0; index >= 0; index = hierarchy[index][0]) { 106. Moments moment = moments((cv:: Mat)contours[index]); 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 57 Apêndices double area = moment.m00; //se a area é menor que 20 px por 20px entao provavelmente é apenas um 107. 108. ruido 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. //se a area é a mesma que 3/2 do tamanho da imagem, provavelmente é apenas um filtro mal escolhido //nós apenas queremos o objeto com a maior área então nos comparamos a area de cada objeto encontrado //iteração e comparação da area if (area>objeto.getAreaMinima()){ Objeto *obj; if (objeto.getType()=="bola"){ obj = new Bola(); } else if (objeto.getType()=="marcador"){ obj = new Marcador(); } else { obj = new Robo(); } obj->setXPos(moment.m10/area); obj->setYPos(moment.m01/area); obj->setType(objeto.getType()); obj->setColour(objeto.getColour()); objetos.push_back(*obj); if (!MODO_CALIBRACAO && objeto.getType()=="robo"){ obj->ident if icar(sementeCamera); } obj->desenhar(sementeCamera); delete obj; } } //fim for } else { putText(sementeCamera,"Muito ruido!! Ajuste o filtro!", Point (0,50), 1, 2, Scalar (0,0,255), 2); } } 143. 144. 145. 146. 147. 148. 149. 150. 151. void detectarObjeto(Objeto obj, Mat sementeCamera){ Mat limiar; Mat HSV; cvtColor(sementeCamera,HSV,COLOR_BGR2HSV); if (MODO_CALIBRACAO){ inRange(HSV, Scalar (H_MIN, S_MIN, V_MIN), Scalar (H_MAX, S_MAX, V_MAX), limiar); } else { inRange(HSV,obj.getHSVmin(),obj.getHSVmax(),limiar); } operacoesMorfologicas(limiar); rastrearObjetosFiltrados(obj,limiar,sementeCamera); if (MODO_CALIBRACAO){ imshow(nomeJanela2,limiar); } } 152. 153. 154. 155. 156. 157. 158. 159. int deteccaoHSV(IplImage *frame){ //Matriz para armazenar cada frame da camera Mat sementeCamera(frame); if (MODO_CALIBRACAO){ //cria as barras para os fltros HSV criarBarras(); Marcador marcador; detectarObjeto(marcador,sementeCamera); 137. 138. 139. 140. 141. 142. 58 Apêndices } else { Robo robo; detectarObjeto(robo,sementeCamera); Bola bola; detectarObjeto(bola,sementeCamera); } return 0; 160. 161. 162. 163. 164. 165. 166. 167. } 168. double maiorTempo=0, menorTempo=10000, media=0, contador=0, soma = 0; 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. void medeTempoFuncaoDeteccaoHSV(IplImage *frame){ struct timespec start, stop; double accum; if ( clock_gettime( CLOCK_REALTIME, &start) == -1 ) { perror( "clock gettime" ); } //system( argv[1] ); deteccaoHSV(frame); if ( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) { perror( "clock gettime" ); } accum = ( stop.tv_sec - start.tv_sec )+ (double)( stop.tv_nsec - start.tv_nsec ) / (double)BILLION; contador++; soma += accum; menorTempo = accum < menorTempo ? accum : menorTempo; maiorTempo = accum > maiorTempo ? accum : maiorTempo; media = soma/contador; cout << contador<<" - "<<accum <<" - maior: "<< maiorTempo<<" - menor: "<< menorTempo<<" - media: "<<media<<endl; } 181. 182. 183. 184. 185. 186. 187. 188. int main(int argc, char *argv[]){ IplImage *frame = 0; CvCapture *capture = 0; int key = 0; // inicializa a camera capture = cvCaptureFromCAM( 1 ); // Tenta setar a resoluço da camera para 800 x 600. cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 800); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 600); // cria uma janela para o video cvNamedWindow( "Resultado", CV_WINDOW_AUTOSIZE ); while ( key != 'q' ) { // pega o frame frame = cvQueryFrame( capture ); // sempre verifica se existe um frame if ( !frame ) break; int largura = CALIBRACAO_PONTO2.x - CALIBRACAO_PONTO1.x; int altura = CALIBRACAO_PONTO2.y - CALIBRACAO_PONTO1.y; if (MODO_CALIBRACAO_AREA){ do{ //atribui a chamada de funçao para tratar os eventos do mouse setMouseCallback("Resultado", funcaoCallBackMouse, NULL); Mat tmp(frame); //desenhar o ponto 1 e 2 neste frame temporario desenhaPontosCalibracao(tmp, CALIBRACAO_PONTO1, CALIBRACAO_PONTO2); 213. }while(CALIBRACAO_PONTO1.x >= CALIBRACAO_PONTO2.x || CALIBRACAO_PONTO1.y >= CALIBRACAO_PONTO2.y); 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 59 Apêndices 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. /* seta a regiao de interesse (ROI) da imagem*/ cvSetImageROI(frame, cvRect(CALIBRACAO_PONTO1.x, CALIBRACAO_PONTO1.y, largura, altura)); //inverte a regiao de interesse para ficar mais facil de ver a regiao selecionada cvNot(frame,frame); } else { /* seta a regiao de interesse (ROI) da imagem*/ cvSetImageROI(frame, cvRect(CALIBRACAO_PONTO1.x, CALIBRACAO_PONTO1.y, largura, altura)); medeTempoFuncaoDeteccaoHSV(frame); } IplImage *img2 = cvCreateImage(cvGetSize(frame), frame->depth, frame-> nChannels); // copia a sub imagem cvCopy(frame, img2, NULL); // sempre reseta a region de interesse cvResetImageROI(frame); // mostra o frame atual cvShowImage( "Resultado", frame ); // sai se o usuario digitar ‘q’ key = cvWaitKey( 1 ); cvReleaseImage(&img2); } return 0; } 7.3.3. mainwindow.ui 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralWidget"/> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>25</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> 60 Apêndices 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui> 7.3.4. mainwindow.h 1. 2. 3. #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. namespace Ui { class MainWindow; } class MainWindow : public QMainWindow{ Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H 7.3.5. mainwindow.cpp 1. 2. #include "mainwindow.h" #include "ui_mainwindow.h" 3. 4. 5. MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); } 6. 7. 8. MainWindow::~MainWindow(){ delete ui; } 7.3.6. Objeto.h 61 Apêndices 1. 2. 3. 4. 5. 6. #pragma once #include <string> #include "opencv2/core/core.hpp" #include "opencv/cv.hpp" #include "opencv2/highgui/highgui.hpp" #include "Parametros.h" 7. 8. using namespace std; using namespace cv; 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. class Objeto{ public: Objeto(); ~Objeto(void); int getXPos(); void setXPos(int x); int getYPos(); void setYPos(int y); int getAreaMinima(); void setAreaMinima(int area); Scalar getHSVmin(); Scalar getHSVmax(); void setHSVmin(Scalar min); void setHSVmax(Scalar max); string getType(); void setType(string t); void setTipo(int t); //apenas robos Scalar getColour(); void setColour(Scalar c); virtual void desenhar(Mat &frame); virtual int identificar(Mat &frameMat); string intToString(int number); private: int xPos, yPos, areaMinima; string type; Scalar HSVmin, HSVmax; Scalar Colour; }; 7.3.7. Objeto.cpp 1. #include "Objeto.h" 2. 3. 4. 5. 6. 7. Objeto::Objeto(){ setType("Objeto"); setHSVmin(Scalar (17,85,109)); setHSVmax(Scalar (29,255,255)); setColour(Scalar (0,0,0)); //preto } 8. 9. Objeto::~Objeto(void){ } 10. 11. 12. int Objeto::getXPos(){ return Objeto::xPos; } 62 Apêndices 13. 14. 15. void Objeto::setXPos(int x){ Objeto::xPos = x; } 16. 17. 18. int Objeto::getYPos(){ return Objeto::yPos; } 19. 20. 21. void Objeto::setYPos(int y){ Objeto::yPos = y; } 22. 23. 24. Scalar Objeto::getHSVmin(){ return Objeto::HSVmin; } 25. 26. 27. Scalar Objeto::getHSVmax(){ return Objeto::HSVmax; } 28. 29. 30. void Objeto::setHSVmin(Scalar min){ Objeto::HSVmin = min; } 31. 32. 33. void Objeto::setHSVmax(Scalar max){ Objeto::HSVmax = max; } 34. 35. 36. string Objeto::getType(){ return type; } 37. 38. 39. void Objeto::setType(string t){ type = t; } 40. 41. void Objeto::setTipo(int t){ } 42. 43. 44. Scalar Objeto::getColour(){ return Colour; } 45. 46. 47. void Objeto::setColour(Scalar c){ Colour = c; } 48. 49. 50. int Objeto::getAreaMinima(){ return areaMinima; } 51. 52. 53. void Objeto::setAreaMinima(int area){ areaMinima = area; } void Objeto::desenhar(Mat &frame){ cv::circle(frame, cv:: Point (getXPos(),getYPos()),RAIO_ROBO, cv:: Scalar (0,0,255)); cv::putText(frame,intToString(getXPos())+ "," + intToString(getYPos()),cv:: Point (getXPos()20,getYPos()+50),1,0.8, Scalar (0,255,0)); 57. cv::putText(frame,getType(),cv:: Point (getXPos()-17,getYPos()-45),1,1,getColour()); 54. 55. 56. 63 Apêndices 58. } 59. 60. 61. 62. 63. string Objeto::intToString(int number){ std:: stringstream ss; ss << number; return ss.str(); } 64. 65. 66. int Objeto::identificar(Mat &frameMat){ return 5; //nao eh nada } 7.3.8. Bola.h 1. 2. 3. #pragma once #include <string> #include "Objeto.h" 4. 5. 6. 7. 8. 9. 10. class Bola: public Objeto{ public: Bola(); ~Bola(void); void desenhar(Mat &frame); private: }; 7.3.9. Bola.cpp 1. #include "Bola.h" 2. 3. 4. 5. 6. 7. 8. Bola::Bola(){ setType("bola"); setHSVmin(Scalar (17,85,109)); setHSVmax(Scalar (29,255,255)); setColour(Scalar (0,0,255)); setAreaMinima(AREA_MIN_OBJETO_BOLA); } 9. 10. Bola::~Bola(void){ } void Bola::desenhar(Mat &frame){ cv::circle(frame, cv:: Point (getXPos(),getYPos()),RAIO_BOLA, cv:: Scalar (0,0,255)); cv::putText(frame,intToString(getXPos())+ "," + intToString(getYPos()),cv:: Point (getXPos()20,getYPos()+20),1,0.8, Scalar (0,255,0)); 14. cv::putText(frame,getType(),cv:: Point (getXPos()-15,getYPos()-13),1,1,getColour()); 15. } 11. 12. 13. 7.3.10. Marcador.h 64 Apêndices 1. 2. 3. #pragma once #include <string> #include "Objeto.h" 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. class Marcador: public Objeto{ public: Marcador(); ~Marcador(void); void desenhar(Mat &frame); void setCor(int cor); int getCor(); private: int cor; }; 7.3.11. Marcador.cpp 1. #include "Marcador.h" 2. 3. 4. 5. 6. 7. 8. Marcador::Marcador() setType("marcador"); setHSVmin(Scalar (0,0,0)); setHSVmax(Scalar (17,255,255)); setColour(Scalar (255,255,255)); //branco setAreaMinima(AREA_MIN_OBJETO_MARCADOR); } 9. 10. Marcador::~Marcador(void){ } 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. void Marcador::setCor(int color){ cor = color; switch (color) { case COR_VERMELHO: setHSVmin(Scalar (0,0,0)); setHSVmax(Scalar (16,255,255)); break; case COR_VERDE: setHSVmin(Scalar (81,168,94)); setHSVmax(Scalar (83,255,255)); break; case COR_AMARELO: setHSVmin(Scalar (34,117,144)); setHSVmax(Scalar (61,255,255)); break; case COR_AZUL: setHSVmin(Scalar (98,136,128)); setHSVmax(Scalar (180,255,255)); break; case COR_ROXO: setHSVmin(Scalar (105,108,0)); setHSVmax(Scalar (180,142,255)); break; case COR_BRANCO: setHSVmin(Scalar (79,60,176)); setHSVmax(Scalar (180,255,255)); break; 65 Apêndices case COR_PRETO: setHSVmin(Scalar (64,0,0)); setHSVmax(Scalar (180,255,100)); break; case COR_LARANJA: setHSVmin(Scalar (17,85,109)); setHSVmax(Scalar (29,255,255)); break; default: setHSVmin(Scalar (179,254,254)); setHSVmax(Scalar (180,255,255)); 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. } 51. 52. 53. int Marcador::getCor(){ return cor; } } void Marcador::desenhar(Mat &frame){ cv::circle(frame, cv:: Point (getXPos(),getYPos()),RAIO_MARCADOR, cv:: Scalar (0,0,255)); cv::putText(frame,intToString(getXPos())+ "," + intToString(getYPos()),cv:: Point (getXPos()20,getYPos()+20),1,0.8, Scalar (0,255,0)); 57. } 54. 55. 56. 7.3.12. Robo.h 1. 2. 3. #pragma once #include <string> #include "Marcador.h" 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. class Robo: public Objeto{ public: Robo(); ~Robo(void); Robo(string name); Marcador getMarcadorRodas(); void setMarcadorRodas(Marcador rodas); Marcador getMarcadorFrente(); void setMarcadorFrente(Marcador frente); Marcador getMarcadorAtras(); void setMarcadorAtras(Marcador atras); Marcador getMarcadorEquipe(); void setMarcadorEquipe(Marcador equipe); void desenhar(Mat &frame); void setTipo(int t); int identificar(Mat &frame); void identificarEquipe1(Mat &frameMat); void identificarEquipe2(Mat &frameMat); private: Marcador marcadorEquipe; Marcador marcadorRodas; Marcador marcadorFrente; Marcador marcadorAtras; }; 66 Apêndices 7.3.13. Robo.cpp 1. #include "Robo.h" 2. 3. 4. 5. 6. 7. 8. Robo::Robo(){ setType("robo"); setHSVmin(Scalar (64,0,0)); setHSVmax(Scalar (180,255,98)); setColour(Scalar (0,0,0)); setAreaMinima(AREA_MIN_OBJETO_ROBO); } 9. 10. Robo::~Robo(void){ } 11. 12. 13. Marcador Robo::getMarcadorRodas(){ return marcadorRodas; } 14. 15. 16. void Robo::setMarcadorRodas(Marcador rodas){ marcadorRodas = rodas; } 17. 18. 19. Marcador Robo::getMarcadorFrente(){ return marcadorFrente; } 20. 21. 22. void Robo::setMarcadorFrente(Marcador frente){ marcadorFrente = frente; } 23. 24. 25. Marcador Robo::getMarcadorAtras(){ return marcadorAtras; } 26. 27. 28. void Robo::setMarcadorAtras(Marcador atras){ marcadorAtras = atras; } 29. 30. 31. Marcador Robo::getMarcadorEquipe(){ return marcadorEquipe; } 32. 33. 34. void Robo::setMarcadorEquipe(Marcador equipe){ marcadorEquipe = equipe; } void Robo::desenhar(Mat &frame){ cv::circle(frame, cv:: Point (getXPos(),getYPos()),RAIO_ROBO, cv:: Scalar (0,0,255)); cv::putText(frame,intToString(getXPos())+ "," + intToString(getYPos()),cv:: Point (getXPos()20,getYPos()+50),1,0.8, Scalar (0,255,0)); 38. cv::putText(frame,getType(),cv:: Point (getXPos()-37,getYPos()-45),1,1,getColour()); 39. } 35. 36. 37. bool estaPertoDe(int numero, int numeroAproximado, int erro){ int modulo = (numero - numeroAproximado) < 0 ? (numeroAproximado-numero) : (numero numeroAproximado); 42. return modulo <= erro ? true : false; 43. } 40. 41. 67 Apêndices 44. 45. 46. 47. int Robo::identificar(Mat &frameMat){ identificarEquipe1(frameMat); identificarEquipe2(frameMat); } 48. 49. 50. 51. void Robo::identificarEquipe1(Mat &frameMat){ IplImage frame = frameMat; try{ cvSetImageROI(&frame, cvRect(getXPos()-RAIO_ROBO, getYPos()-RAIO_ROBO, 2*RAIO_ROBO, 2*RAIO_ROBO)); }catch(Exception e){ cout << "uopa deu excecao :( na hora que fez o cvSetImageROI do Robo." << endl; } //achar os marcadores Mat semente(&frame); Mat limiar; Mat HSV; cvtColor(semente,HSV, COLOR_BGR2HSV); Marcador obj; int qtdMarcadoresEncontrados; int centroMarcadorEquipePosX, centroMarcadorEquipePosY; for(int i=0; i<QTD_TIPOS_ROBO; i++){ qtdMarcadoresEncontrados = 0; centroMarcadorEquipePosX = 0; centroMarcadorEquipePosY = 0; for (int j=0; j<4; j++){ obj.setCor(TIPO_ROBO[i][j]); inRange(HSV,obj.getHSVmin(),obj.getHSVmax(),limiar); Mat elementoErosao = getStructuringElement(MORPH_RECT,Size(1,1)); Mat elementoDilatacao = getStructuringElement(MORPH_RECT,Size(3,3)); erode(limiar,limiar,elementoErosao); erode(limiar,limiar,elementoErosao); dilate(limiar,limiar,elementoDilatacao); dilate(limiar,limiar,elementoDilatacao); Mat temp; limiar.copyTo(temp); //estes dois vetores são necessarios para mostrar os contornos vector < vector < Point > > contours; vector < Vec4i > hierarchy; //encontrar os contornos do imagem filtrada findContours(temp,contours,hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); //usa o método dos momentos para encontrar o objeto selecionado if (hierarchy.size() > 0) { for (int index = 0; index >= 0; index = hierarchy[index][0]) { Moments moment = moments((cv:: Mat)contours[index]); double area = moment.m00; if (area>obj.getAreaMinima()){ Marcador m; m.setXPos(moment.m10/area + getXPos()-RAIO_ROBO); m.setYPos(moment.m01/area + getYPos()-RAIO_ROBO); m.setCor(TIPO_ROBO[i][j]); switch (j) { case 0: setMarcadorEquipe(m); centroMarcadorEquipePosX = moment.m10/area; centroMarcadorEquipePosY = moment.m01/area; printDebug("setei o marcador da equipe 1"); break; 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 68 Apêndices 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. case 1: setMarcadorFrente(m); printDebug("setei o marcador da fente"); break; case 2: setMarcadorAtras(m); printDebug("setei o marcador de tras"); break; default: setMarcadorRodas(m); printDebug("setei o marcador das rodas"); break; } qtdMarcadoresEncontrados++; } } //fim for } } //fim for j if (qtdMarcadoresEncontrados==5 ){ if (estaPertoDe(centroMarcadorEquipePosX,RAIO_ROBO,3) && estaPertoDe(centroMarcadorEquipePosY,RAIO_ROBO,3)) setTipo(i); //tipo = i; //recebe o indice da linha da matriz de tipos de robos que sera seu tipo. break; } else { if (qtdMarcadoresEncontrados>0){ printDebug("encontrei " + intToString(qtdMarcadoresEncontrados) +" marcadores!"); } } }//fim for i dos marcadores } void Robo::identificarEquipe2(Mat &frameMat){ IplImage frame = frameMat; try{ cvSetImageROI(&frame, cvRect(getXPos()-RAIO_ROBO, getYPos()-RAIO_ROBO, 2*RAIO_ROBO, 2*RAIO_ROBO)); }catch(Exception e){ cout << "uopa deu excecao :( na hora que fez o cvSetImageROI do Robo." << endl; } //achar os marcadores Mat semente(&frame); Mat limiar; Mat HSV; cvtColor(semente,HSV, COLOR_BGR2HSV); Marcador obj; int qtdMarcadoresEncontrados; int centroMarcadorEquipePosX, centroMarcadorEquipePosY; for(int i=0; i<QTD_TIPOS_ROBO; i++){ qtdMarcadoresEncontrados = 0; centroMarcadorEquipePosX = 0; centroMarcadorEquipePosY = 0; for (int j=0; j<4; j++){ obj.setCor(TIPO_ROBO2[i][j]); inRange(HSV,obj.getHSVmin(),obj.getHSVmax(),limiar); Mat elementoErosao = getStructuringElement(MORPH_RECT,Size(1,1)); Mat elementoDilatacao = getStructuringElement(MORPH_RECT,Size(3,3)); erode(limiar,limiar,elementoErosao); erode(limiar,limiar,elementoErosao); 69 Apêndices 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. dilate(limiar,limiar,elementoDilatacao); dilate(limiar,limiar,elementoDilatacao); Mat temp; limiar.copyTo(temp); //estes dois vetores são necessarios para mostrar os contornos vector < vector < Point > > contours; vector < Vec4i > hierarchy; //encontrar os contornos do imagem filtrada findContours(temp,contours,hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); //usa o método dos momentos para encontrar o objeto selecionado if (hierarchy.size() > 0) { for (int index = 0; index >= 0; index = hierarchy[index][0]) { Moments moment = moments((cv:: Mat)contours[index]); double area = moment.m00; if (area>obj.getAreaMinima()){ Marcador m; m.setXPos(moment.m10/area + getXPos()-RAIO_ROBO); m.setYPos(moment.m01/area + getYPos()-RAIO_ROBO); m.setCor(TIPO_ROB2O[i][j]); switch (j) { case 0: setMarcadorEquipe(m); centroMarcadorEquipePosX = moment.m10/area; centroMarcadorEquipePosY = moment.m01/area; printDebug("setei o marcador da equipe 2"); break; case 1: setMarcadorFrente(m); printDebug("setei o marcador da fente"); break; case 2: setMarcadorAtras(m); printDebug("setei o marcador de tras"); break; default: setMarcadorRodas(m); printDebug("setei o marcador das rodas"); break; } qtdMarcadoresEncontrados++; } } //fim for } } //fim for j if (qtdMarcadoresEncontrados==5 ){ if (estaPertoDe(centroMarcadorEquipePosX,RAIO_ROBO,3) && estaPertoDe(centroMarcadorEquipePosY,RAIO_ROBO,3)) setTipo(i); //tipo = i; //recebe o indice da linha da matriz de tipos de robos que sera seu tipo. break; } else { if (qtdMarcadoresEncontrados>0){ printDebug("encontrei " + intToString(qtdMarcadoresEncontrados) +" marcadores!"); } } }//fim for i dos marcadores } 70 Apêndices 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. void Robo::setTipo(int t){ switch (t) { case 0: printDebug("setei o atacante 1"); setType("atacante 1"); break; case 1: printDebug("setei o zagueiro 1"); setType("zagueiro 1"); break; case 2: printDebug("setei o goleiro 1"); setType("goleiro 1"); break; case 3: printDebug("setei o atacante 2"); setType("atacante 2"); break; case 4: printDebug("setei o zagueiro 2"); setType("zagueiro 2"); break; case 5: printDebug("setei o goleiro 2"); setType("goleiro 2"); break; default: setType("robo"); printDebug("tipo robo:"+getType()); break; } } 71 Apêndices 7.4. Apêndice 4 – BUG: uvcvideo Este apêndice é para relatar um bug que ocorreu na máquina virtual onde foi feito este trabalho e que tem relação com um módulo de kernel com defeito. Esse módulo faz a câmera embutida do pc funcionar por alguns segundos e depois parar com uma falha. O exemplo foi o que pegava o stream de vídeo da câmera e deixava em tons de cinza. A mensagem que é mostrada no console do Eclipse quando dava o problema é a seguinte: VIDIOC_QUERYMENU: Invalid argument Procuramos sobre sobre o problema e achamos neste link12. Então verificamos o log do que estava acontecendo por baixo do sistema operacional com o comando DMESG e encontramos essa linha: [ 1969.839495] uvcvideo: Failed to resubmit video URB (-27). Fomos procurar o que significava este erro e encontramos este link13 do bugzilla, e descobrimos que poderia ser um erro do drive da câmera do notebook com a versão recente do kernel, ocasionando alguma incompatibilidade. Também encontramos neste link14: no qual reforça a idéia de probelma de kernel ou por causa de mal escalonamento de tarefas do S.O. na VM logo após suspender a mesma. Então, procuramos informações sobre o dispositivo com os comandos MODINFO e achamos essas informações: modinfo uvcvideo filename: /lib/modules/3.0.0-16-generic/kernel/drivers/media/video/uvc/uvcvideo.ko version: v1.1.0 license: GPL description: USB Video Class driver author: Laurent Pinchart srcversion: 7D96DC0E97E200AFF41D401 alias: usb:v*p*d*dc*dsc*dp*ic0Eisc01ip00* alias: usb:v0458p706Ed*dc*dsc*dp*ic0Eisc01ip00* depends: videodev vermagic: 3.0.0-16-generic SMP mod_unload modversions 686 parm: clock:Video buffers timestamp clock parm: nodrop:Don't drop incomplete frames (uint) parm: quirks:Forced device quirks (uint) parm: trace:Trace level bitmask (uint) parm: timeout:Streaming control requests timeout (uint) 12 Instalação no Windows - http://www.ozbotz.org/opencv-install-troubleshooting/ Red Hat BugZilla - https://bugzilla.redhat.com/show_bug.cgi?id=746914 14 Bug#617976 - https://lists.debian.org/debian-kernel/2011/03/msg00426.html 13 72 Apêndices Continuamos coletando informações sobre o dispositivos, agora com o comando LSUSB e conseguimos estes dados: Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 002: ID 090c:c371 Feiya Technology Corp. Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub Bus 002 Device 004: ID 0e0f:0008 VMware, Inc. Finalmente, descobrimos o identificador da câmera do notebook que é o dispositivo da Feiya Technology Corp com o ID 090c:c371, então procuramos dirves para este dispositivo neste link15, onde o drive do dispositivo mais próximo encontrado foi para o dispositivo 090c:b371. Testamos novamente o mesmo código com outra câmera com um drive apropriado para o kernel em uso na máquina virtual que funcionou normalmente sem dar nenhum tipo de problema. O código executado anteriormente funcionava bem porque a câmera original que foi testada é mas antiga e, consequentemente, possui um suporte mais estável no kernel. O código na VM não funcionou por causa do hardware diferente. Como solução propomos colocar uma versão mais antiga do kernel para ver se a câmera do notebook não dá o mesmo problema. Se continuar o erro, seria bom testar na máquina hospedeira o código ou então uma outra opção mais eficaz seria a recompilação do kernel mais atual com outros módulos de vídeo. 15 Linux UVC Driver Tool - http://www.ideasonboard.org/uvc/#devices 73 Anexos 8. Anexos 8.1. Sistema De Visão Humana Segundo (IBRO, 2014), (ZEISS, 2014) e (LEFEO, 2014), o olho é o órgão sensorial baseado na sensibilidade à luz e é fotossensível. Os órgãos fotorreceptores de todos os seres vivos se caracterizam por possuírem um ou mais pigmentos fotossensíveis, ou foto-excitáveis, associados a receptores de membrana. O pigmento responsável pela visão das cores é a rodopsina, presente em todos os animais que vem as cores, entre eles os o ser humano e todos os outros primatas. Nos seres humanos os olhos estão localizados na porção anterior do corpo, a cabeça, dentro da órbita. A órbita ocular é um compartimento ósseo formado por vários ossos do crânio, e protege o olho. Basicamente todo olho possui uma câmara escura, uma camada de células fotorreceptoras, um sistema de lentes para focalizar a luz que forma a imagem e um sistema de células nervosas para conduzir os estímulos ao córtex cerebral. O ser humano possui um olho com três camadas ou túnicas dispostas concentricamente . A camada externa, formada pela esclera ou esclerótica e pela córnea, a camada média ou túnica vascular, constituída pela coróide e pela íris e a terceira camada ou a túnica nervosa, a retina, que se comunica com o cérebro pelo nervo óptico. Há também a lente ou cristalino, que é uma estrutura biconvexa transparente. Frente ao cristalino está uma expansão pigmentada e opaca da camada média e o recobre em parte que é chamada de íris. (IBRO, 2014) 74 Anexos Figura 33 - Vista em corte do olho humano (Médico de Olhos, 2011) O interior do olho pode ser dividido em três câmaras: a anterior, que é delimitada pela íris e a córnea; a câmara posterior, localizada entre a íris e o cristalino; e o espaço vítreo, situado atrás do cristalino e circundado pela retina. As duas primeiras câmaras são preenchidas por um líquido que contêm proteínas, é o humor aquoso. (LEFEO, 2014) O espaço vítreo está cheio do humor ou corpo vítreo, aquoso e gelatinoso. Em várias regiões do olho são encontradas células pigmentares com melanina, são os melanócitos, que impedem a entrada absorvendo a luz estranha que pode prejudicar o processo de formação da imagem. Entre os vertebrados os tipos de células fotorreceptoras são estruturalmente muito parecidos. Figura 34 - Como a imagem chega ao cérebro (IBRO, 2014) 75 Anexos Os cones são as células responsáveis pela visão das cores e, os bastonetes, respondem pela visão preto e branco. Todos os primatas, inclusive o homem, além de possuírem visão colorida têm visão tridimensional, em profundidade. A visão tridimensional acontece porque ha sobreposição, no córtex visual, das informações que chegam dos campos visuais dos dois olhos simultaneamente. Nossos olhos estão localizados na frente do rosto, diferente dos cachorros ou cavalos que têm os olhos posicionados lateralmente na face. Este posicionamento dos olhos permite a visão do mesmo objeto, ao mesmo tempo, desde dois ângulos ligeiramente diferentes. O cérebro compara estas duas imagens simultâneas e cria a noção de profundidade. De uma forma simples e resumida, o funcionamento do olho começa quando a luz entra no olho e é focada, pela córnea e pela lente, sobre a retina que se localiza na outra extremidade do globo ocular. Antes de atingir a lente a luz passa pela pupila, que é o espaço aberto no centro da íris (estrutura que contém pigmento). A íris, funcionando como um diafragma, pode expandir ou contrair e assim provocar abertura ou fecho da pupila, dependendo de haver pouca ou muita luz. É normal que se compare o olho a uma câmara responsável pela captação da imagem do mundo envolvente. Figura 35 - Abertura e fechamento da córnea (Dr. Rui Costa, 2013) Uma vez focada a imagem na retina, os 125 milhões de fotorreceptores distribuídos ao longo da superfície da retina respondem à luz que lhes chega, gerando pequeníssimos potenciais de ação. Estes sinais passam, através de sinapses, por uma rede complexa de 76 Anexos células presentes na retina. Os sinais das diferentes células convergem sobre as células ganglionares da retina de onde partem os axónios, que em conjunto formam o nervo óptico como mostrado na Figura 35. Desta maneira, os sinais são enviados ao cérebro, no qual geram potenciais de ação que são distribuídos para diferentes regiões visuais com funções distintas. 77