Presentación 3DStereoglyph (Android App)

19
Julen Segura Instrumentación para visión Práctica final (Android App) Máster Oficial en Visión Artificial Universidad Rey Juan Carlos 06 de mayo de 2014

Transcript of Presentación 3DStereoglyph (Android App)

Julen SeguraInstrumentación para visión

Práctica final (Android App)Máster Oficial en Visión Artificial

Universidad Rey Juan Carlos

06 de mayo de 2014

Índice

2

Introducción ………………………………………... 3La aplicación 3DStereoglyph …………………………………………………...…… 3El 3D Esteoscópcio …………………………………………..………….……….......... 4Los anaglifos ………………..………………………………….…………………..………. 5

Requisitos …….………..………………………..….. 9Funcionamiento ……………………….……..…. 10

Inicio ………………………….……………….………..………………………………...… 10Cámara ….…………………………….…………….….…………………….………....... 11Procesado de imágenes ………….………………………..…………………….…. 12Resultado ………………………………………………..………………………………... 15Vídeo demostrativo ……………………………………..…….………………....…. 17

El futuro de 3DStereoglyph ……….…….…. 18Posibles mejoras de la aplicación ……………………………………..…..…… 19Continuidad de la aplicación ….…...…………………………………….......... 20

Introducción

La aplicación 3DStereoglyph

• ¿Qué hace?– Proporciona ayuda para tomar un par estéreo de imágenes

con una única cámara.– Convierte dicho par estéreo en una imagen 3D anaglífica

que puede ser visualizada con las gafas correspondientesen una pantalla estándar 2D.

• ¿Por qué?– Auge del mercado 3D.– La práctica totalidad de los dispositivos móviles:

• sólo dispone de una cámara.• tiene una pantalla 2D. 3

El 3D Estereoscópico

• Crea una sensación de profundidad a partir de un parestéreo de imágenes (dos imágenes de la mismaescena, con disparidad en el eje horizontal), llevandoa cada ojo únicamente la imagen que le corresponde.

4

Los anaglifos

• Codificación por colores de un par estéreo.

• El resultado es una única imagen que combina lainformación del ambas imágenes del par.

– Puede visualizarse en unapantalla 2D corriente.

– Requiere unas gafas confiltros de los coloresadecuados para suvisualización 3D.

5

• Existen diferentes combinaciones de colores.

– Verde/magenta, ámbar/azul,…

– La más común: rojo/cyan.

– Son colores complementarios

• Al pasar el color A a través de un filtrode color B, se elimina la informaciónde color y queda una imagen deintensidades en escala de grises.

• Al pasar el color A a través de un filtrode color A, la imagen no cambia.

• La unión de ambos contiene los trescanales RGB.

6

• Creación de anaglifos

7

– La imagen izquierda se codifica en cyan.• Para ello, en una imagen RGB se

eliminan la componente R.

• Se conservan G y B.

– La imagen derecha se codifica en rojo.• Para ello, en una imagen RGB se

eliminan las componentes G y B.

• Se conserva R.

– Al fusionar dichas imágenes (o crear una imagen apartir de los canales GB+R extraídos), se obtiene unanaglifo.

• Las zonas en que ambas imágenes coincidan tendrán los trescanales RGB, y por tanto recuperan su color original.

8

Requisitos para implementar 3DStereoglyph

Build Target:API level 11

Android 3.0 (HONEYCOMB)

que es el mínimo requerido para la

Librería:OpenCV 2.4.8

Guía de instalación e inclusión en un proyecto: [Tutorial on OpenCV]

9

FuncionamientoInicio Main.java (Activity)

layout_inicio.xml layout_instrucciones.xml

• Menú inicial y pantalla de instrucciones.

• Si no existen, se crean en la tarjeta SD los directorios necesarios.10

CámaraPhotoView.java (JavaCameraView)

Photo1.java (Activity) Photo 2.java (Activity)

layout_camaraview.xml

• SurfaceView

• ImageView

Imagen 1

Transparencia = 0.5

Imagen 2

Ayuda para alinear

11Nota: las funciones para abrir la cámara de los activity Photo1 y Photo2, y la función para tomar una imagende JavaCameraView, se extrajeron de los tutoriales “Mixed Processing” y “Camera control” de OpenCV 2.4.8.

Procesado de imágenes

Process3D.java (Activity)

layout_procesar3d.xml

• Intercambiar imágenes.

• Convertir a 3D.12

• Intercambiar imágenes:

13

public void onCreate(Bundle savedInstanceState) {

Options options = new Options(); options.inTempStorage = new byte[16*1024]; options.inSampleSize = 4; myBitmap= BitmapFactory.decodeFile(imageFileName, options);…

myImageView= (ImageView)findViewById(R.id.izquierda); myImageView.setImageBitmap(myBitmap);…}

public void onClick(View v) {int id = v.getId();if (id == R.id.boton1) {

cuenta_cambios=cuenta_cambios+1;cambiar();

} else if (id == R.id.boton2) { procesar(); }}

private void cambiar() {aux=myBitmap; myBitmap=myBitmap2; myBitmap2=aux;

myImageView= (ImageView)findViewById(R.id.izquierda);myImageView.setImageBitmap(myBitmap);…}

Si se pulsa “Cambiar”:-Se aumenta el contador.-Se llama a la función cambiar.

Si se pulsa “Convertir a 3D”:-Se llama a la función procesar.

Se asocian al ImageView en el que se vayan a mostrar.

Se cargan las imágenes en bitmaps con menor resolución para utilizar menos memoria.

Se carga el layout y se ponen los botones a la escucha.

Se intercambian los bitmapscon ayuda de un auxiliar.

Se vuelven a asociar a los ImageViewdonde se muestran.

Función cambiar

• Convertir a 3D:

14

public void procesar() {…zda = Highgui.imread(imageFileName);dcha = Highgui.imread(imageFileName2);

List<Mat> rgb_channel = new ArrayList<Mat>();Core.split(izda, rgb_channel);List<Mat> rgb_channel2 = new ArrayList<Mat>();Core.split(dcha, rgb_channel2);

Size size = izda.size(); imagen3D = new Mat(size,CvType.CV_8U); List<Mat> rgb_channel3 = new ArrayList<Mat>();

rgb_channel3.add(rgb_channel2.get(0)); rgb_channel3.add(rgb_channel2.get(1)); rgb_channel3.add(rgb_channel.get(2));

Core.merge(rgb_channel3, imagen3D);

SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");Date now = new Date();String imageFileName3 = Environment.getExternalStorageDirectory().toString()+"/3DStereoglyph/3D_images/"+ formatter.format(now) + "_3D.jpg";Highgui.imwrite(imageFileName3, imagen3D);

mostrar_resultado(imageFileName3);}

Se obtienen los canales B y G de la imagen izda. y el R de la imagen dcha.

Se unen en una matriz = imagen anaglífica.

Se separan las imágenes en sus canales (BGR).

Se preparan un array y una matriz para los canales y la matriz de la imagen final.

Se cargan las imágenes con OpenCV = matrices Mat. Cuál es Izda o dcha depende de cuántas veces se han intercambiado las imágenes tomadas (contador).

Se llama a la función que muestra el resultado.

Se guarda la imagen en el directorio, con un nombre único (fecha y hora) para evitar su sobreescritura.

Función procesar

Resultado

• Se muestra el resultado en layout_resultado.xml.

• Se guarda en el directorio de la aplicación.15

Otros resultados:

16

Vídeo demostrativo

https://www.youtube.com/watch?v=RDVqdDJc5DI

17

El futuro de 3DStereoglyph

Posibles mejoras de la aplicación

• En la captura de imágenes– Estabilización de la señal de entrada.

• En la conversión a 3D– Posibilidad de correcciones en la alineación de las

imágenes.– Otras codificaciones:

• Otros colores de anaglifos.• Codificaciones para pantallas estereoscópicas: side-by-side,

entrelazado, etc.

18

Continuidad de la aplicación

• Dispositivos con pantalla estereoscópicaAyuda en la toma de pares estéreo alineados.Conversión del par a 3D.

• Dispositivos con dos cámaras Ayuda en la toma de pares estéreo alineados.Conversión del par a 3D.

• Dispositivos con dos cámaras y pantalla estereoscópica Ayuda en la toma de pares estéreo alineados.Conversión del par a 3D.

19