Descargar

Tipos de datos en OpenCV (página 2)

Enviado por Pablo Turmero


Partes: 1, 2
edu.red Acceso a un píxel de una imagen El acceso a píxeles concretos es posible, aunque es preferible usar funciones ya implementadas sobre imágenes (que nos evitan tener que acceder a los píxeles). Acceso al píxel (x, y) de una imagen img: Directamente usando imageData y widthStep: 1 canal, 8U: img->imageData[x+y*img->widthStep] 3 canales, 8U: img->imageData[x*3+y*img->widthStep], img->imageData[x*3+y*img->widthStep+1], img->imageData[x*3+y*img->widthStep+2] Usando las funciones cvGet2D, cvSet2D (preferible): CvScalar cvGet2D (IplImage* img, int y, int x) void cvSet2D (IplImage* arr, int y, int x, CvScalar valor)

edu.red Entrada/salida de imágenes a disco Las funciones para la entrada/salida de imágenes se encuentran en la librería , de OpenCV. Leer una imagen de un fichero: IplImage* cvLoadImage (const char* name, int iscolor=1) name: nombre del fichero a leer. iscolor: número de canales en la imagen resultante: >0 : la imagen resultante tendrá siempre 3 canales (RGB) =0 : la imagen tendrá 1 canal (escala de grises) <0 : el número de canales depende del propio fichero Formatos admitidos: BMP, DIB, JPEG, PNG, PBM, PGM, PPM, RAS, TIFF. En HighGUI2 se añade GIF. Si no se puede leer el fichero, devuelve NULL.

edu.red Entrada/salida de imágenes a disco Guardar una imagen en un fichero: int cvSaveImage (const char* name, const IplImage* image) name: nombre del fichero a escribir. image: imagen a guardar. Formatos admitidos: BMP, DIB, JPEG, PNG, PBM, PGM, PPM, RAS, TIFF. En Highgui2 se añade GIF. Devuelve 0 si no se puede escribir. Guardar una imagen JPEG seleccionando el nivel de calidad/compresión: int param[2]= {CV_IMWRITE_JPEG_QUALITY, valor}; cvSaveImage(“nombre.jpg”, img, param); valor = 0 ? máxima compresión; valor = 100 ? máxima calidad

edu.red Salida de imágenes por pantalla La librería ofrece también una forma sencilla de visualizar las imágenes. Permite crear ventanas, que son referenciadas mediante cadenas de texto. Crear una ventana: int cvNamedWindow (const char* name, unsigned long flags) name: nombre de la ventana a crear. flags: 0 = se puede modificar el tamaño de la ventana; 1 = no se puede modificar el tamaño.

Destruir una ventana: int cvDestroyWindow (const char* name) name: nombre de la ventana a destruir.

edu.red Salida de imágenes por pantalla Mostrar una imagen en una ventana: void cvShowImage (const char* name, const IplImage* image) name: nombre de la ventana a usar. image: imagen a mostrar. Cambiar el tamaño de una ventana: void cvResizeWindow (const char* name, int width, int height) name: nombre de la ventana a redimensionar. Esperar pulsación de una tecla: int cvWaitKey (int delay= 0) delay: tiempo máximo de espera, en milisegundos. Si es menor o igual que 0, espera indefinidamente. Devuelve el código de la tecla, o -1 si no se pulsó ninguna.

edu.red TODAS las imágenes creadas deben ser liberadas. Liberar una imagen: void cvReleaseImage (IplImage** image) image: imagen a liberar, ojo es un doble puntero. Si *image es NULL no hace nada. Clonar una imagen: IplImage* cvCloneImage (const IplImage* image) image: imagen a clonar, se devuelve una copia exacta Otras operaciones (consultar en la documentación): cvSet: inicializar una imagen con un valor constante. cvSplit, cvMerge: separar los canales de una imagen, y componer varios canales en una imagen, respectivamente. cvConvertScale: convertir una imagen, cambiando los valores de profundidad de píxel.

edu.red Los tipos CvMat, CvMatND y CvArr Además de imágenes, OpenCV permite manejar también matrices (CvMat) y arrays n-dimensionales (CvMatND). Crear una matriz o array: cvCreateMat, cvCreateMatND Distintos valores de profundidad y número de canales Liberar una matriz: cvReleaseMat, cvReleaseMatND Leer un elemento: cvGet1D, cvGet2D, cvGet3D, cvGetND Escribir un elemento: cvSet1D, cvSet2D, cvSet3D, cvSetND

Normalmente no usaremos estos tipos, pero muchas funciones sobre imágenes los admiten también. El tipo CvArr se usa para indicar que una función puede manejar tanto un IplImage, como un CvMat o un CvMatND.

edu.red Algunas cuestiones adicionales En la mayoría de las funciones de OpenCV, tenemos que crear previamente las imágenes (no lo hace la función). Modo in-place: si una función lo admite, significa que la imagen resultante puede ser la misma que la de entrada. Ejemplo: cvAdd (imagenA, imagenB, imagenA); Regiones de Interés (ROI): una imagen puede tener definida una región de interés rectangular. Las operaciones se aplican sólo sobre la región de interés. Establecer y quitar una región de interés: void cvSetImageROI (IplImage* image, CvRect rect) void cvResetImageROI (IplImage* image) Conceptos relacionados son: canal de interés (COI) y máscara (mask, imagen booleana; 0: no usar; ?0: sí usar).

edu.red Ejemplo 1. Leer una imagen y mostrarla en una ventana.

IplImage *img; cvNamedWindow("Imagen", 0); // Ventana modificable img= cvLoadImage(“fichero.jpg", 1); // ¿Y si ponemos un 0? cvShowImage("Imagen", img); cvWaitKey(0); cvDestroyWindow("Imagen"); cvReleaseImage(&img);

edu.red Ejemplo 2. Leer una imagen en color, separar los canales R, G y B, y guardarlos en 3 ficheros distintos.

IplImage *img= cvLoadImage("fichero.bmp", 1); cvNamedWindow("Imagen", 0); cvShowImage("Imagen", img); IplImage *canales[3]; char *nombres[3]= {"canalB.jpg", "canalG.jpg", "canalR.jpg"}; int i; for (i= 0; i<3; i++) canales[i]= cvCreateImage(cvGetSize(img), img->depth, 1); cvSplit(img, canales[0], canales[1], canales[2], NULL); for (i= 0; i<3; i++) { cvNamedWindow(nombres[i], 0); cvShowImage(nombres[i], canales[i]); cvSaveImage(nombres[i], canales[i]); cvReleaseImage(&canales[i]); } cvReleaseImage(&img);

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente