Creación de imágenes en OpenCV

El primer paso para trabajar con imágenes es crearlas. OpenCV sobrecarga el constructor de la clase Mat, dando mucha flexibilidad al programador a la hora de crear una nueva imagen vacía.

Estos son algunos ejemplos de constructor de imagen en C++, y la línea de código correspondiente para utilizarlo en un programa:

C++: Mat::Mat()

Crea un contenedor vacío y sin formato.

Mat imagen; //crea una imagen vacía y sin formato


C++: Mat::Mat(int rows, int cols, int type)

Crea una imagen. rows indica el número de filas, cols el número de columnas, y type el tipo de dato que se almacena en el píxel. El tipo de dato determinará la clase de imagen que se crea. OpenCV proporciona unas etiquetas que permiten indicar fácilmente el tipo de datos. Por otro lado, hay muchos tipos de datos distintos (recordad que el tipo Mat se utiliza para almacenar matrices, en general...) de los que sólo nos van a interesar unos cuantos. Los más comunes para las imágenes que utilizamos en este curso son:

    CV_8UC1: Cada canal del píxel se codifica con un entero sin signo (8 bits). El píxel tiene sólo 1 canal.
    CV_8UC3: Cada canal del píxel se codifica con un entero sin signo (8 bits). El píxel tiene 3 canales.
    CV_8UC4:Cada canal del píxel se codifica con un entero sin signo (8 bits). El píxel tiene 4 canales.

Hay otras muchas opciones: CV_64FC4, por ejemplo, codifica cada canal del píxel con un flotante de 64 bits, y cada píxel tiene 4 canales. CV_16SC2, por otro lado, codifica cada canal del píxel con un entero con signo de 16 bits, y usa 2 canales por píxel, etc.

Mat imagen(600,800,CV_8UC1); // crea una imagen vacía de 600 filas, 800 columnas. Cada píxel tiene un sólo canal de un byte. Típica imagen en blanco y negro


C++: Mat::Mat(Size size, int type)

Igual que la anterior, pero en este caso, el alto y el ancho se suministran en una estructura de tipo Size.

Size tamano(600,800);

Mat imagen(tamano,CV_8UC1); // equivalente al ejemplo anterior


C++: Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

En este caso, se crea una matriz con las filas, columnas y tipo de dato que se indican, pero NO se crea vacía, sino que se inicializa a los valores indicados en el array void data. Este constructor no genera un nuevo array, sino que, simplemente, hace que el atributo data de la imagen recién creada apunte a la dirección de memoria donde está el valor void data que se pasa como parámetro. Es una operación muy rápida (no hace falta rellenar un nuevo array) pero peligrosa, ya que, por un lado, la imagen recién creada va a enlazar con datos que ya existían... y podrá modificarlos. Por otro lado, cuando se deje de usar la imagen, estos datos no se destruirán automáticamente, lo que puede provocar problemas por fugas de memoria si no se tiene cuidado. El campo step indica cuánto ocupa cada fila de la imagen. Si no se escribe nada, por defecto C++ le da el valor AUTO_STEP, lo que hace que step se calcule como el número de columnas multiplicado por el tamaño, en bytes, de cada píxel.

Mat imagen(600,800,datos); // crea una imagen de 600 filas y 800 columnas y la enlaza al array datos, previamente creado. No se proporciona valor para step con lo que C++ asume que ese parámetro vale AUTO_STEP

Aparte de crear una nueva imagen, también es útil, en OpenCV, la carga de una imagen desde archivo. Para cargar una imagen desde un archivo, se utiliza la función imread , que se detalla a continuación (más información en el enlace de la API de OpenCV):

C++: Mat imread(const string& filename, int flags=1 )

El primer parámetro indica el nombre del archivo que contiene la imagen que se quiere cargar. El segundo parámetro (flags) se construye combinando una serie de etiquetas, y no hay porqué utilizarlo. Si no se escribe nada, la imagen se cargará con los parámetros que tenga la imagen contenida en el archivo. Sin embargo, si se especifican unas etiquetas, entonces éstas especificarán el tipo de imagen que devuelve la función. Hay varias opciones para estas etiquetas:

```
CV_LOAD_IMAGE_ANYDEPTH: Si se incluye esta etiqueta, devuelve una imagen de 16 o 32 bits si éste era el tamaño de canal de la imagen de entrada... si no, convierte el tamaño de canal de la imagen de entrada a 8 bits (1 byte).
CV_LOAD_IMAGE_COLOR:Si se activa, siempre convierte la imagen a color.
CV_LOAD_IMAGE_GRAYSCALE: Si se activa, siempre devuelve una imagen en escala de grises.
> 0: Devuelve una imagen de color de tres canales.
= 0: Devuelve una imagen en escala de grises.
< 0: Devuelve la imagen del archivo tal y como estuviese configurada (incuyendo el canal alfa).

Mat imagen;

imagen = imread("lena.jpg",CV_LOAD_IMAGE_COLOR); // carga la imagen del archivo lena.jpg, y la devuelve como una imagen en color ```

results matching ""

    No results matching ""