Reconocimiento de patrones en Android con OpenCV. Rubén Serrano



Documentos relacionados
Taller de Programación Estructurada en Java Tema 2. Fundamentos de la programación orientada a objetos

TEMA 2. Agenda. Fundamentos de JAVA

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

El lenguaje de Programación C. Fernando J. Pereda

Introducción a Java LSUB. 15 de enero de 2015 GSYC

Curso Introducción JAVA Pág.: 1

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

JAVA NATIVE INTERFACE (JNI) INVOCANDO C/C++ DESDE JAVA

JavaScript. Contenidos. Introducción El lenguaje Validación de formularios. Programación en Internet DLSI - Universidad de Alicante 1

LENGUAJE. Tema 1 - Introducción

Tema 2. El lenguaje de programación Java (Parte 1)

Introducción a Java LSUB. 30 de enero de 2013 GSYC

FACULTAD DE INGENIERÍA

Prof. Dr. Paul Bustamante

Repaso de las características más importantes de la programación Java y su adaptación a Android

Práctica 2. Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones

Objetivo de aprendizaje del tema

Elementos léxicos del lenguaje de programación Java

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Ejercicios con OpenCV

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Tipos primitivos y clases de interés

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

Objective C (Desarrollo con Apple)

Ubicación e historia

2. Estructura de un programa en Java

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Introducción al lenguaje de programación java

Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.

TÉCNICAS DE PROGRAMACIÓN Lenguaje Java. Introducción a Java Daniel Finol

Estructura de datos y Programación

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Las Librerías OpenCV

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Los bloques DLL (Figura A.1) externos permiten al usuario escribir su propio código y

El entorno Vision - E Laboratory

Se guardan en archivos con extencion c y los cabezales con extension h

Informática I. Código Semestre Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones Profesor: Sebastián Isaza

Estructuras básicas de la programación en Java

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

2) Cual modificador limita el acceso a un método de una clase pública a los miembros de la misma clase?

Java para programadores

Construcciones del Lenguaje Java

Fundamentos del Lenguaje de Programación Java

CURSO de C++ Ignacio López

Programación Estructurada. Sesión 2:El lenguaje de programación C

Tema 2.- Objetos y mensajes

CONCEPTOS BASICOS DEL LENGUAJE JAVA

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Arquitecturas cliente/servidor

PROGRAMACIÓN EN JAVA

Estructuras de Datos Declaraciones Tipos de Datos

Tema 2. El lenguaje de programación Java. Arrays y cadenas

Impresión por pantalla. 3. Indicar la salida por pantalla (2 puntos-20 minutos)

Instituto Tecnológico de Celaya

Programación de Sistemas

Java es el lenguaje de programación que

Qué ofrece la programación en AutoCAD? Qué necesito para empezar a programar? Qué es C# y.net? Autor: Jorge A. Díez Pomares Laboratorio de C.A.D.

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Tema 4. Control de flujo. Programación Programación - Tema 4: Control de Flujo

Universidad de Pamplona Materia: Programación 1 Docente: Ing. Lusbin Raúl Vargas LENGUAJE C ESTRUCTURA DE UN PROGRAMA EN C

Universidad Central de Bayamón COLEGIO DE DESARROLLO EMPRESARIAL Y TECNOLOGIA. Número Estudiante:

Manipulación de Imágenes Raster en Android

La Plataforma J2SE (Java 7) PROGRAMA HOLA MUNDO

Clase adicional 3. Métodos. Temas

Nombre del curso: Seminario Desarrollo de sistemas embebidos en Android

Resumen Lenguaje Java

Gráficos por Computador

Gestor de aplicaciones Java. Esta herramienta es el intérprete de los archivos de clase generados por el javac (compilador).

James Gosling, creador de Java

FUNDAMENTOS DE JAVA PARA LA CONCURRENCIA

Tecnologías de Programación Web Dr. Diego C. Martínez. Depto de Cs e Ing. de la Computación Universidad Nacional del Sur.

INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL. Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones

Objetos y Clases en Java. ELO-329: Diseño y Programación Orientados a Objetos

INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

Universidad Autónoma de Tlaxcala. M.C. José Juan Hernández Mora. Primera Sesión

Tutorial 1. Instalación del entorno de desarrollo de Android. Curso de perfeccionamiento: Programación de Android TUTORIAL 1: INSTALACIÓN DEL SOFTWARE

Prof. Dr. Paul Bustamante

Lista de acrónimos... xv. Cómo leer este libro?... xvii

15. Parámetros o argumentos

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

10. Algunas clases estándar de Java (I)

Impresión por pantalla

Aprender los conceptos, manejo, usos y aplicación de heaps a fin de utilizarlos para el desarrollo de aplicaciones

Introducción a C++ Algoritmos y Estructuras de datos II Dra. Carmen Mezura Godoy. Febrero 2009

1. Funciones genéricas 2. Clases genéricas

POLIMORFISMO "una interfaz, múltiples métodos".

Desarrollar, usando Java, un cliente básico del protocolo web que permita enviar una solicitud HTTP a un servidor web y procesar la respuesta.

Tema 2. El lenguaje JAVA

TutorJava recomienda...

Bibliografía (Java) Java: Introducción a Java

Introducción al Lenguaje Java. ELO329: Diseño y Programación Orientados a Objetos

Elementos del lenguaje Java

Nombran variables, funciones, clases y objetos

Sebastián García Galán

El lenguaje C: Elementos básicos del lenguaje

Transcripción:

Reconocimiento de patrones en Android con OpenCV Rubén Serrano

1.Introducción 2.Herramientas de desarrollo 3.Proyecto 1.Código Android SDK 2.Código Android NDK 3.Código OpenCV

Introducción Formas de trabajar con OpenCV Java API Librerías nativas (C/C++)

Herramientas...... que vamos a utilizar hoy Eclipse Android SDK Android NDK http://www.eclipse.org/downloads/ http://developer.android.com/sdk/index.html OpenCV http://developer.android.com/sdk/ndk/index.html http://opencv.willowgarage.com/wiki/installguide

Herramientas Compilación de OpenCV para Android Linux i Windows http://opencv.willowgarage.com/wiki/androidtrunk el Unix de la manzana El enlace anterior, y whichlight.com/blog

Proyecto App en el Android Market Buscar: Demo Reconocimiento Patrones https://market.android.com/details?id=org.cvc.gtugbcn.patrec Proyecto base para Eclipse http://deic.uab.cat/~rserrano/android/proyecto.tar.gz Estas transparencias http://deic.uab.cat/~rserrano/android/patternrecog.pdf

Código Android SDK Añadir llamadas a código nativo En la clase SampleView public native long ObtainPattern(int width, int height, byte yuv[], int[] rgba); public native void FindPattern(long processor, int width, int height, byte yuv[], int[] rgba); static { System.loadLibrary("pattern_recognition"); En processframe, en el switch case MainActivity.PATTERN_RECORD: mprocessor = ObtainPattern(getFrameWidth(), getframeheight(), data, rgba); MainActivity.mProcessMode = MainActivity.VIDEO_MODE; break; case MainActivity.INSPECTION_MODE: FindPattern(mProcessor, getframewidth(), getframeheight(), data, rgba); break;

Código JNI / OpenCV Método ObtainPattern jbyte* _yuv = env->getbytearrayelements(yuv, 0); jint* _bgra = env->getintarrayelements(bgra, 0); Mat matgray(height, width, CV_8UC1, (unsigned char *)_yuv); Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv); Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra); Processor* processor = new Processor(); processor->obtainpattern(matgray); drawtext(mbgra, "Patron adquirido"); return (long)processor; env->releaseintarrayelements(bgra, _bgra, 0); env->releasebytearrayelements(yuv, _yuv, 0);

Código OpenCV (Patrón) Constructor de Processor storage = cvcreatememstorage(0); params = cvsurfparams(500, 1); Función obtainpattern() objectkeypoints = 0; objectdescriptors = 0; cvextractsurf( &(static_cast<iplimage>(imgmat)), 0, &objectkeypoints, &objectdescriptors, storage, params );

Código JNI / OpenCV Método FindPattern jbyte* _yuv = env->getbytearrayelements(yuv, 0); jint* _bgra = env->getintarrayelements(bgra, 0); Mat matgray(height, width, CV_8UC1, (unsigned char *)_yuv); Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv); Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra); //Please make attention about BGRA byte order //ARGB stored in java as int array becomes BGRA at native level cvtcolor(myuv, mbgra, CV_YUV420sp2BGR, 4); Processor* processor = (Processor*) pprocessor; processor->detectanddrawfeatures(mbgra, matgray); env->releaseintarrayelements(bgra, _bgra, 0); env->releasebytearrayelements(yuv, _yuv, 0);

Código OpenCV Función detectanddrawfeatures() IplImage img = greymat; int i; imagekeypoints = 0; imagedescriptors = 0; cvextractsurf( &img, 0, &imagekeypoints, &imagedescriptors, storage, params ); CvPoint src_corners[4] = {{0,0, {img.width,0, {img.width, img.height, {0, img.height; CvPoint dst_corners[4]; if( locateplanarobject( objectkeypoints, objectdescriptors, imagekeypoints, imagedescriptors, src_corners, dst_corners )) { for( i = 0; i < 4; i++ ) { CvPoint r1 = dst_corners[i%4]; CvPoint r2 = dst_corners[(i+1)%4]; line(imgmat, cvpoint(r1.x, r1.y), cvpoint(r2.x, r2.y), CV_RGB(0, 0, 0), 6, CV_AA); drawtext(imgmat, "Found ya!");

Código OpenCV Función locateplanarobject() double h[9]; CvMat _h = cvmat(3, 3, CV_64F, h); vector<int> ptpairs; vector<cvpoint2d32f> pt1, pt2; CvMat _pt1, _pt2; int i, n; flannfindpairs(objectdescriptors, imagedescriptors, ptpairs ); n = (int)(ptpairs.size()/2); if( n < 4 ) return 0; pt1.resize(n); pt2.resize(n); for( i = 0; i < n; i++ ) { pt1[i] = ((CvSURFPoint*)cvGetSeqElem(objectKeypoints,ptpairs[i*2]))->pt; pt2[i] = ((CvSURFPoint*)cvGetSeqElem(imageKeypoints,ptpairs[i*2+1]))->pt;

Código OpenCV _pt1 = cvmat(1, n, CV_32FC2, &pt1[0] ); _pt2 = cvmat(1, n, CV_32FC2, &pt2[0] ); if(!cvfindhomography( &_pt1, &_pt2, &_h, CV_RANSAC, 5 )) return 0; for( i = 0; i < 4; i++ ) { double x = src_corners[i].x, y = src_corners[i].y; double Z = 1./(h[6]*x + h[7]*y + h[8]); double X = (h[0]*x + h[1]*y + h[2])*z; double Y = (h[3]*x + h[4]*y + h[5])*z; dst_corners[i] = cvpoint(cvround(x), cvround(y)); return 1;

Código OpenCV Función flannfindpairs() int length = (int)(objectdescriptors->elem_size/sizeof(float)); Mat m_object(objectdescriptors->total, length, CV_32F); Mat m_image(imagedescriptors->total, length, CV_32F); // copy descriptors CvSeqReader obj_reader; float* obj_ptr = m_object.ptr<float>(0); cvstartreadseq( objectdescriptors, &obj_reader ); for(int i = 0; i < objectdescriptors->total; i++ ) { const float* descriptor = (const float*)obj_reader.ptr; CV_NEXT_SEQ_ELEM( obj_reader.seq->elem_size, obj_reader ); memcpy(obj_ptr, descriptor, length*sizeof(float)); obj_ptr += length; CvSeqReader img_reader; float* img_ptr = m_image.ptr<float>(0); cvstartreadseq( imagedescriptors, &img_reader ); for(int i = 0; i < imagedescriptors->total; i++ ) { const float* descriptor = (const float*)img_reader.ptr; CV_NEXT_SEQ_ELEM( img_reader.seq->elem_size, img_reader ); memcpy(img_ptr, descriptor, length*sizeof(float)); img_ptr += length;

Código OpenCV // find nearest neighbors using FLANN Mat m_indices(objectdescriptors->total, 2, CV_32S); Mat m_dists(objectdescriptors->total, 2, CV_32F); flann::index flann_index(m_image, flann::kdtreeindexparams(4)); // using 4 randomized kdtrees flann_index.knnsearch(m_object, m_indices, m_dists, 2, flann::searchparams(64) ); // maximum number of leafs checked int* indices_ptr = m_indices.ptr<int>(0); float* dists_ptr = m_dists.ptr<float>(0); for (int i=0;i<m_indices.rows;++i) { if (dists_ptr[2*i]<0.6*dists_ptr[2*i+1]) { ptpairs.push_back(i); ptpairs.push_back(indices_ptr[2*i]);

APM? Muchas gracias por vuestra atención!