Reading/Writing XML and YAML files

Demonstration of reading/writing from/to XML and YAML file storages.

Sources:

Contents

Data

First we create some different variables to save. We have an integer, a text string (calibration date), 2 matrices, and a custom structure "feature" (struct-array), which includes feature coordinates and LBP (local binary pattern) value.

frameCount = int32(5);
calibrationDate = datestr(now());
cameraMatrix = [1000, 0, 320; 0, 1000, 240; 0, 0, 1];
distCoeffs = [0.1; 0.01; -0.001; 0; 0];
features = struct('x',cell(1,3), 'y',cell(1,3), 'lbp',cell(1,3));
for i=1:numel(features)
    features(i).x = randi(640,'int32');
    features(i).y = randi(480,'int32');
    features(i).lbp = num2cell(bitget(randi([0 255],'uint8'),1:8));
end

now we collect the variable inside a structure fields (that way we get a named collection (mapping) of variables)

S = struct(...
    'frameCount',frameCount, ...
    'calibrationDate',calibrationDate, ...
    'cameraMatrix',cameraMatrix, ...
    'distCoeffs', distCoeffs, ...
    'features',features);
display(S)
display(S.features)
S = 
  struct with fields:

         frameCount: 5
    calibrationDate: '01-Dec-2017 17:13:58'
       cameraMatrix: [3×3 double]
         distCoeffs: [5×1 double]
           features: [1×3 struct]
  1×3 struct array with fields:
    x
    y
    lbp

Save

next we save them to XML/YML files

fname = tempname();
cv.FileStorage([fname '.xml'], S)
cv.FileStorage([fname '.yml'], S)

XML file

type([fname '.xml'])
<?xml version="1.0"?>
<opencv_storage>
<frameCount>5</frameCount>
<calibrationDate>"01-Dec-2017 17:13:58"</calibrationDate>
<cameraMatrix type_id="opencv-matrix">
  <rows>3</rows>
  <cols>3</cols>
  <dt>d</dt>
  <data>
    1000. 0. 320. 0. 1000. 240. 0. 0. 1.</data></cameraMatrix>
<distCoeffs type_id="opencv-matrix">
  <rows>5</rows>
  <cols>1</cols>
  <dt>d</dt>
  <data>
    1.0000000000000001e-01 1.0000000000000000e-02
    -1.0000000000000000e-03 0. 0.</data></distCoeffs>
<features>
  <_>
    <x>593</x>
    <y>363</y>
    <lbp>
      1 1 0 1 1 0 1 1</lbp></_>
  <_>
    <x>386</x>
    <y>52</y>
    <lbp>
      0 0 1 0 1 1 1 0</lbp></_>
  <_>
    <x>419</x>
    <y>28</y>
    <lbp>
      1 0 1 0 0 0 0 0</lbp></_></features>
</opencv_storage>

YML file

type([fname '.yml'])
%YAML:1.0
---
frameCount: 5
calibrationDate: "01-Dec-2017 17:13:58"
cameraMatrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 1000., 0., 320., 0., 1000., 240., 0., 0., 1. ]
distCoeffs: !!opencv-matrix
   rows: 5
   cols: 1
   dt: d
   data: [ 1.0000000000000001e-01, 1.0000000000000000e-02,
       -1.0000000000000000e-03, 0., 0. ]
features:
   -
      x: 593
      y: 363
      lbp:
         - 1
         - 1
         - 0
         - 1
         - 1
         - 0
         - 1
         - 1
   -
      x: 386
      y: 52
      lbp:
         - 0
         - 0
         - 1
         - 0
         - 1
         - 1
         - 1
         - 0
   -
      x: 419
      y: 28
      lbp:
         - 1
         - 0
         - 1
         - 0
         - 0
         - 0
         - 0
         - 0

Load

we read the files back

S_xml = cv.FileStorage([fname '.xml']);
S_yml = cv.FileStorage([fname '.yml']);

and show the result

display(S_yml)
display(S_yml.cameraMatrix)
display(S_yml.distCoeffs)
celldisp(S_yml.features, 'features')
S_yml = 
  struct with fields:

         frameCount: 5
    calibrationDate: '01-Dec-2017 17:13:58'
       cameraMatrix: [3×3 double]
         distCoeffs: [5×1 double]
           features: {[1×1 struct]  [1×1 struct]  [1×1 struct]}
        1000           0         320
           0        1000         240
           0           0           1
    0.1000
    0.0100
   -0.0010
         0
         0
features{1} =
      x: 593
      y: 363
    lbp: {[1]  [1]  [0]  [1]  [1]  [0]  [1]  [1]}
features{2} =
      x: 386
      y: 52
    lbp: {[0]  [0]  [1]  [0]  [1]  [1]  [1]  [0]}
features{3} =
      x: 419
      y: 28
    lbp: {[1]  [0]  [1]  [0]  [0]  [0]  [0]  [0]}

finally, we clean up the temporary files

delete([fname '.xml'])
delete([fname '.yml'])