ARTIGOS:ARToolKit Criando aplicativos de Realidade Aumentada
"Neste documento apresento a ARToolKit, uma biblioteca criada para facilitar o desenvolvimento de aplicativos com o recurso de realidade aumentada. Ou seja, a sobreposição de objetos virtuais e tridimensionais gerados por computador junto ao ambiente real."
Índice
Introdução
Em 30/03/2009 disponibilizei um documento sobre o jogo Levelhead, um jogo de realidade aumentada. Define-se realidade aumentada como a sobreposição de objetos virtuais e tridimensionais, gerados por computador junto ao ambiente real, por meio de algum dispositivo tecnológico de vídeo captura.
A Realidade Aumentada disponibiliza uma interação sem necessidade de treinamento, pois o usuário pode trazer para o ambiente real objetos virtuais, incrementando e aumentando a visão do mundo real. Isto somente é possível com técnicas de visão computacional junto a computação gráfica.
Os objetos virtuais introduzidos no ambiente real podem ser manipulados com as próprias mão, assim proporcionando ao usuário uma interação inovadora e atrativa. Veja no vídeo a seguir um exemplo de interatividade com a tecnologia de realidade aumentada.
Logo, Realidade Aumentada é um sistema que:
- combina elementos virtuais com o ambiente real
- é interativa e tem processamento em tempo real
- é concebida em três dimensões
ARToolKit
ARToolKit é uma biblioteca escrita em C, baseada em software livre e desenvolvida pelo Dr. Hirokazu Kato, utilizada atualmente por pesquisadores do Laboratório Tecnológico de Interface Humana, na Universidade de Washington. Criada para a construção de aplicações de Realidade Aumentada, a biblioteca ARToolKit utiliza recursos de visão computacional e processamento de imagens para prover os recursos de RA.
A complexidade do desenvolvimento das aplicações de Realidade Aumentada é calcular precisamente, em tempo real, o ponto de observação do usuário, para somente então projetar corretamente os objetos virtuais no mundo real. Este é o principal objetivo da biblioteca ARToolKit, ou seja, rastrear rapidamente e calcular a posição real da câmera e de seus marcadores de referência possibilitando que o programador acrescente objetos virtuais sobre estes marcadores no mundo real sem magia negra.
Para tudo isto funcionar (a biblioteca ARToolKit) primeiramente é preciso transformar o quadro capturado no vídeo ao vivo em uma imagem com valores binários (P&B). Em seguida ele examina essa imagem para encontrar regiões quadradas. Ao encontrar um quadrado, a imagem no seu interior é capturada e comparada com algumas imagens pré-cadastradas. Encontrando alguma similaridade com a imagem pré-cadastrada, a biblioteca utiliza o tamanho conhecido do quadrado e a orientação do padrão encontrado para calcular a posição real da câmera em relação à posição real do marcador.
Download e instalação
Podemos encontrar o código fonte no SourceForge: http://sourceforge.net/projects/artoolkit/
A seguir, o comando para efetuar o download do projeto:
$ wget http://downloads.sourceforge.net/project/artoolkit/artoolkit/2.72.1/ARToolKit-2.72.1.tgz
Descompacte o pacote com o comando:
$ tar -zxvf ARToolKit-2.72.1.tgz
Procedimentos para dispositivos compatíveis com a API V4L1:
Entre na pasta recém-criada.
$ cd ARToolKit/
Execute o comando ./configure, selecione a opção 1 e responda as perguntas como no exemplo a seguir:
$ ./configure Select a video capture driver. 1: Video4Linux 2: Video4Linux+JPEG Decompression (EyeToy) 3: Digital Video Camcoder through IEEE 1394 (DV Format) 4: Digital Video Camera through IEEE 1394 (VGA NONCOMPRESSED Image Format) 5: GStreamer Media Framework Enter : 1 Color conversion should use x86 assembly (choose 'n' for 64bit systems)? Enter : n Do you want to create debug symbols? (y or n) Enter : n Build gsub libraries with texture rectangle support? (y or n) GL_NV_texture_rectangle is supported on most NVidia graphics cards and on ATi Radeon and better graphics cards Enter : y create ./Makefile create lib/SRC/Makefile create lib/SRC/AR/Makefile create lib/SRC/ARMulti/Makefile create lib/SRC/Gl/Makefile create lib/SRC/VideoLinux1394Cam/Makefile create lib/SRC/VideoLinuxDV/Makefile create lib/SRC/VideoLinuxV4L/Makefile create lib/SRC/VideoSGI/Makefile create lib/SRC/VideoMacOSX/Makefile create lib/SRC/VideoGStreamer/Makefile create lib/SRC/ARvrml/Makefile create util/Makefile create util/calib_camera2/Makefile create util/calib_cparam/Makefile create util/calib_distortion/Makefile create util/mk_patt/Makefile create util/graphicsTest/Makefile create util/videoTest/Makefile create examples/Makefile create examples/collide/Makefile create examples/exview/Makefile create examples/loadMultiple/Makefile create examples/modeTest/Makefile create examples/multi/Makefile create examples/optical/Makefile create examples/paddle/Makefile create examples/paddleDemo/Makefile create examples/paddleInteraction/Makefile create examples/range/Makefile create examples/relation/Makefile create examples/simple/Makefile create examples/simple2/Makefile create examples/simpleLite/Makefile create examples/twoView/Makefile create examples/simpleVRML/Makefile create include/AR/config.h Done.
Crie a variável ambiental ARTOOLKIT_CONFIG conforme o exemplo abaixo:
$ export ARTOOLKIT_CONFIG="-dev=/dev/video0 -palette=YUV420P -width=640 -height=480"
Entre na pasta bin e execute o programa videoTest para verificar se tudo está funcionando corretamente.
$ cd bin $ ./videoTest Using config string from environment [-dev=/dev/video0 -palette=YUV420P -width=640 -height=480]. Image size (x,y) = (640,480)
Se tudo estiver funcionando corretamente, será apresentada uma janela cujo seu conteúdo será o vídeo ao vivo da sua webcam.
Procedimentos para dispositivos compatíveis com a API V4L2:
Após a descompactação do pacote, baixe o patch para a API V4L2:
$ wget http://img.vivaolinux.com.br/imagens/artigos/comunidade/artk-v4l2-2.72.1.20080427.patch
E o aplique na pasta recém criada:
$ patch -p0 -d . < artk-v4l2-2.72.1.20080427.patch
Agora entre na pasta ARToolKit.
$ cd ARToolKit/
Execute o comando ./configure, selecione a opção 3 e responda as perguntas como no exemplo a seguir:
$ ./configure Select a video capture driver. 1: Video4Linux 2: Video4Linux+JPEG Decompression (EyeToy) 3: Video4Linux2 4: Digital Video Camcoder through IEEE 1394 (DV Format) 5: Digital Video Camera through IEEE 1394 (VGA NONCOMPRESSED Image Format) 6: GStreamer Media Framework Enter : 3 Do you want to create debug symbols? (y or n) Enter : n Build gsub libraries with texture rectangle support? (y or n) GL_NV_texture_rectangle is supported on most NVidia graphics cards and on ATi Radeon and better graphics cards Enter : y create ./Makefile create lib/SRC/Makefile create lib/SRC/AR/Makefile create lib/SRC/ARMulti/Makefile create lib/SRC/Gl/Makefile create lib/SRC/VideoLinux1394Cam/Makefile create lib/SRC/VideoLinuxDV/Makefile create lib/SRC/VideoLinuxV4L/Makefile create lib/SRC/VideoLinuxV4L2/Makefile create lib/SRC/VideoSGI/Makefile create lib/SRC/VideoMacOSX/Makefile create lib/SRC/VideoGStreamer/Makefile create lib/SRC/ARvrml/Makefile create util/Makefile create util/calib_camera2/Makefile create util/calib_cparam/Makefile create util/calib_distortion/Makefile create util/mk_patt/Makefile create util/graphicsTest/Makefile create util/videoTest/Makefile create examples/Makefile create examples/collide/Makefile create examples/exview/Makefile create examples/loadMultiple/Makefile create examples/modeTest/Makefile create examples/multi/Makefile create examples/optical/Makefile create examples/paddle/Makefile create examples/paddleDemo/Makefile create examples/paddleInteraction/Makefile create examples/range/Makefile create examples/relation/Makefile create examples/simple/Makefile create examples/simple2/Makefile create examples/simpleLite/Makefile create examples/twoView/Makefile create examples/simpleVRML/Makefile create include/AR/config.h Done.
Crie a variável ambiental ARTOOLKIT_CONFIG conforme o exemplo abaixo:
$ export ARTOOLKIT_CONFIG="v4l2src device=/dev/video1 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24,width=960,height=720 ! identity name=artoolkit ! fakesink"
Entre na pasta bin e execute o programa videoTest para verificar se tudo está funcionando corretamente.
$ cd bin/ $ ./videoTest Using config string from environment [v4l2src device=/dev/video1 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24,width=960,height=720 ! identity name=artoolkit ! fakesink]. libARvideo: GStreamer 0.10.22 libARvideo: GStreamer pipeline is PAUSED! libARvideo: GStreamer negotiated 960x720 libARvideo: GStreamer pipeline is PLAYING! libARvideo: GStreamer pipeline is PAUSED! Image size (x,y) = (960,720)
Se tudo estiver funcionando corretamente, será apresentado uma janela cujo seu conteúdo será o vídeo ao vivo da sua webcam.
Instalação com 1-Click Install:
É possivel efetuar a instalação através da tecnologia 1-click install no repositório de software.
Calibração da câmera
As propriedades padrão da biblioteca ARToolKit encontram-se no arquivo de parâmetros da câmera, camera_para.dat, localizado na pasta ARToolKit/bin/Data. Este arquivo é carregado na inicialização da aplicação. Os parâmetros padrão abrangem um amplo conjunto de modelos e fabricantes de câmeras. Porém, sugiro a calibração da câmera conforme as instruções a seguir.
Em primeiro lugar, devemos imprimir os arquivos de calibração calib_cpara.pdf e calib_dist.pdf localizados na pasta patterns. O arquivo calib_cpara.pdf é uma grade de linhas e deverá ser impresso em escala para que as linhas fiquem separadas de exatamente 40 mm.
Já o arquivo calib_dist.pdf contém um padrão de 6x4 pontos e deverá também ser impressos em escala para que os pontos fiquem separados de 40 mm. Ambos deverão ser impressos em papéis papelão ou colados em superfícies rígidas.
A calibração da câmera é calculada extraindo ponto central, distorções da lente e a distância focal da câmera. O programa calib_dist é usado para calcular o ponto central da imagem e as distorções das lentes. Já o programa calib_param calcula a distância focal da câmera. Todos os fontes estão disponíveis para estudos. Primeiramente devemos executar o programa calib_dist e depois o calib_cparam.
Execute o programa calib_dist, aponte a câmera para o arquivo calib_dist.pdf impresso de tal modo que todos os pontos estejam visíveis. Então clique com o botão esquerdo do mouse para congelar a imagem de vídeo.
Agora, pressione o botão esquerdo do mouse sobre a imagem e desenhe um retângulo em volta de cada ponto da imagem (segurando o botão do mouse pressionado). Inicie com o ponto mais próximo ao canto superior esquerdo da imagem e prossiga até que todos os pontos tenham sido desenhados. Repita este procedimento de 5 a 10 vezes em vários ângulos.
$ ./calib_dist "v4l2src device=/dev/video1 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24,width=960,height=720 ! identity name=artoolkit ! fakesink" Using supplied video config string [videotestsrc v4l2src device=/dev/video1 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24,width=960,height=720 ! identity name=artoolkit ! fakesink]. libARvideo: GStreamer 0.10.22 libARvideo: GStreamer pipeline is PAUSED! libARvideo: GStreamer negotiated 960x720 libARvideo: GStreamer pipeline is PLAYING! libARvideo: GStreamer pipeline is PAUSED! Camera image size (x,y) = (960,720) libARvideo: GStreamer pipeline is PLAYING! ----------- Press mouse button to grab first image, or press right mouse button or [esc] to quit. Grabbed image 1. ----------- Press mouse button and drag mouse to rubber-bound features (6 x 4), or press right mouse button or [esc] to cancel rubber-bounding & retry grabbing. Marked feature position 1 of 24 Marked feature position 2 of 24 Marked feature position 3 of 24 Marked feature position 4 of 24 Marked feature position 5 of 24 Marked feature position 6 of 24 Marked feature position 7 of 24 Marked feature position 8 of 24 Marked feature position 9 of 24 Marked feature position 10 of 24 Marked feature position 11 of 24 Marked feature position 12 of 24 Marked feature position 13 of 24 Marked feature position 14 of 24 Marked feature position 15 of 24 Marked feature position 16 of 24 Marked feature position 17 of 24 Marked feature position 18 of 24 Marked feature position 19 of 24 Marked feature position 20 of 24 Marked feature position 21 of 24 Marked feature position 22 of 24 Marked feature position 23 of 24 Marked feature position 24 of 24
Para finalizar a captura pressione o botão direito do mouse. O programa começará a calcular os valores de distorção da câmera.
----------- Press mouse button to grab next image, or press right mouse button or [esc] to calculate distortion parameter. [480,0, 360,0, 9,4] 1294,330078 [430,0, 310,0, 9,3] 1284,283364 [430,0, 315,0, 9,4] 1283,999911 [430,0, 320,0, 9,5] 1283,841552 [430,0, 325,0, 9,6] 1283,816407 [430,0, 325,0, 9,6] 1283,816407 [425,0, 323,0, 9,5] 1283,484534 [425,0, 323,0, 9,5] 1283,484534 Olen = 425,000000, Ilen = 432,696135 Olen = 535,000000, Ilen = 550,881766 Olen = 323,000000, Ilen = 326,300477 Olen = 397,000000, Ilen = 403,228407 -------------- Center X: 425,000000 Y: 323,000000 Dist Factor: 9,500000 Size Adjust: 1,010218 -------------- ----------- Checking fit on image 1 of 5. Press mouse button to check fit of next image.
Para verificar se estes parâmetros e/ou cálculos estão corretos, pressione o botão esquerdo do mouse para mostrar as imagens capturadas com as linhas vermelhas desenhadas passando pelos pontos de calibração. Estas linhas deverão se cruzar no centro de cada um destes pontos. Cada vez que o botão esquerdo do mouse é pressionado, a próxima imagem capturada é mostrada.
O calib_cparam, como mencionado anteriormente, é usado para encontrar a distância focal da câmera, além de outros parâmetros. Para continuarmos, execute o programa e informe as coordenadas do centro e o fator de distorção disponibilizado pelo aplicativo calib_dist.
Coloque o arquivo calib_cpara.pdf diante à câmera de tal modo que a imagem fique o mais perpendicular possível ao eixo óptico da câmera, e também todas as linhas devem ser visualizadas.
Agora pressione o botão esquerdo do mouse para capturar a imagem. Logo a seguir aparecerá uma linha branca horizontal na imagem. Movimente a linha branca até cobrir a linha preta no topo e pressione ENTER. A linha movimenta-se para cima ou para baixo usando-se as teclas de seta para cima e para baixo. A linha pode ainda ser rotacionada no sentido horário e anti-horário usando as teclas de setas para a direita e para a esquerda. Repetir este processo com todas as linhas verticais e horizontais por 5 vezes. Ao terminar, informe o nome do arquivo e pronto.
$ ./calib_cparam Input center coordinates: X = 425 : Y = 323 Input distortion ratio: F = 9.500000 Input size adjustment factor: S = 1.010218 Number of horizontal lines (7): Number of vertical lines (9): Number of iteration (5): Distance among lines (40.000000): Distance to move (100.000000): Using supplied video config string [v4l2src device=/dev/video1 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24,width=960,height=720 ! identity name=artoolkit ! fakesink]. libARvideo: GStreamer 0.10.22 libARvideo: GStreamer pipeline is PAUSED! libARvideo: GStreamer negotiated 960x720 libARvideo: GStreamer pipeline is PLAYING! libARvideo: GStreamer pipeline is PAUSED! Camera image size (x,y) = (960,720) Grabbed image. libARvideo: GStreamer pipeline is PLAYING! Grabbed image. libARvideo: GStreamer pipeline is PLAYING! Grabbed image. libARvideo: GStreamer pipeline is PLAYING! Grabbed image. libARvideo: GStreamer pipeline is PLAYING! Grabbed image. point_num = 315 -------------------------------------- SIZE = 960, 720 Distortion factor = 425,000000 323,000000 9,500000 1,010218 389,57470 -967,88703 -97,42965 0,00000 0,00000 594,43782 -644,58036 0,00000 0,00000 0,00000 1,00000 0,00000 -------------------------------------- Input filename: webcam3_para.dat
Para utilizar este arquivo de calibração, basta copiá-lo na pasta Data com o nome camera_para.dat.
Agora, para testar o funcionamento da realidade aumentada, execute o programa simpleTest e veja o resultado ao apresentar o arquivo pattHiro.pdf impresso para a câmera.
$ ./simpleTest Using config string from environment [v4l2src device=/dev/video1 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24,width=960,height=720 ! identity name=artoolkit ! fakesink]. libARvideo: GStreamer 0.10.22 libARvideo: GStreamer pipeline is PAUSED! libARvideo: GStreamer negotiated 960x720 libARvideo: GStreamer pipeline is PLAYING! libARvideo: GStreamer pipeline is PAUSED! Image size (x,y) = (960,720) *** Camera Parameter *** -------------------------------------- SIZE = 960, 720 Distortion factor = 477,750000 395,250000 11,644444 1,012757 1051,42721 0,00000 474,75000 0,00000 0,00000 1089,14127 362,25000 0,00000 0,00000 0,00000 1,00000 0,00000 -------------------------------------- libARvideo: GStreamer pipeline is PLAYING!
Princípio de desenvolvimento
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada. 1. Inicialização: Inicializa o dispositivo de captura, carrega em memória o modelo impresso e carrega o parâmetros de calibração da câmera. 2. Captura um quadro. 3. Detecta as marcas do padrão na imagem. 4. Calcula a transformação relativa. 5. Desenha o objeto virtual sob o padrão detectado. 6. Finaliza o dispositivo de captura.
A aplicação ExView exibe a visão externa da câmera, como se a câmera estivesse sendo rastreada. Para executar este aplicativo, digite o comando ./exview na pasta bin.
Vejam como é simples a funcionalidade do loop principal:
Captura o quadro.
arVideoCapNext();
Checa a visibilidade
k = -1; for( j = 0; j < marker_num; j++ ) { if( patt_id == marker_info[j].id ) { if( k == -1 ) k = j; else if( marker_info[k].cf < marker_info[j].cf ) k = j; } } if( k == -1 ) { contF = 0; argSwapBuffers(); return; }
Calcula a transformação relativa.
if( mode == 0 || contF == 0 ) { arGetTransMat(&marker_info[k], patt_center, patt_width, patt_trans); } else { arGetTransMatCont(&marker_info[k], patt_trans, patt_center, patt_width, patt_trans); } contF = 1;
Desenha o objeto:
draw( patt_trans );
Conclusão
ARToolKit é muito utilizado pelo fato de ser distribuído no modelo open source e para fins não comerciais, incentivando a liberdade para os usuários executarem, estudarem e modificarem os códigos-fontes da biblioteca conforme a sua necessidade.
Como sempre menciono: Colaborar atrai amigos, competir atrai inimigos...
Sobre o autor: (Alessandro de Oliveira Faria A.K.A.CABELO )