Biblioteca de geometr´ıa proyectiva PROGEO

Anuncio
Biblioteca de geometrı́a proyectiva PROGEO
José M. Cañas, A. Pineda, M. Mendoza, V. Hidalgo
Universidad Rey Juan Carlos, 21 de octubre de 2014
Resumen
Este manual explica cómo utilizar la biblioteca PROGEO para realizar
cálculos de geometrı́a proyectiva. Estos cálculos permiten procesar la información de puntos geométricos en el espacio 3D para obtener sus proyecciones
en un plano imagen determinado. Mediante estas proyecciones, los puntos 3D
pueden ser visualizados en un monitor, empleando para ello algún gestor gráfico. De igual forma, los cálculos pueden ser realizados a la inversa, de manera
que a partir de varias proyecciones de un punto, podamos obtener las coordenadas 3D del mismo. Para los cálculos de proyección y retroproyección es
indispensable contar con un punto de mira, que viene determinado mediante
una cámara virtual o un par estereoscópico (dos cámaras alineadas en dos ejes
y separadas por una distancia fija en el tercero). Cada uno de estos elementos
de visualización dispone de un plano imagen sobre el que se podrán realizar
proyecciones de puntos 3D, o utilizar las proyecciones en los mismos para las
retroproyecciones.
Índice
1. Introducción
1.1. Importancia de los gráficos en 3D . . . . . . . . . . . . . . . . . . . .
1.2. Biblioteca PROGEO . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
2
2. Estructura de la biblioteca
2.1. Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Definiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
6
8
3. Ejemplos de uso de la biblioteca
8
3.1. Ejemplo de proyección . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2. Ejemplo de retroproyección . . . . . . . . . . . . . . . . . . . . . . . . 10
4. Integración de cámaras procedentes de otras plataformas
12
4.1. Importando cámaras de Gazebo . . . . . . . . . . . . . . . . . . . . . 12
4.2. Importando cámaras de ARToolKit . . . . . . . . . . . . . . . . . . . 13
1
1 INTRODUCCIÓN
1.
1.1.
2
Introducción
Importancia de los gráficos en 3D
En la actualidad, los gráficos 3D han revolucionado la manera de visualizar los
resultados en las aplicaciones. Puesto que el mundo que nos rodea consta de tres
dimensiones, con el tiempo se ha vuelto necesario representar la información visual
con semejantes caracterı́sticas a cómo el ser humano las percibe con la vista. Hasta
hace poco tiempo esta tarea resultaba costosa computacionalmente debido a la escasa capacidad de cómputo de los ordenadores personales en cuanto a información
gráfica se refiere. No obstante, en la actualidad, prácticamente cualquier computadora doméstica posee microprocesadores suficientemente potentes como para que
esta labor se realice en tiempo real.
La facilidad para generar gráficos en tres dimensiones por ordenador han contribuı́do de manera notable al avance de muchas otras areas cientı́ficas, que antes veı́an
mermadas sus posibilidades de simulación de sucesos al no disponer de la tecnologı́a
suficiente para probar los estudios realizados. De esta manera, hoy en dı́a es posible
practicar reproducciones geológicas disponiendo de un mapa en 3D de un terreno,
estudiar en detalle la morfologı́a de diferentes especies para avanzar en el estudio de
la evolución, o incluso simular los posibles efectos y resultados de un transbordador
espacial antes del lanzamiento real (Figura 1).
Figura 1: Representaciones en 3D
Con este propósito, han aparecido en el mercado diversas herramientas de visualización (The Visualization ToolKit, ... [más herramientas] ...) ası́ como varios
motores de generación de gráficos, algunos de libre uso y distribución (OpenGL y
Ogre) y otros de carácter privativo (DirectX). El motor gráfico de procesamiento de
estos entornos aprovecha las capacidades de cálculo en tiempo real de la mayorı́a de
las tarjetas gráficas existentes en el mercado, constituyendo de esta forma estándares de generación de gráficos que acompañan por defecto a los distintos sistemas
operativos (DirectX en Microsoft Windows y OpenGL y Ogre en Linux y MacOS).
Por todo ello, hoy resulta muy sencillo utilizar estos entornos para generar gráficos
por ordenador y este hecho, junto con la reducción de precios en las tarjetas gráficas
y aceleradoras, han permitido que cada vez más organismos de investigación dispongan de esta tecnologı́a para sus diferentes estudios.
1 INTRODUCCIÓN
3
En este manual se describe y se resume el funcionamiento de parte de la tecnologı́a sobre la que se fundamentan los motores gráficos que se han comentado antes.
En el interior de estos entornos se utilizan implementaciones informáticas de técnicas matemáticas sobre geometrı́a proyectiva. Esta rama de la geometrı́a aporta las
operaciones algebráicas matriciales subyacentes en la generación de gráficos 3D.
1.2.
Biblioteca PROGEO
La biblioteca PROGEO se basa en las directrices de geometrı́a proyectiva aplicadas por Richard Hartley y Andrew Zisserman [?]. Utiliza el modelo de cámara
Pinhole (Figura 2) para las operaciones de proyección de puntos 3D. Aunque no es
el único tipo, el modelo Pinhole es el modelo de cámara más común.
Figura 2: Modelo de cámara Pinhole
En este modelo se asume que cualquier punto P (x, y, z) se proyecta en el plano
de imagen através de otro único punto llamado Centro óptico. La recta que une el
punto P y el centro óptico se denomina Lı́nea de proyección e intersecta al plano
imagen justo en el pixel p(0 x0 ,0 y 0 ), que es la proyección de P (x, y, z). El centro óptico
esta situado a la Distancia focal del plano imagen. Este modelo lo completan el Eje
óptico, que es una lı́nea perpendicular al plano imagen y que atraviesa al centro
óptico, y también el Plano focal, que es el plano perpendicular al eje óptico cuyos
puntos no se proyectan en el plano imagen, incluyendo al centro óptico.
2 ESTRUCTURA DE LA BIBLIOTECA
4
De esta manera, las operaciones matemáticas sobre puntos 3D se realizan siempre referidas a una cámara determinada, cuyas caracterı́sticas están determinadas
por el modelo ya comentado. También es posible realizar las transformaciones algebráicas en referencia a un par estéreo de cámaras (a su plano imagen). Dichas
transformaciones son siempre referidas hacia puntos 3D, ya que de momento no se
contempla el uso de lineas o curvas en el espacio.
Basandose en este modelo de cámara, PROGEO como biblioteca informática de
programación define los tipos de datos y funciones apropiadas para poder realizar
los cálculos geométricos que se necesiten. La biblioteca está programada en lenguaje
C, permitiendo su integración en proyectos basados en este lenguaje o también en
proyectos de lenguaje C++ (independientemente del sistema operativo y entorno de
programación del proyecto).
2.
Estructura de la biblioteca
Una vez introducida la biblioteca PROGEO, se detallan a continuación los tipos
de datos y operaciones que proveé la biblioteca para los cálculos geométricos.
2.1.
Tipos de datos
HPoint2D
El tipo de punto 2D de la biblioteca permite almacenar la información de un
punto en un plano (normalmente el plano imagen). La estructura por tanto es la de
dos coordenadas (x,y) y una tercera coordenada que indica ... [no me acuerdo que
indicaba h en el punto 2D]...
typedef struct {
float x;
float y;
float h;
} HPoint2D;
HPoint3D
El punto 3D en la biblioteca posibilita la representación conceptual de un punto
en el espacio. La estructura está compuesta de tres coordenada (X,Y,Z) y una tercera coordenada H que indica el cuadrante en el que se encuentra el punto (delante,
detrás o coincidente con el plano imagen).
typedef
float
float
float
struct {
X;
Y;
Z;
2 ESTRUCTURA DE LA BIBLIOTECA
5
float H;
} HPoint3D;
TPinholeCamera
La estructura TPinholeCamera representa un tipo de cámara de modelo Pinhole.
Toda cámara Pinhole se define por sus parámetros intrı́nsecos y parámetros
extrı́nsecos.
Los extrı́nsecos se componen principalmente por dos puntos 3D (position y foa) y un
ángulo expresado en radianes (roll ). El primer punto indica la posición de la cámara
en el espacio, mientras que el segundo (foco de atención) permite trazar junto al
primero un vector tridimensional y, de esta forma, indicar hacia donde está dirigida
la observación de la cámara. Cada una de las coordenadas de estos puntos se expresan en milı́metros. El tercer elemento es el ángulo que forma la cámara con respecto
a un eje virtual que serı́a paralelo al vector definido por su posición y su foco de
atención.
Adicionalmente, los parámetros intrı́nsecos de la cámara equivalen a fdist, u0 y
v0. El primer parámetro es la distancia focal (distancia desde el foco de la cámara
al plano imagen). El segundo y tercer parámetro indican la cantidad de pı́xeles en
alto (u0) y ancho (v0) que ocupa un centı́metro en el plano imagen de la cámara.
Por otro lado una cámara pinhole dispone de una matriz K (definida mediante
los elementos k11..k34 ) y una matriz de rotación y translación (definida mediante los
parámetros rt11..rt44 ), creadas a partir de sus parámetros intrı́nsecos e extrı́nsecos.
Los parámetros tr y bl equivalen a dos puntos 3D que especifican el punto más
alto y a la derecha del plano imagen, y el punto más bajo y a la izquierda del mismo
plano. Mediante estos dos puntos se puede construir un rectángulo que equivaldrı́a
al plano imagen de la cámara en el espacio.
Por último, un tipo cámara Pinhole posee un nombre (name) que la permite
diferenciarse de otras cámaras utilizadas en el mismo entorno.
typedef struct {
HPoint3D position;
HPoint3D foa;
float roll;
float fdist;
float u0,v0;
float k11,k12,k13,k14,k21,k22,k23,k24,k31,k32,k33,k34;
float rt11,rt12,rt13,rt14,rt21,rt22,rt23,rt24,rt31,rt32,
rt33,rt34,rt41,rt42,rt43,rt44;
2 ESTRUCTURA DE LA BIBLIOTECA
6
HPoint3D tr, bl;
char name[256];
} TPinHoleCamera;
TPinholeStereoCamera
El tipo de datos TPinholeStereoCamera representa un tipo de cámara estéreo
basada en el modelo de cámara Pinhole. Este tipo de cámara se caracteriza por estar
compuesta de dos cámaras sencillas (TPinholeCamera camera1 y camera2 ) separada entre sı́ por una distancia fija baseline. Toda cámara de este tipo se compone (al
igual que una cámara sencilla) de una posición 3D (position) y un segundo punto
3D (foa) que permite crear un vector con el primero que indique la dirección de
observación de la cámara, además del ángulo que forma con respecto al vector de
esa dirección (roll ).
Por otra parte, existe la posibilidad de diferenciar distintas cámaras de este tipo
mediante el elemento name, que permite asignar un nombre a la cámara para distinguirla del resto.
typedef struct {
HPoint3D position;
HPoint3D foa;
float roll;
TPinHoleCamera camera1;
TPinHoleCamera camera2;
float baseline;
char name[256];
} TPinHoleStereocamera;
2.2.
Funciones
Update Camera Matrix
Esta función se encarga de actualizar la matriz K y la matriz de rotación y
translación para una determinada cámara simple con los nuevos valores de la misma
dependiendo de sus parámetros intrı́nsecos e extrı́nsecos.
La operación debe invocarse tras efectuar un cambio en algún parámetro de la
cámara tal como: modificar su distancia focal, mover la cámara a otra posición o
modificar su foco de atención, determinar un giro de la cámara sobre si misma mediante el elemento roll, etc.
Su cabecera de invocación es la siguiente:
2 ESTRUCTURA DE LA BIBLIOTECA
7
extern void update_camera_matrix(TPinHoleCamera *camera);
Update StereoCamera Matrix
Al igual que la anterior, esta función calcula las matrices K y de rotación y translación para las dos cámaras que componen un par estereoscópico. Estas se calculan a
partir de los parámetros intrı́nsecos e extrı́nsecos de cada cámara y de la separación
entre ambas.
De nuevo, la operación se debe invocar tras efectuar un cambio en alguno de
estos parámetros.
Su cabecera de invocación es la siguiente:
extern void update_stereocamera_matrix(TPinHoleStereocamera *stereo);
Project
La función de proyección permite proyectar un punto 3D sobre el plano imagen
de una cámara, para obtener el punto 2D contenido en el mismo. Esta función permite visualizar un punto 3D sobre el plano imagen de una cámara, y de esta forma
dibujarlo sobre un monitor plano.
La cabecera de la función recibe un punto 3D y una cámara como entradas y
devuelve un punto 2D como salida:
int project(HPoint3D in, HPoint2D *out, TPinHoleCamera camera);
Un ejemplo práctico de esta función se puede encontrar en el apartado 3.1.
Backproject
La función de retroproyección efectúa la operación inversa a la anterior. Mediante esta función se puede obtener las coordenadas 3D de un punto proyectado en
varios planos imagen de diferentes cámaras. Para ello, dado un punto 2D contenido en el plano imagen de una cámara concreta, permite obtener la representación
3D de ese punto. Esa representación, junto con el foco de la cámara desde la que se
observe, permite trazar un segmento en el espacio que contiene al punto 3D buscado.
De esta forma, si se realiza la misma operación para el mismo punto pero desde
otro cámara (con otra proyección 2D distinta), es posible hayar un nuevo vector
director, que o bien corta o se cruza con el anterior. El punto de cruce en el espacio
es precisamente el punto 3D buscado.
La cabecera de la función, por tanto, recibe un punto 2D y la cámara concreta
del plano imagen como entradas, y devuelve un punto 3D (la representación 3D del
punto 2D de entrada):
int backproject(HPoint3D *out, HPoint2D in, TPinHoleCamera camera);
Un ejemplo práctico de esta función se puede encontrar en el apartado 3.2.
2 ESTRUCTURA DE LA BIBLIOTECA
8
DisplayLine
La función permite saber si una determinada lı́nea formada por dos puntos 2D se
puede visualizar dentro de un plano imagen de un tamaño concreto (normalmente
320x240 pı́xeles).
Para ello determina si dicho segmento se encuentra por delante o por detrás del
plano imagen, y en caso de encontrarse delante, determina los puntos 2D correctos
para poder ser dibujados sobre el plano, siempre y cuando este segmento se encuentre dentro del área visible por dicho plano. En tal caso, se devuelven dichos puntos
para poder ser mostrados en un monitor.
La cabecera de la función, por tanto, consiste en dos puntos 2D de entrada (los
que determinan el segmento) y dos puntos 2D de salida (los puntos correctos para
ser visualizados):
int displayline(HPoint2D p1, HPoint2D p2, HPoint2D *a, HPoint2D *b);
Un ejemplo práctico de esta función se puede encontrar en el apartado 3.1.
Display Camera Info
Esta función sirve exclusivamente para mostrar en consola la información de una
cámara concreta. Para ello, imprime por salida estándar la información completa de
una cámara (con todos sus parámetros).
Su cabecera es la siguiente:
void display_camerainfo(TPinHoleCamera camera);
2.3.
Definiciones
Parámetros intrı́nsecos de la cámara Apple iSight
Estas definiciones equivalen a los parámetros intrı́nsecos basados en el modelo
Pinhole determinados para una cámara Apple iSight.
#define ISIGHT_PINHOLE_FDIST 405.4
#define ISIGHT_PINHOLE_U0 142.6
#define ISIGHT_PINHOLE_V0 150.4
Cálculo de distancias
Los siguientes macros permiten calcular las distancias euclı́deas para puntos 2D
y puntos 3D dentro de la biblioteca PROGEO.
#define DIST2D(p1,p2) sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))
#define DIST3D(p1,p2) sqrt((p1.X-p2.X)*(p1.X-p2.X)+(p1.Y-p2.Y)*(p1.Y-p2.Y)
+(p1.Z-p2.Z)*(p1.Z-p2.Z))
3 EJEMPLOS DE USO DE LA BIBLIOTECA
3.
9
Ejemplos de uso de la biblioteca
En esta sección del manual se muestran algunos ejemplos de las funciones más
comunes que se utilizan en PROGEO. Estos ejemplos enseñan algunos ejemplos
prácticos de dichos procedimientos aplicados principalmente a visualización de gráficos en 3D.
Estas funciones son las de proyección y retroproyección de puntos.
3.1.
Ejemplo de proyección
En este código se utiliza la función de proyección para proyectar un conjunto de
lı́neas formadas por puntos en 3D que conforman el plano de una habitación.
En dicha habitación existen dos cámaras que visualizan diferentes perspectivas
de la misma. Mediante esta función podemos, en todo momento, dibujar las proyecciones 2D de estas lı́neas en el plano imagen de cada cámara.
...
/* Suponemos que las siguientes cámaras tienen los parámetros definidos.*/
TPinholeCamera camera1,camera2;
/* Suponemos que tenemos una lista de puntos, donde los puntos pares
equivalen a puntos inicio de lı́nea y los impares son finales de lı́nea.*/
HPoint3D lineList[MAX_LINES*2];
/* Disponemos de dos buffers de memoria que se visualizarán en
pantalla y que se inicializarán pintados de color blanco.*/
unsigned char buffer1[MAX_HEIGHT*MAX_WIDTH*COLOR_DEPTH];
unsigned char buffer2[MAX_HEIGHT*MAX_WIDTH*COLOR_DEPTH];
setWhiteBuffer(&buffer1);
setWhiteBuffer(&buffer2);
...
/* Declaramos los puntos 2D necesarios para el dibujado.*/
HPoint2D auxPoint1,auxPoint2;
HPoint2D goodAuxPoint1,goodAuxPoint2;
/* Obtenemos las proyecciones de cada punto y dibujamos en el buffer. */
for(int i=0;i<MAX_LINES;i++)
{
3 EJEMPLOS DE USO DE LA BIBLIOTECA
10
/* PROYECCIONES DE LAS LINEAS 3D EN LA CAMARA 1.*/
project(lineList[i],&auxPoint1,camera1);
project(lineList[i+1],&auxPoint2,camera1);
/* Obtengo los puntos 2D correctos tras comprobar que se
encuentran dentro del plano imagen y que se pueden visualizar
en el mismo .*/
if(displayline(auxPoint1,auxPoint2,&goodAuxPoint1,&goodAuxPoint2))
{
/* Dibujo en el buffer de la camara 1 en color negro si se
visualiza correctamente en el plano imagen.*/
lineinimage(goodAuxPoint1,goodAuxPoint2,FL_BLACK,&buffer1);
}
/* PROYECCIONES DE LAS LINEAS 3D EN LA CAMARA 2.*/
project(lineList[i],&auxPoint1,camera2);
project(lineList[i+1],&auxPoint2,camera2);
if(displayline(auxPoint1,auxPoint2,&goodAuxPoint1,&goodAuxPoint2))
{
lineinimage(goodAuxPoint1,goodAuxPoint2,FL_BLACK,&buffer2);
}
}/* Fin del bucle for.*/
...
/* FIN DE CODIGO */
Figura 3: Ejemplo de proyección
El resultado, si de dibujara con algún gestor gráfico, serı́a el que muestra la
figura 3, donde se aprecian las dos perspectivas captadas por las cámaras enfocando
al suelo de la habitación.
3 EJEMPLOS DE USO DE LA BIBLIOTECA
3.2.
11
Ejemplo de retroproyección
En el siguiente ejemplo veremos una muestra de triangulación para obtener las
coordenadas 3D de un punto en el espacio, que se proyecta en el plano imagen de
dos cámaras distintas.
En primer lugar se hayará la recta que une el foco de la cámara 1 con el punto
3D donde se situa la proyección del punto en el espacio. Se realizará de la misma
forma para la cámara 2.
Una vez definidas las dos rectas, hayaremos el cruce o intersección de las mismas
en el espacio dando como resultado el punto 3D buscado.
...
/* Suponemos que las siguientes cámaras tienen los parámetros definidos.*/
TPinholeCamera camera1,camera2;
/* Translación de coordenadas Graficas a Opticas y viceversa. */
#define GRAPHIC_TO_OPTICAL_X(x,y) (SIFNTSC_ROWS-1-y)
#define GRAPHIC_TO_OPTICAL_Y(x,y) (x)
#define OPTICAL_TO_GRAPHIC_X(x,y) (y)
#define OPTICAL_TO_GRAPHIC_Y(x,y) (SIFNTSC_ROWS-1-x)
/* Suponemos que disponemos de la posición en pı́xeles del punto 3D.*/
int pointxCam1,pointyCam1;
int pointxCam2,pointyCam2;
...
/* Primeramente definimos puntos auxiliares.*/
HPoint2D auxPoint2DCam1,auxPoint2DCam2;
HPoint3D auxPoint3DCam1,auxPoint3DCam2;
/* Obtenemos los
auxPoint2DCam1.x
auxPoint2DCam1.y
auxPoint2DCam1.h
puntos 2D a partir de las coordenadas opticas.*/
= GRAPHIC_TO_OPTICAL_X(pointxCam1,pointyCam1);
= GRAPHIC_TO_OPTICAL_Y(pointxCam1,pointyCam1);
= 0;
auxPoint2DCam2.x = GRAPHIC_TO_OPTICAL_X(pointxCam2,pointyCam2);
auxPoint2DCam2.y = GRAPHIC_TO_OPTICAL_Y(pointxCam2,pointyCam2);
auxPoint2DCam2.h = 0;
/* Obtenemos los puntos 3D donde se encuentran los puntos 2D.*/
backproject(&auxPoint3DCam1,auxPoint2DCam1,camera1);
4 INTEGRACIÓN DE CÁMARAS PROCEDENTES DE OTRAS PLATAFORMAS12
backproject(&auxPoint3DCam2,auxPoint2DCam2,camera2);
/* Ahora con los dos puntos 3D obtenidos y la posición de los focos
de cada cámara podemos calcular dos rectas en el espacio.*/
...
4.
4.1.
Integración de cámaras procedentes de otras
plataformas
Importando cámaras de Gazebo
En este apartado vamos a ver como importar las imágenes sintéticas generadas
por la cámara simulada de gazebo a progeo. La idea es entender la relación entre
el modelo de cámara opengl (que es el que usa gazebo), con el modelo de cámara
progeo (que es el que usa jde).
La gran diferencia entre estos dos modelos, se encuentra en como define cada uno
los parametros intrı́nsecos, opengl (Gazebo) maneja relación de aspecto y progeo
maneja focal y centro óptico. Por otro lado los parametros extrı́nsecos, son iguales
para ambos modelos (foco de atención y un roll).
Pero vayamos por partes, primero vamos a ver el modelo de cámara de gazebo.
Gazebo usa la proyección perspectiva de Opengl estándar (modelo pinhole). La relación de aspecto para cada cámara esta definida por cuatro atributos:
El ángulo de vista horizontol (fovy)
El ratio de aspecto (ancho/altura)
Las distancias nearClip y farClip. Con la distancia nearClip, haremos que la
cámara que no vea objetos que están a un distancia menor que ésta, Y con
la distancia farClip haremos que la cámara no vea objetos que están a una
distancia mayor que ésta
Estos cuatro parámetros, lo podemos ver en la figura 4 gráficamente para poder
entenderlos mejor.
Una vez visto el modelo de cámara Gazebo, vamos a pasar a ver como importar
este modelo a PROGEO. Antes hemos hablado de que los parámetros intrı́nsecos
de progeo se basan en la distancia focal y el centro óptico. Al estar trabajando
con una cámara simulada, esta tendrá una calibración ideal por lo que el centro
óptico será (120,160). Sin embargo, obtener la focal no es tan fácil. Dicha focal la
calculamos a partir de la fórmula 1, que es la que relaciona PROGEO con Gazebo.
4 INTEGRACIÓN DE CÁMARAS PROCEDENTES DE OTRAS PLATAFORMAS13
Figura 4: Modelo de cámara de Gazebo
altura
(1)
2f
Despejando de la fórmula anterior, obtenemos la fórmula para calcular la focal.
Φ = 2 arctan
f=
altura
2 tan Φ2
(2)
Siendo: f la distancia focal, altura el número de pixeles de la imagen a lo alto y
Φ el ángulo de apertura.
4.2.
Importando cámaras de ARToolKit
ARToolKit 1 es una herramienta de calibración desarrollada en conjunto por las
universidades de Osaka, Washington y Canterbury. Mediante una serie de patrones
diferentes nos ayuda a obtener los parametros intrı́nsecos y extrı́nsecos de la cámara.
Con los programas de calibración (calib dist y calib cparam) obtenemos el centro de
la imagen, la distorsión por el tamañoo de los pı́xeles y la distancia focal. Con exview
obtenemos los parametros extrı́nsecos, un vector 3D con la posición de la cámara y
un quaternion que nos indica hacia dónde mira la cámara y el roll con el que lo hace.
La estructura del tipo cámara en la biblioteca PROGEO puede consultarse en
el apartado 2.1.
Esta estructura la rellenamos con los datos que nos da ARToolKit. Con los programas de calibración obtendremos la distancia focal (fdist) y el centro de la imagen
(u0,v0 ), y los demás datos que forman parte de la matriz K (k11,k12,k13,k14,k21,k22...):


fh s u 0
fv v0 
K=
 0

0 0 1
1
http://www.hitl.washington.edu/artoolkit/download/
4 INTEGRACIÓN DE CÁMARAS PROCEDENTES DE OTRAS PLATAFORMAS14
Figura 5: Ejecución normal de exview
Con exview obtendremos la posicion de la cámara (position) y el resto de parámetros de la matriz de rotación+traslación(rt11,rt12,rt13,rt14,rt21,rt22...) los obtendremos a partir del quaternión mediante las siguientes ecuaciones:
RT =
R | − RC
0 0 0 1
!
rt11 = qw2 + qx2 − qy2 − qz2
rt12 = 2 ∗ (qx ∗ qy − qw ∗ qz )
rt13 = 2 ∗ (qw ∗ qy + qx ∗ qz )
rt14 = −x ∗ rt11 − y ∗ rt12 − z ∗ rt13
rt21 = 2 ∗ (qx ∗ qy + qw ∗ qz )
rt22 = qw2 − qx2 + qy2 − qz2
rt23 = 2 ∗ (qy ∗ qz − qw ∗ qx )
rt24 = −x ∗ rt21 − y ∗ rt22 − z ∗ rt23
rt31 = 2 ∗ (qx ∗ qz − qw ∗ qy )
rt32 = 2 ∗ (qw ∗ qx + qy ∗ qz )
rt33 = qw2 − qx2 − qy2 + qz2
rt34 = −x ∗ rt31 − y ∗ rt32 − z ∗ rt33
rt41 = 0
rt42 = 0
rt43 = 0
rt44 = 1
Sólo resta una observación, y es que en ARToolKit se trabaja con imágenes en
un tamaño de 640x480 por lo que, si se trabaja con imágenes en 320x240, tendremos
que dividir por la mitad tanto el centro de la imagen como la distancia focal.
Descargar