Infra - Linux

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.

por Alessandro de Oliveira Faria



Introdução: O que é Realidade Aumentada e ARToolKit

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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.
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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.


Download e instalação

Podemos encontrar o código fonte no SourceForge:
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 /artigos/img_artigos/alessandro_faria/ARToolKit/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.



Calibração e utilização

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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.
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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.
$ ./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 of24
Marked feature position 2 of24
Marked feature position 3 of24
Marked feature position 4 of24
Marked feature position 5 of24
Marked feature position 6 of24
Marked feature position 7 of24
Marked feature position 8 of24
Marked feature position 9 of24
Marked feature position10 of24
Marked feature position11 of24
Marked feature position12 of24
Marked feature position13 of24
Marked feature position14 of24
Marked feature position15 of24
Marked feature position16 of24
Marked feature position17 of24
Marked feature position18 of24
Marked feature position19 of24
Marked feature position20 of24
Marked feature position21 of24
Marked feature position22 of24
Marked feature position23 of24
Marked feature position24 of24

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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.

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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.
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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.
$ ./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!
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.

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.
Linux: ARToolKit: Criando aplicativos de Realidade Aumentada.
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...
Alessandro de Oliveira Faria

Alessandro de Oliveira Faria - Sócio-proprietário da empresa NETi TECNOLOGIA fundada em Junho de 1996 (http://www.netitec.com.br), empresa especializada em desenvolvimento de software e soluções biométricas, Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tecnologia desde 1986 assim propiciando ao mercado soluções em software nas mais diversas linguagens e plataforma, levando o Linux a sério desde 1998 com desenvolvimento de soluções open-source, membro colaborador da comunidade Viva O Linux, mantenedor da biblioteca open-source de vídeo captura entre outros projetos.