Persistencia de datos YML - XML

Siempre que trabajemos en un proyecto ya sea de visión artificial o cualquier otro tipo de proyecto en algún momento necesitaremos almacenar datos y recuperarlos posteriormente para usarlos de un modo u otro, opencv proporciona la clase FileStorage para facilitarnos el almacenamiento y recuperación de datos opencv.

Para el almacenamiento de datos en opencv disponemos de dos formatos XML y YAML, para especificar cual usar solo debemos colocar la extensión al nombre con que guardaremos el archivo .xml para el formato XML y .yml o .yaml para el formato YAML, en el caso en que deseemos trabajar con una versión comprimida del archivo bastara con agregar la extensión .gz después de la extensión del formato que deseemos usar.

xml_yaml_opnecv_file
Es posible almacenar y recuperar las estructuras de datos opencv como Mat, y los tipos de datos primitivos como int o float.

Escribir un archivo XML o YAML


1. Creamos un objeto de la clase FileStorage indicamos el nombre con que deseamos crear el archivo, e indicamos el modo de escritura WRITE.
2. Agregamos los datos mediante el operador << como lo hacemos con los stream.
3. llamamos al método release() para cerrar el archivo.

int dt[3][3]
{
 { 1, 2, 3 },
 { 4, 5, 6 },
 { 7, 8, 9 }
};

Mat mt(3, 3, CV_32SC1, dt);


FileStorage yml_file("archivo.yml", FileStorage::WRITE);

yml_file << "NumeroInt"   << 345;
yml_file << "NumeroFloat" << 3.26;
yml_file << "Matriz3x3"   << mt;

yml_file.release();

De este modo hemos creado un archivo YAML donde se almacena un numero int, float y cv::Mat, antes de cada valor debemos asignar un nombre para poder recuperarlo posteriormente, en este ejemplo a cada valor se le asigna una clave y luego el valor como un diccionario en python o c#, a esto se le llama mappings.

Leer un archivo XML o YAML


Para leer el contenido el proceso es similar solo indicamos el nombre del archivo que se  abrirá en modo READ, leemos los datos con el operador >> y cerramos al terminar.

FileStorage yml_file("archivo.yml", FileStorage::READ);

int n   = yml_file["NumeroInt"];
float f = yml_file["NumeroFloat"];

Mat m;
yml_file["Matriz3x3"] >> m;

yml_file.release();

Podemos abrir el archivo creado son un editor de textos y ver su contenido para entender como se almacenan los distintos datos y las diferencias entre un archivo xml y yaml.

Hasta este momento hemos almacenado datos en el formato clave-valor pero también lo podemos hacer en modo secuencia como si fuesen una lista de valores como en un objeto vector de la STL de C++, vemos como se hace:

yml_file << "lista" << "[:";

for (int i = 0; i < 10; i++) yml_file << i * 2;

yml_file << "]";

Para leer usamos FileNode y FileNodeIteraror o mas fácil cargar directamente la lista a un contenedor vector.

vector<int> lst;
yml_read["lista"] >> lst;

Debemos saber que los datos se almacenas en forma jerárquica por lo que podemos tener por ejemplo una colección tipo diccionario que su vez contenga otra colección de cualquier tipo, estas jerarquías son representadas por nodos que podemos manipular con FileNode.

En la carpeta de ejemplos de opencv para el lenguaje C++ encontraremos un ejemplo mas detallado este ira en el archivo de descarga junto con el presente código. 

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Conociendo la clase cv::Mat de OpenCV

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV