Visão Computacional e Realidade Aumentada.

 

Objetivo:  Implementação de um programa que insira objetos 3D animados num vídeo através da combinação do ARToolKit e do IrrLitch Engine.

 

Justificativa:  Apesar de o Artoolkit ser uma ótima biblitoca para uso em realidade aumetada ele é feito para trabalhar com openGL puro.  Assim sendo complica-se par uso de efeitos mais elaborados e carga de objetos 3D.

 

Funcionamento:

O Artoolkit nos proporciona uma interface para interagir com a câmera, pegar as suas imagens, detectar os marcadores e achar a sua matriz de posicionamento espacial, por isso ele irá tratar da parte relacionada ao mundo real e sua correspondência com o mundo virtual. Já o Irrlitch por ser um engine gráfico e portanto também um grafo de cena será responsável por lidar com a carga de objetos completos, as transformações 3D necessárias, animações e iluminação.

Para se fazer a interface entre os dois segue-se um fluxo, mas  a idéia principal é bastante simples. Pega-se imagem a imagem do stream de vídeo e aplica-se numa textura que funciona como background da cena exibida. Depois acha-se os marcadores, e a cada marcador se acha a matriz que o posicionará na tela. Com esses dados associa-se a matriz a um nó da e insere-o na cena.

Captura da imagem pela câmera

 


Detecção dos marcadores

Calculo da matriz

Adição da imagem como background

Associação dos nós aos marcadores

Renderização dos nós

                                                                                                                                            

 

 

 

 

 

 

 

 


 

Para exemplificar o funcionamento vou mostrar um exemplo de código altamente comentado:

 

      bool fullscreen = false;

      MyEventReceiver receiver;

 

      //Criação da tela de exebiçao

      device = createDevice( video::EDT_OPENGL, dimension2d<s32>(WIN_WIDTH, WIN_HEIGHT), 16, fullscreen, false, false, &receiver);

 

      // Inicio da captura de vídeo

      driver = device->getVideoDriver();

 

      // Criação do gerente da cena

      smgr = device->getSceneManager();

 

      // Definindo um títuo para a janela

      device->setWindowCaption(L"Exemplo");

 

      // Abrindo um objeto 3D

      IAnimatedMesh* mesh = smgr->getMesh("media\\sydney.md2");

      // Atrelando o objeto a um nó

      IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);

      if (node)

      {

            // Definindo propriedades do nó como textura e iluminação

            node->setMaterialTexture( 0, driver->getTexture( (BaseDir + "media\\sydney.bmp").c_str()) );

            node->setMaterialFlag(EMF_LIGHTING, false);

            node->setMD2Animation(scene::EMAT_POINT);

            node->setPosition(vector3df(0,50,0));

            node->setScale(vector3df(2,2,2));

      }

 

 

      //camera

      vector3df camera_pos = vector3df(0,0,0);

      vector3df camera_target = vector3df(0,0,1);

      // Criando a camera

      ICameraSceneNode* camera = smgr->addCameraSceneNode(0, camera_pos, camera_target);

     

      //AR

      IARManager* armgr = new IARManager(device);

      //iniciando a camera

      armgr->beginCamera( "ardata\\camera_para.dat", "ardata\\WDM_camera_flipV.xml", "-dev=/dev/video0");

 

      //Atrelando um nó a um marcador

      armgr->addARSceneNode("ardata/patt.hiro", node);

 

 

      //Ajuste da camera utilizando uma matrix geral

      armgr->fixCamera(camera);

 

     

      while(device->run())

      {

//Define a cor padrao da cena

            driver->beginScene(true, true, SColor(255,100,101,140));

           

            // Inicia a captura de video e reconhecimento de padroes

            armgr->run();

           

            // Desenha o fundo

            armgr->drawBackground();

 

            // Desenha tudo (os objetos após o fundo)

            smgr->drawAll();

 

            driver->endScene();

 

            // Busca Marcadores.   

            verifyMarkers(armgr);

      }

 

      device->drop();

 

Resultado do programa:

 

Exemplo de funcionamento interno:

A próxima função é o que faz a integração com a engine:

 

ARUint8 *dataPtr;

     

      //busque a próxima imagem da câmera

      dataPtr = (ARUint8 *)arVideoGetImage();

      arVideoCapNext();

     

      if(!dataPtr) return 0;

     

      //enviar para o irrlitch como uma textura

      this->update_ITexture(this->cam_texture, dataPtr);

     

      //Ache os marcadores e faça as mudanças aproriadas aos nós ligados ao ele.

      this->translate_nodes(dataPtr);

     

Código Fonte