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