Motion tracking - fiducial markers

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Introducció

Reactivision02.png

Els fiducial markers són els símbols que s'utilitzen per fer motion tracking, que utilitza per exemple el Reactable, i que també he vist en l'exposició sobre Mariscal (la instal.lació és un llibre, que cada pàgina té un fiducial marker. Quan gires la pàgina, en el projector es canvia de vídeo. Similar a http://www.youtube.com/watch?v=Q4cZ7uAcN4k). De fet, la tecnologia la va desenvolupar el MTG de la UPF per fer el reactable.

This framework has been developed by Martin Kaltenbrunner and Ross Bencina at the Music Technology Group at
the Universitat Pompeu Fabra in Barcelona, Spain. reacTIVision was designed as the underlying sensor component
of the Reactable, a tangible modular synthesizer that has set the standards for tangible multi-touch 
applications. Since the establishment of Reactable Systems we will still continue the development of this 
software as an open source project, but we will be also able to offer additional professional services for 
the creation of commercial installations based on our tangible interaction framework. 

La idea és que tinc una webcam, que observa el seu camp de visió. En el camp de visió hi ha els fiducials. Una aplicació és la que s'encarrega de detectar la posició dels fiducials, etc.

Està explicat a reacTIVision:

des d'on es pot descarregar el projecte per a Linux/Ubuntu. Les webcams han de ser compatibles amb V4L2 (Video For Linux 2). Poden ser USB, tot i que millor si són Firewire.

El funcionament del Reactable està explicat a:

Tot això s'emmarca dins dels TUIO (Tangible User Interface Object);

La base teòrica sobre el reconeixement de la imatge dels fiducials està explicat en aquest paper:

Exemples d'utilització dels fiducials:

Instal.lació i presa de contacte

$ sudo dpkg -i reactivision_1.4-2_i386.deb

l'aplicació s'instal.la a /usr/bin/reacTIVision

es pot baixar també el codi font de reacTIVision-1.4-src.zip, on hi ha el README que s'hauria de llegir (ho faré més tard per tal de fer funcionar la webcam USB)

...
Before starting the reacTIVision application make sure you have
a supported camera connected to your system. The application will
obviously not work at all without a camera. When running the application 
will show a single video window with the current camera image in B&W.

Pressing the 'S' key will show to the original source image.
Pressing 'T' will show the binary tresholded image, pressing the
'N' key will turn the display off, which reduces the CPU usage.
...

funciona perfectament:

$ /usr/bin/reacTIVision

Instal.lacio del client

ara he d'instal.lar un client. Hi ha clients per a diversos llenguatges, n'hi ha un per a C++, tot i que és VC++. Hi ha un makefile:

$ make
...
TuioDemo.h:43:21: error: GL/glut.h: No such file or directory
...

glut fa referència a Open GL Utility Toolkit. Veig al Synaptic que està instal.lat el paquet freeglut3.

Instal.lo glut3, glut3-dev, freeglut3-dev, i ara sí que funciona el

$ make

i es genera els executables:

When running, the TuioClient client requests the OSCserver to listen on Port 3333 for tuio messages from reactivision. The Tuioclient translates these messages into a higher level protocol representing the movement and orientation marked objects and cursors. TuioDemo uses this protocol to create moving morphs whose movement and orientation matches that of the fiducial markers. Alternatively TuioDump simply prints out the location and orientation of markers to the Transcript.

Hi ha el fitxer fiducials.pdf per veure una col.lecció de fiducials que es poden utilitzar. (18 pàgines)

De moment l'únic que funciona és TuioDump, que només és una aplicació de consola.

els altres dos clients em dónen l'error

...
X Error of failed request:  BadRequest (invalid request code or no such operation)

però això sembla ser que és que no tinc ben instal.lat el driver propietari d'ATI (fglrx). No funcionen perquè són una aplicació gràfica, però amb TuioDump ja veig el funcionament.

Instal.lació II i utilització de la webcam USB

i si volem fer servir una webcam USB, com li diem?

$ /usr/bin/reacTIVision --help reacTIVision 1.4 (May 20 2009)

usage: reacTIVision -c [config_file] the default configuration file is reacTIVision.xml

$ ls /usr/share/reacTIVision/ amoeba camera.xml classic GPL.txt midi README.txt calibration CHANGELOG.txt dtouch LICENSE.txt reacTIVision.xml

El fitxer camera.xml és:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<portvideo>
    <camera id="0">
        <image color="false" width="max" height="max" />
        <settings brightness="default" gain="default" shutter="default" gamma="
        <!--
        <format7 xoff="0" yoff="0" />
        -->
    </camera>
</portvideo>

En el fitxer reacTIVision.xml la referència al fitxer camera.xml està comentada, i si la descomento, de fer l'aplicació fa un Segmentation fault.

La meva sospita de què <camera id="0"> significa utilitzar /dev/video0 quedarà confirmada més endavant.

Mentrestant llegeixo:

i més aviat m'ha despistat doncs diu que instal.li els drivers de v4l2 (quan de fet ja els tinc) i que per utilitzar /dev/video1 he de fer $ export V4L2_DEVICE=/dev/video1 (no és cert, en el codi ni en el Makefile no hi ha cap referència a V4L2_DEVICE)

compilem des de les fonts (reacTIVision-1.4-src), on hi ha el Readme, i dins la carpeta linux tinc el Makefile que m'interessa. No compila per culpa d'un fitxer relacionat amb 1394 (firewire). com que no és el meu cas, elimino tota referència a 1394:

common/CameraTool.h

#ifdef LINUX
...
//#include "../linux/DC1394Camera.h"

common/CameraTool.cpp

	#ifdef LINUX
	//camera = new DC1394Camera(config_file);
	//if( !camera->findCamera() ) delete camera;
	//else return camera;

i ara ja compila

$ make

i es genera l'executable a la mateixa carpeta linux/

Però no aconsegueixo utilitzar amb la càmera USB (Hercules). En el fitxer common/CameraTool.cpp faig una modificació per veure què passa:

	camera = new V4Linux2Camera(config_file);
	if( !camera->findCamera()) {
		printf("a1/n");
		delete camera;
	}
	else 
	{
		printf("a2/n");
		return camera;
	}

	#ifdef LINUX
	//camera = new DC1394Camera(config_file);
	//if( !camera->findCamera() ) delete camera;
	//else return camera;
	
	camera = new V4Linux2Camera(config_file);
	if( !camera->findCamera()) {
		printf("a1\n");
		delete camera;
	}
	else 
	{
		printf("a2\n");
		return camera;
	}

	camera = new V4LinuxCamera(config_file);
	if( !camera->findCamera()) {
		printf("b1\n");
		delete camera;
	}
	else 
	{
		printf("b2\n");
		return camera;
	}
	#endif
$ ./reacTIVision 
reacTIVision 1.4 (Nov 26 2010)
a2
camera: uvcvideo
...

però aquesta és la càmera integrada, la /dev/video0, que efectivament és v4l2

El config_file que es passa com a argument és el fitxer camera.xml, que es troba en el mateix directori que l'executable.

Solució: Bé, finalment ja ho he trobat, es tracta de ficar en el fitxer camera.xml que el device sigui el 1:

    <camera id="0"> -> es correspon a /dev/video0
    <camera id="1"> -> es correspon a /dev/video1

i oblidar-se de V4L2_DEVICE. I a més, encara que camera.xml estigui comentat al fitxer reacTIVision.xml, sí que és el fitxer de configuració de la càmera.

Per tant, la meva càmera Hercules funciona perfectament.

no cal compilar els drivers de v4l2. De fet, en la carpeta /dev ja existeix /dev/v4l

Projecte LlegirAmbFiducials: exercici de lectura per a la Maria

Es tracta d'utilitzar aquesta tecnologia per fer una aplicació didàctica d'ajuda a l'aprenentatge de la lectura. La Maria farà uns dibuixos (per ex, una nena, un cotxe, un arbre. Es retallen els dibuixos, s'enganxa per darrera un fiducial, i es plastifica.

Es programa una aplicació gràfica (SDL, pantalla completa). Quan la Maria acosta dos fiducials a la webcam integrada del portàtil, apareix una frase que la Maria ha de llegir. Hi pot haver una col.lecció completa de frases.

L'aplicació ja està feta: LlegirAmbFiducials.cpp i LlegirAmbFiducials.h. He aprofitat el codi dels clients de TUIO/CPP. Concretament, TuioDemo. Per veure la compilació i notes del projecte, llegir llegir.txt:

Compilació de LlegirAmbFiducials (versió 4 que passa a definitiva)

$ g++ -Wall -O3 -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -I./TUIO -I./oscpack -DOSC_HOST_LITTLE_ENDIAN -c -o LlegirAmbFiducials.o LlegirAmbFiducials.cpp
$ g++ -o LlegirAmbFiducials TUIO/TuioClient.o TUIO/TuioServer.o TUIO/TuioTime.o oscpack/osc/OscTypes.o oscpack/osc/OscOutboundPacketStream.o oscpack/osc/OscReceivedElements.o oscpack/osc/OscPrintReceivedElements.o oscpack/ip/posix/NetworkingUtils.o oscpack/ip/posix/UdpSocket.o LlegirAmbFiducials.o -L/usr/lib -lSDL_ttf

Finalment, automatitzem amb un script engegar el servidor i el client, i l'associem a una llençadora:

LlegirAmbFiducials.cpp i LlegirAmbFiducials.h estan en la carpeta TUIO_CPP, doncs es necessiten molts d'altres fitxers (include). Això sí, SDL i SDL_ttf ja estaven instal.lats i faig referència a aquestes llibreries a la ruta per defecte (on s'instal.len les llibreries a Linux per defecte, /usr/include/SDL).

LlegirAmbFiducials.sh:

#!/bin/bash
/home/joan/Baixades/reacTIVision-1.4-src/linux/reacTIVision &
sleep 6
/home/joan/Baixades/TUIO_CPP/LlegirAmbFiducials



creat per Joan Quintana Compte, novembre 2010

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines