Realidade Aumentada e Colaborativa

Trabalho final de curso: Jogo da Velha em Realidade Aumentada

Antonio Calomeni

Programa de Mestrado em Computação Gráfica

PUC-Rio 2003.2

 

Descrição         Técnicas utilizadas        Resultados        Download

 

 

1.     Descrição

 

Este trabalho teve como objetivo a elaboração de um Jogo da Velha em Realidade Aumentada. O usuário imprime um campo de jogo com medidas específicas e utiliza uma webcam normal para filmar o campo de jogo. O usuário joga no papel, seja fazendo um X com uma caneta ou colocando alguma peça na casa correspondente e o computador reconhece a jogada. O computador joga e uma bola virtual aparece na casa correspondente, compondo com a imagem que está sendo capturada em tempo real pela webcam. O usuário joga novamente e o processo continua até que o jogo termine.

As seções seguintes apresentam as fases do desenvolvimento do projeto. Em cada uma, são apresentados os erros e os acertos.

Na seção de download, está disponível o código fonte e um executável do projeto para Windows.

 

2.     Técnicas utilizadas

 

O primeiro passo foi determinar o quanto a existência de ruídos na imagem capturada poderia comprometer o reconhecimento do campo e das jogadas. Alguns experimentos iniciais mostraram que valeria a pena investir em alguma forma de redução de ruídos para melhorar o reconhecimento. As técnicas que foram exploradas são apresentadas no item 2.1.1 abaixo. Entretando, ao final, nenhuma técnica de redução de ruídos foi utilizada, por não se mostrar necessária, mesmo nas webcams mais baratas.

O próximo passo consistiu em determinar um algoritmo para reconhecer o campo de jogo na imagem capturada. Inicialmente tentou-se detectar as linhas presentes na imagem e a partir delas deduzir o campo de jogo. Esta técnica se mostrou ineficiente e ao final uma outra técnica foi utilizada. Estes procedimentos são ilustrados no item 2.1.2.

Em seguida o foco foi a detecção das jogadas do usuário, seja por meio de riscos em X no campo de jogo ou peças colocadas nas casas. A técnica utilizada é ilustrada no item 2.1.3.

Com o modelo do campo de jogo devidamente reconhecido, pôde-se fazer a calibração da câmera, ou seja, inferir a posição da webcam no mundo virtual e assim inserir objetos virtuais no campo de jogo (as ‘bolas’ do computador), consolidando a realidade aumentada.

O sistema, a cada quadro capturado pela webcam, executa uma série de passos visando reconhecer o campo de jogo, determinar em quais casas há um X do usuário, determinar a validade do estado do jogo e fazer uma jogada se necessário. A cada passo, algumas assertivas devem ser asseguradas. Se há alguma falha, o sistema paralisa o reconhecimento (modo panic) e espera o próximo quadro da webcam, recomeçando o processo.

O programa disponibilizado imprime uma mensagem verde de OK no canto inferior esquerdo da tela quando todos os passos foram cumpridos com sucesso e o estado atual é válido. Se algo saiu errado no decorrer do processo, o sistema entra em modo panic e a mensagem verde de OK desaparece.

 

2.1.                     Reconhecimento do campo de jogo e das jogadas

 

2.1.1.   Redução de ruídos

 

Inicialmente achou-se necessário efetuar alguma redução de ruídos na imagem capturada pela webcam. Outras correções como ajuste de distorção radial e ajuste do coeficiente de iluminação foram estudadas mas não chegaram a ser implementadas, por serem julgadas desnecessárias.

A redução de ruídos foi realizada através de um filtro Gaussiano, aplicado à imagem capturada.

 

Prós da aplicação do filtro Gaussiano:

O filtro Gaussiano efetivamente removeu ruídos da imagem e melhorou a detecção de linhas.

 

Contras da aplicação do filtro Gaussiano:

Aplicar um filtro Gaussiano a cada imagem capturada pela webcam impactou consideravelmente a performance do sistema. Este fato fez com que se considerasse a não aplicação do filtro para não prejudicar tanto a performance.

 

A solução final:

Nenhum filtro foi aplicado à imagem capturada pela webcam. A cada quadro, a imagem como foi capturada é enviada à próxima fase do pipeline do sistema: o reconhecimento do campo de jogo. O filtro Gaussiano aparentou ser essencial para realizar uma boa detecção de linhas, mas como na solução final a detecção do modelo não se baseou em um algoritmo de detecção de linhas, ele pôde ser descartado.

 

2.1.2.   Detecção do modelo

 

Durante um bom tempo acreditou-se que a detecção do modelo deveria se dar a partir das linhas presentes na imagem. A transformada de Hough foi o método utilizado para detecção de linhas. Para realçar as bordas da imagem, foram testados os filtros Sobel e Canny. A idéia inicial consistia em, dadas as linhas da imagem, isolar dois pares perpendiculares de linhas paralelas, formando a cerquilha do jogo. O usuário poderia desenhar livremente o campo de jogo e o algoritmo procuraria por esses dois pares de linhas, com tolerâncias de paralelismo e perpendiculariedade.

 

Os problemas da detecção do campo de jogo atráves de linhas usando a Transformada de Hough:

A Transformada de Hough foi bastante sensível à grossura das bordas detectadas através do filtro Sobel, gerando muitas linhas próximas e algumas linhas fora do padrão. Mesmo com fatores de threshold para levar em conta estes problemas, a Transformada de Hough não funcionou bem com o filtro Sobel. Na busca de bordas mais finas, mais especificamente de 1 pixel de espessura, foi implementado o filtro Canny. Mesmo assim, várias linhas foram detectadas para uma mesma linha da imagem, com inclinações levemente diferentes. Algumas técnicas tentaram ser aplicadas para tentar eliminar as linhas ‘erradas’, mas sem sucesso. Por exemplo, tentou-se uma técnica diferente para obter o máximo local no espaço das retas, na espera de pegar somente a linha efetiva da cerquilha, mas não foram obtidos resultados satisfatórios. Os problemas constantes com a Transformada de Hough levaram a se considerar uma outra solução para o problema de detectar o campo de jogo.

 

O problema do desenho do campo de jogo à mão livre:

Durante um bom tempo assumiu-se que o usuário poderia desenhar à mão livre o campo de jogo que o reconhecimento seria feito devidamente. Durante a fase de calibração da câmera, descobriu-se um problema de origem teórica ao adotar essa técnica: Para uma correta calibração da câmera, é necessário saber de antemão as dimensões do modelo a ser reconhecido. Ao se permitir que o usuário desenhe à mão livre o modelo, não se tem a dimensão do modelo presente na imagem no mundo virtual.

 

A solução final para o problema do desenho do campo de jogo à mão livre:

Foram determinadas dimensões específicas para o campo de jogo e um arquivo powerpoint foi criado com a cerquilha. O usuário deve imprimir o documento e usá-lo como campo de jogo.

 

A solução final para o problema da detecção do campo de jogo:

O campo de jogo foi detectado através de seus pontos extremos. Primeiramente a imagem sofre uma aplicação de um filtro Sobel. Do resultado extraímos as componentes conexas da imagem. Procuramos por uma componente conexa particularmente grande, dado um certo threshold. Desta componente conexa, calculamos seu fecho convexo e dele colapsamos pontos muito próximos em apenas um: o centro geométrico da pequena nuvem de pontos correspondente. A idéia é isolar os pontos extremos do campo de jogo, que são oito. O sistema entra em modo panic caso não se tenha exatos oito pontos após este processo. De posse destes oito pontos, tenta-se construir o campo de jogo unindo estes pontos extremos e associando-os aos pontos do modelo virtual, numerados a seguir:

 

 

A união destes pontos se dá conforme a seguinte lógica, assumindo que eles estão organizados em sentido anti-horário em um array circular:

·        Dado o primeiro ponto extremo da estrutura, o outro ponto extremo formando um segmento do campo de jogo será ou o terceiro (+3) ponto adiante ou o quinto (+5) ponto adiante;

·        Para determinar a qual ponto extremo ele deve se ligar (terceiro ou quinto) liga-se o ponto ao terceiro ponto adiante (+3) e ao ponto imediatamente anterior (-1). Deve-se obter dois segmentos de reta aproximadamente perpendiculares. Senão, panic. Anota-se o tamanho do segmento que o liga ao ponto anterior (-1). Liga-se o ponto ao quinto ponto adiante (+5) e ao ponto imediatamente próximo (+1). Deve-se obter novamente dois segmentos de reta aproximadamente perpendiculares. Senão, panic. Anota-se o tamanho do segmento que o liga ao próximo ponto (+1). Se o segmento (ponto,-1) for menor que o segmento (ponto, 1), então ele deve-se ligar ao terceiro ponto. Caso contrário, ele deve se ligar ao quinto ponto.

·        Caso ele tenha se ligado ao quinto ponto, mapeia-se este ponto para o ponto 1 do modelo virtual e os demais pontos adiante são mapeados trivialmente: o próximo ponto da estrutura é mapeado para o ponto 2 do modelo virtual e assim por diante.

·        Caso ele tenha se ligado ao terceiro ponto, mapeia-se este ponto para o ponto 2 do modelo virtual e os demais pontos adiante são mapeados trivialmente: o próximo ponto da estrutura é mapeado para o ponto 3 do modelo virtual e assim por diante (não esquecendo que a estrutura dos pontos é circular, logo o último ponto da estrutura será mapeado para o ponto 1 do modelo virtual).

 

2.1.3.   Detecção das jogadas

 

Após o reconhecimento do campo de  jogo, o sistema deve reconhecer as jogadas realizadas pelo usuário, determinando em quais casas do modelo virtual o usuário tem um X. O sistema irá comparar a estrutura resultante com o estado atual do jogo para determinar a validade do sistema.

 

Reconhecendo as jogadas como componentes conexas únicas dentro das casas, sem bounding box do campo de jogo:

Inicialmente se pensou em reconhecer as jogadas do usuário procurando por componentes conexas de um dado tamanho e determinando se todos os seus pixels residiam em uma das casas do campo de jogo. Se houvesse mais de uma componente conexa dentro de uma casa, ou uma componente conexa ocupando mais de uma casa, o sistema não reconhecia o jogo e aguardava (panic).

Essa técnica acarretou problemas pois requeria uma certa precisão nos riscos do usuário, pois o X deveria ser uma única componente conexa. Além disso, a checagem não levava em conta o bounding box do campo de jogo. Assumia-se que as linhas do campo de jogo se estendiam até o infinito. Então, muitas vezes, ao aparecer a mão do usuário na imagem para fazer um X, o sistema reconhecia um X nas casas do canto e quanto a mão do usuário desaparecia, o sistema acusava inconsistência (um X havia sido “apagado”).

 

A solução final para o reconhecimento das jogadas:

O sistema procura por componentes conexas de um dado tamanho mínimo. Para cada uma, o sistema calcula seu fecho convexo e determina se todos os pontos residem na mesma casa. Se positivo, marca-se um X na casa correspondente. Senão, a componente conexa é ignorada. Caso já haja um X na casa correspondente, a componente também é ignorada. O teste de pertinência dos pontos do fecho convexo a uma casa leva em consideração o bounding box do campo de jogo. Se alguma componente conexa reside em mais de uma casa ou parte dela reside fora do campo de jogo o sistema paralisa (panic). A exigência de apenas todos os pontos do fecho convexo pertencerem à mesma casa se mostrou suficiente para garantir uma boa fluidez nas jogadas. Quando a mão do usuário entra em cena, o sistema acusa uma componente conexa ocupando mais de uma casa ou residindo fora do campo de jogo e entra em modo panic. Enquanto a mão do usuário permanece em cena, o sistema fica paralisado. Quando a mão do usuário vai embora, o sistema reconhece a componente conexa deixada pelo usuário: o seu X. Mesmo que ele não esteja bem rabiscado, se ele for suficiente para gerar uma componente conexa que seja, a jogada será reconhecida.

 

2.2.                     Calibração da Câmera

 

A calibração da câmera se deu através do método de Tsai. Depois do reconhecimento do campo de jogo, os oito pontos extremos reconhecidos são fornecidos ao algoritmo de Tsai juntamente com os seus correspondentes no mundo virtual. Esta quantidade de pontos se mostrou suficiente para uma boa calibração da câmera.

Em resoluções muito baixas (ex: 320x240) as peças virtuais do computador (bolas) aparecem tremendo um pouco, fruto da instabilidade do mapeamento dos oito pontos extremos entre um quadro e outro. Um filtro de Kalmann chegou a ser cogitado, mas em resoluções maiores (640x480) a qualidade da imagem foi bem superior e o overhead de processamento causado pelo aumento da resolução “tranquilizou” as peças, dando a impressão que estão tremendo menos. O filtro foi descartado pois acreditou-se que resoluções mais baixas não serão usadas por não apresentarem uma boa qualidade de imagem.

 

3.     Resultados

 

Um programa de Jogo da Velha foi produzido. O usuário imprime um campo de jogo, coloca-o em cima de uma mesa, aponta uma webcam focalizando-o devidamente e inicia o programa.

O programa reconhece o campo de jogo e imprime uma mensagem de OK no canto inferior esquerdo da tela. O usuário faz uma jogada no papel, seja rabiscando em uma casa com um lápis ou caneta ou colocando algum objeto sólido na casa, como uma moeda. O computador reconhece a jogada e faz a sua em seguida. Olhando para o monitor do computador o usuário poderá ver a realidade aumentada: aparecerá uma bola virtual no papel, no lugar onde o computador jogou. A partida prossegue e o usuário faz a sua próxima jogada. O sistema determina quem venceu ou se houve velha.

 

Instabilidades:

O campo de jogo deve ser focalizado de ângulos altos. Posicionando a webcam muito próxima do nível do papel, forçando muito a perspectiva, poderá acarretar reconhecimentos errados do campo de jogo.

O campo de jogo não pode estar muito longe da webcam. Um campo de jogo pequeno na tela poderá levar a um não reconhecimento das jogadas, pois os rabiscos ou objetos colocados no papel ficarão pequenos e serão ignorados.

Movimentos bruscos na câmera ou no papel durante uma jogada podem fazer o sistema se perder. O jogo pode continuar caso o usuário tente reposicionar o papel no último lugar onde a mensagem de OK ainda aparecia.

A câmera pode ser movimentada e o usuário tem o feedback em tempo real da realidade aumentada no monitor. Porém, o movimento deve ser muito suave. Caso contrário o sistema se perde.

 

Comentários finais:

Apesar de um pouco instável, com os devidos cuidados o programa é utilizável e serve de exemplo para ilustrar o que a realidade aumentada significa e pode proporcionar.

Algumas técnicas de visão computacional foram rejeitadas e outras aceitas. Logo este trabalho também serve como guia prático para trabalhos futuros de  realidade aumentada.

Uma característica importante que não foi implementada foi o recurso de colaboração (multi-jogadores em rede).

O programa está disponível para download, bem como o seu código fonte.

 

Abaixo seguem algumas fotos do programa funcionando.

 

 

4.     Download

 

ATENÇÃO:

Este programa é fornecido SEM GARANTIA (*AS IS*). Baixe-o e use-o por sua conta e risco.

 

Binário para Windows (descompacte em um diretório e execute o programa)

 

Código fonte (necessita da biblioteca imcapture)

 

Campo de jogo no formato do Powerpoint

 

Instruções de uso:

·        Baixe o campo de jogo e imprima

·        Baixe o binário para Windows

·        Descompacte o arquivo para um diretório de sua escolha

·        Conecte a sua webcam no computador

·        Execute o programa

·        Escolha a resolução e determine as preferências de captura. Dica: escolha 640x480 para melhores resultados.

·        Focalize o campo de jogo. Mantenha a câmera um pouco acima do nível do papel, apontando para baixo e deixando todo o campo de jogo visível, com um tamanho razoável, de preferência ocupando quase a tela inteira (olhe as fotos na seção de Resultados)

·        Aperte a tecla ‘R’ para resetar o reconhecimento

·        Uma mensagem de OK deve aparecer no canto inferior esquerdo da tela. Caso não apareça, tente ajustar a câmera novamente e aperte ‘R’ até que a mensagem apareça

·        Basta jogar normalmente. O usuário inicia. Faça um risco ou coloque algum objeto, como uma moeda, na casa que você quer jogar. Espere a resposta do computador e jogue novamente. Evite colocar o campo de jogo diretamente abaixo de uma luz artificial: isso pode fazer com que os objetos que você coloque sobre o papel reflitam muito a luz e faça com que o sistema não os reconheça.

·        A qualquer momento você pode mexer com a câmera. A imagem no monitor é atualizada em tempo real e as peças virtuais do computador acompanham o papel. Mas cuidado: faça movimentos muito suaves. Caso contrário o sistema se perde (a mensagem de OK desaparece) e você precisará voltar para a última posição válida, tentando ajustar até que a mensagem apareça novamente.

·        Quando o jogo terminar apague ou remova suas peças e aperte ‘R’ para recomeçar.

 

Caso a mensagem de OK desapareça durante o jogo:

Há várias causas para este problema. Aqui vão algumas soluções:

·        Pode ter sido um movimento brusco de câmera ou do papel no momento da sua jogada. Tente ‘desfazer’ o movimento. A mensagem pode voltar a aparecer.

·        Algum objeto pode estar aparecendo na tela. A ponta do seu dedo por exemplo pode estar aparecendo e o sistema fica paralisado. Removendo-o a mensagem reaparece.

·        Uma jogada do usuário está ocupando mais de uma casa ou está fora do campo de jogo. Não faça riscos que invadam outras casas ou que encoste nas linhas do campo. Em se tratando de objetos sólidos, use objetos pequenos que também obedeçam a estas regras. O campo foi projetado para comportar moedas, por exemplo. Acerte os riscos ou ajeite as peças que a mensagem pode voltar a aparecer.

·        Se tudo mais falhar, apague todas as suas jogadas ou remova todos os seus objetos, focalize o campo novamente (se necessário) e aperte ‘R’ para recomeçar.

 

 

(c) 2003 – Antonio Calomeni

ultima atualização : 12/12/2003