Ejercicios con OpenCV

Documentos relacionados
Manejo de BibliotecasOpencv

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Programación 1 Tema 5. Instrucciones simples y estructuradas

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Programación 1 Tema 5. Instrucciones simples y estructuradas

Introducción a C++ y Code::Blocks

Lenguaje de Programación: C++ Repaso de Material C++

Cátedra I Informática Autor I Carlos Bartó

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Macros LENGUAJE DE PROGRAMACIÓN ESTRUCTURADO

Introducción a C++. Asignatura Estructuras de Datos Curso 2017/2018 ETSISI UPM

Fundamentos de la programación

Unidad IV Arreglos y estructuras. M.C. Juan Carlos Olivares Rojas

PRÁCTICA DE LABORATORIO 4 Programación Orientada a Objetos

Objetivo El alumno conocerá y aplicará los conceptos de arreglo y estructura en la realización de programas que resuelvan problemas de tipo numérico.

Tema 18: Memoria dinámica y su uso en C

Laboratorio 5 Tema 7. Tipos de Datos Estructurados: Arreglos, Registros y Archivos

Objetivos. El alumno conocerá y aplicará el concepto de archivo para el almacenamiento y recuperación de datos persistentes.

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 1. Problemas de tratamiento de información, algoritmos y programas

Examen escrito de Programación 1

Tipos de datos y operadores en C++

Examen escrito de Programación 1

Tema 1. Adquisición y representación de imágenes.

Elementos de un programa en C

LENGUAJE DE PROGRAMACION I. Ing. JAVIER ECHEGARAY ROJO Ing. WILDER ROMAN MUNIVE. Ing. Javier Echegaray Rojo / Ing. Wilder Román Munive Pag 1

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Caracter a caracter los datos pueden ser escritos o leidos carácter a carácter, con las funciones fputc() y fgetc().

Unidad 2. La lógica de programación. Tema 4. Arreglos y estructuras de repetición

Introducción rápida a la programación (estructurada ) con C++

Graficación por Computadora

Informática I (2014-2) Taller Lenguaje C Prof. Sebastián Isaza Departamento de Ingeniería Electrónica Facultad de Ingeniería Universidad de Antioquia

Vectores y Matrices. Dept. Ciencias de la Computación e I.A. Universidad de Granada

LABORATORIO #1 INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C++

Segundo Taller Final de PROGRAMACIÓN ORIENTADO A OBJETOS. INGENIERÍA DE SISTEMAS. Docente y Administrativo: Luz Esperanza Espitia Preciado

Tema: Funciones Virtuales y Polimorfismo.

Tema: Funciones Virtuales y Polimorfismo.

Tema 6: Memoria dinámica

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Tema: Repaso sobre uso de Funciones, Arreglos y Punteros en C++.

Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase al mismo tiempo que se declara.

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Programación. Test Autoevaluación Tema 3

Funciones: Pasos por Referencia Recursividad

Algoritmos y estructuras de datos

Subrutinas o Funciones

Objetivo N 2. Conocer la Estructura General de un Programa en C++ Estructura de Datos Prof. Egilde Márquez

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

Tipo de Dato: Arreglos

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo

Formatos de imágenes. Herramientas de programación para procesamiento de señales

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Introducción a procesamiento digital de imágenes con Matlab

CAPITULO 2: VARIABLES Y CONSTANTES

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

Introducción al lenguaje C

Transcripción:

Ejercicios con OpenCV Dr. Alfonso Alba Cadena Facultad de Ciencias, UASLP fac@fc.uaslp.mx Septiembre 2011 1 Sobre OpenCV OpenCV (Open Source Computer Vision) es una librería de funciones escritas en C/C++ para realizar tareas de procesamiento de imágenes y visión computacional que van desde lo básico (acceso a pixeles individuales, despliegue en pantalla, dibujo de formas geométricas) hasta lo avanzado (filtrado, detección de bordes, transformaciones geométricas). OpenCV puede utilizarse bajo diversas plataformas (incluyendo Windows, MacOS, Linux, Android e ios) y con diversos compiladores. En particular, en Windows soporta los compiladores Microsoft Visual C++ y MinGW (e.g., bajo Code::Blocks). Este documento contempla la versión 2.2 de OpenCV. 2 Estructura IplImage La estructura IplImage contiene la información de una imagen y sus características (para mayores detalles consultar la guía de referencia de OpenCV). Los principales campos de esta estructura son: int width - contiene el ancho de la imagen en pixeles. int height - contiene la altura de la imagen en pixeles. int depth - indica el formato de los pixeles, de acuerdo a las siguientes constantes IPL_DEPTH_8U - Entero de 8 bits sin signo (e.g., escala de grises de 0 a 255). IPL_DEPTH_8S - Entero de 8 bits con signo. IPL_DEPTH_16U - Entero de 16 bits sin signo. IPL_DEPTH_16S - Entero de 16 bits con signo. IPL_DEPTH_32S - Entero de 32 bits con signo.

IPL_DEPTH_32F - Punto flotante de 32 bits (la escala de grises toma el rango de 0 a 1). IPL_DEPTH_64F - Punto flotante de 64 bits (la escala de grises toma el rango de 0 a 1). int nchannels - número de canales (e.g., 1 para imágenes en escala de grises, 3 para imágenes RGB). char *imagedata - apuntador al arreglo que contiene la imagen. El programador debe realizar la conversión al tipo de apuntador adecuado, de acuerdo al campo depth. int widthstep - número de bytes que ocupa cada renglón de la imagen en el arreglo imagedata. Este valor puede ser mayor que el que requiere el ancho de la imagen. La imagen contenida en una estructura IplImage está organizada como un arreglo bidimensional en orden lexicográfico; sin embargo, por razones de eficiencia, el número de columnas en este arreglo no es necesariamente igual al número de pixeles en cada renglón de la imagen. El campo widthstep de la estructura IplImage indica exactamente cuántos bytes ocupa cada renglón de la imagen dentro del arreglo. En otras palabras, el apuntador dado por imagedata + y * widthstep precisamente apunta al inicio del y-ésimo renglón de la imagen. Sin embargo, es importante recordar que este apuntador está definido como apuntador a char y en muchos casos será necesario realizar un typecast al tipo de apuntador adecuado para el formato de la imagen. Considere el siguiente ejemplo: #include <opencv2/opencv.hpp> int main() { IplImage *img; // img es un apuntador a una estructura IplImage // Aqui creamos la estructura y reservamos espacio para una imagen // de 320x240 pixeles en formato de punto flotante (32 bits) y // en escala de grises (un solo canal) img = cvcreateimage(cvsize(320, 240), IPL_DEPTH_32F, 1); // Ahora asignamos al pixel (160,120) el color blanco float *row = (float *)(img->imagedata + 120 * img->widthstep); row[160] = 1; cvwaitkey(-1); // Espera una tecla cvreleaseimage(&img); // Libera la imagen return 0; 2

3 Funciones Básicas IplImage *cvcreateimage(cvsize size, int depth, int channels); Crea una imagen con un tamaño, formato y número de canales dado, y devuelve un apuntador a la estructura IplImage correspondiente. void cvreleaseimage(iplimage **image); Libera la memoria utilizada por una imagen. void cvset(cvarr *arr, CvScalar value, const CvArr *mask = NULL); Llena una matriz o una imagen con un mismo valor. El tercer parámetro es opcional y define una máscara que determina que pixeles serán modificados. Si el pixel correspondiente en la máscara es distinto de cero, entonces el pixel en la imagen de entrada tomará el valor value. El valor asignado a los pixeles debe proporcionarse como una estructura de tipo CvScalar la cual contiene un arreglo val de cuatro elementos de tipo double. La forma mas fácil de crear un elemento CvScalar es mediante la función cvscalar que toma como parámetros entre 1 y 4 valores de tipo double y devuelve el CvScalar correspondiente. Ejemplo de uso: // Crea una imagen en formato RGB de tipo flotante y la llena con color rojo IplImage *img = cvcreateimage(cvsize(320,240), IPL_DEPTH_32F, 3); cvset(img, cvscalar(1,0,0)); cvshowimage("imagen", img); void cvsetzero(cvarr *arr); Llena una matriz o una imagen con ceros. void cvsetreal2d(cvarr *arr, int idx0, int idx1, double value); Asigna el valor value al elemento de una matriz o una imagen localizado en el renglón idx0 y columna idx1. Es importante notar que si *arr es una imagen (i.e., de tipo IplImage *), los índices idx0 e idx1 representan, respectivamente, las coordenadas Y y X del pixel a modificar. double cvgetreal2d(cvarr *arr, int idx0, int idx1); Devuelve el valor asignado al elemento ubicado en el renglón idx0 y columna idx1 de la matriz o imagen dada por arr. void cvcopy(const CvArr *src, CvArr *dst, const CvArr *mask = NULL); Copia el contenido de la matriz o imagen src en la matriz o imagen dst. Ambas imagenes deben tener el mismo tamaño, formato y número de canales. Dada la matriz o imagen mask, esta indicará cuáles pixeles serán copiados. 3

4 Funciones básicas de interface void cvshowimage(const char *name, const CvArr *image); Despliega la imagen image en una ventana cuyo nombre está dado por la cadena name. Si ya existe una ventana con el mismo nombre, la imagen de esa ventana será reemplazada. Nota: En versiones de OpenCV anteriores a la 2.2 era necesario crear primero la ventana mediante la función cvnamedwindow. void cvdestroywindow(const char *name); Destruye y cierra la ventana con nombre name. void cvdestroyallwindows(); Destruye y cierra todas las ventanas creadas con cvshowimage y cvnamedwindow. int cvwaitkey(int delay = 0); Esta función detiene la ejecución durante delay milisegundos, o indefinidamente (delay <= 0) hasta que se origine un evento del teclado. El resultado devuelto es el código de la tecla presionada, o bien -1 si no se presionó ninguna tecla antes de reanudar la ejecución. 5 Ejemplo: cvsetreal2d vs apuntadores El siguiente ejemplo muestra la diferencia entre utilizar las funciones cvgetreal2d y cvsetreal2d y utilizar el apuntador imagedata para acceder a los pixeles de una imagen. #include <opencv2/opencv.hpp> #include <ctime> #include <iostream> using namespace std; #define TIME 10 #define TIMECLK (TIME * CLOCKS_PER_SEC) int main() { IplImage *img; // img es un apuntador a una estructura IplImage clock_t ti; int iter, x, y; double fps; 4

float *row; img = cvcreateimage(cvsize(640, 480), IPL_DEPTH_32F, 1); // Llena una imagen continuamente con ruido utilizando cvsetreal2d iter = 0; ti = clock(); while ((cvwaitkey(1) < 0) && ((clock() - ti) < TIMECLK)) { for (y = 0; y < img->height; y++) { for (x = 0; x < img->width; x++) { cvsetreal2d(img, y, x, (double)rand() / RAND_MAX); iter++; fps = (double)iter * CLOCKS_PER_SEC / (clock() - ti); cout << "Frames per second (cvsetreal2d) : " << fps << endl; // Llena una imagen continuamente con ruido utilizando apuntadores iter = 0; ti = clock(); while ((cvwaitkey(1) < 0) && ((clock() - ti) < TIMECLK)) { for (y = 0; y < img->height; y++) { row = (float *)(img->imagedata + y * img->widthstep); for (x = 0; x < img->width; x++) { *row++ = (double)rand() / RAND_MAX; iter++; fps = (double)iter * CLOCKS_PER_SEC / (clock() - ti); cout << "Frames per second (pointers) : " << fps << endl; cvreleaseimage(&img); return 0; 5