Работа с XML/YAML в OpenCV / OpenCV / Recog.ru - Распознавание образов для программистов


Работа с XML/YAML в OpenCV

Сохранение и работа с форматами XML и YAML является одной из встроенных возможностей OpenCV.

CvFileStorage
typedef struct CvFileStorage{
… // hidden fields
} CvFileStorage;


Структура CvFileStorage – это «черный ящик», представляющий собой хранилище, связанное с файлом на диске. Есть несколько функций, которые позволяют загружать и сохранять иерархические коллекции, которые состоят из скалярных значений, стандартных CXCore объектов и объектов, определенных пользователем.
CXCore может читать и записывать данные в формате XML (http://www.w3c.org/XML) или YAML (http://www.yaml.org). Ниже представлен пример из документации OpenCV сохранения единичной матрицы 3x3 в XML и YAML.
<?xml version=«1.0»>
<opencv_storage>
<A type_id=«opencv-matrix»>
3
3
f
1. 0. 0. 0. 1. 0. 0. 0. 1.

</opencv_storage>

%YAML:1.0
A: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ 1., 0., 0., 0., 1., 0., 0., 0., 1.]

CvFileNode

Структура используется только для получения данных из хранилища файлов (например, для загрузки данных из файла). Когда данные записываются в файл, это делается последовательно, с минимальной буферизацией. Однако, когда данные считываются из файла, весь файл анализируется и представлены в памяти в виде дерева. Каждый узел дерева представляет CvFileNode. Узлами могут быть: текстовые строки, целые числа или числа с плавающей точкой. Другие узлы – являются совокупностью коллекций. Есть два типа коллекций: последовательности и карты. Последовательности (не путать их с CvSeq) упорядочивают коллекции неименованных узлов файла; карты — неупорядоченные наборы именованных узлов файла. Таким образом, к элементам последовательности можно обращаться по индексу (GetSeqElem), в то время как элементы карты имеют доступ по имени (GetFileNodeByName). В приведенной ниже таблице описываются различные типы файловых узлов:


CvAttrList

Список атрибутов.

typedef struct CvAttrList{
const char** attr; /* NULL-terminated array of (attribute\_name,attribute\_value) pairs struct CvAttrList* next; /* pointer to next chunk of the attributes list */
}CvAttrList;


Атрибуты используются для передачи дополнительных параметров при создании пользовательских объектов.

CvTypeInfo

Тип информации.

typedef struct CvTypeInfo{
int flags; /* not used */
int header_size; /* sizeof(CvTypeInfo) */
struct CvTypeInfo* prev; /* previous registered type in the list */
struct CvTypeInfo* next; /* next registered type in the list */
const char* type_name; /* type name, written to file storage */
/* methods */
CvIsInstanceFunc is_instance; /* checks if the passed object belongs to the type */
CvReleaseFunc release; /* releases object (memory etc.) */
CvReadFunc read; /* reads object from file storage */
CvWriteFunc write; /* writes object to file storage */
CvCloneFunc clone; /* creates a copy of the object */
}CvTypeInfo;


Структура CvTypeInfo содержит информацию об одном из стандартных или пользовательских типов.

cvClone
Функция находит тип данного объекта и клонирует его.

cvEndWriteStruct
Функция завершает текущую записываемую структуру.

cvFindType
Находит тип по его имени.

cvFirstType
Функция возвращает первый тип в списоке зарегистрированных типов.

cvGetFileNode
Находит узел в карте или хранилище файла.

cvGetFileNodeByName
Находит узел в карте или хранилище файла.

cvGetFileNodeName
Возвращает имя узла файла.

cvGetHashedKey
Возвращает уникальный указатель для данного имени.

cvGetRootFileNod
Получает один из узлов верхнего уровня от хранилища файлов.

cvLoad
Загружает объект из файла.

cvOpenFileStorage
Открывает для файловое хранилище для чтения или записи данных.

cvRead
Декодирует объект и возвращает указатель на него.

cvReadByName
Находит объект по имени и декодирует его.

cvReadInt
Возвращает целое значение из файлового узла.

cvReadIntByName
Находит файловый узел, и возвращает его значение.

cvReadRawData
Читает несколько номеров.

cvReadRawDataSlice
Функция читает один или несколько элементов из файлового узла, представляющего последовательность, указанной пользователем массива.

cvReadReal
Возвращает значение с плавающей точкой из файлового узла.

cvReadRealByName
Находит файловый узел, и возвращает его значение.

cvReadString
Возвращает текстовую строку из файлового узла.

cvReadStringByName
Находит файловый узел, и возвращает его значение.

cvRegisterType
Регистрирование нового типа.

cvRelease
Освобождает объект.

cvReleaseFileStorage
Освобождает файловое хранилище.

cvSave
Сохраняет объект в файл.

cvStartNextStream
Начинается следующий поток в файловом хранилище.

cvStartReadRawData
Функция инициализирует последовательность читателя для чтения данных из файлового узла.

cvStartWriteStruct
Начинает писать новую структуру.

cvTypeOf
Возвращает тип объекта.

cvUnregisterType
Отменяет регистрацию типа.

cvWrite
Записывает объект пользователя.

cvWriteComment
Записывает комментарий.

cvWriteFileNode
Записывает файловый узел в другое файловое хранилище.

cvWriteInt
Записывает целое значение.

cvWriteRawData
Пишет несколько номеров.

cvWriteReal
Записывает значение с плавающей точкой.

cvWriteString
Записывает текстовые строки.

Далее показано, как записать и считать изображение из формата YAML.

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char ** argv)
{
    IplImage* Image=cvLoadImage("lena.jpg",1);
    cvSave("lena.yml",Image);
    cvReleaseImage(&Image);
    
    Image=(IplImage* )cvLoad("lena.yml");
    cvSaveImage("lena.png",Image);
    cvReleaseImage(&Image);
    
    return 0;
}

Листинг 1

А вот начало содержимого файла:
%YAML:1.0
lena: !!opencv-image
width: 512
height: 512
origin: top-left
layout: interleaved
dt: «3u»
data: [ 128, 138, 225, 127, 137, 224, 126, 136, 224, 125, 135, 223,
126, 137, 227, 120, 131, 221, 124, 137, 229, 123, 136, 228, 126,
139, 231, 122, 135, 227, 122, 138, 227, 120, 136, 225, 113, 130,
  • 0
  • 07 января 2012, 19:56
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.