Как прочитать файл .yml в Matlab - PullRequest
0 голосов
/ 21 января 2019

У меня есть последовательность .yml файлов, сгенерированных opencv, которые я пытался прочитать в MATLAB, используя yamlmatlab, но я получаю следующую ошибку:

y_data = ReadYaml(yaml_file);

Ошибка при использовании ReadYamlRaw> load_yaml (строка 78)

while scanning a directive
  in "<string>", line 1, column 1:
    %YAML:1.0
         ^
expected alphabetic or numeric character, but found :(58)
 in "<string>", line 1, column 6:
    %YAML:1.0
         ^ 

Мои YAML-файлы выглядят следующим образом:

%YAML:1.0
Vocabulary: !!opencv-matrix
   rows: 100
   cols: 78
   dt: f
   data: [ 1.00037329e-001, 8.75103176e-002, 1.09445646e-001,
       1.05232671e-001, 6.78173527e-002, 9.65989158e-002,
       1.62132218e-001, 1.56320035e-001, 1.12932988e-001,
       1.27447948e-001, 1.88054979e-001, 1.88775390e-001,.....

И

%YAML:1.0
---
vocabulary: !!opencv-matrix
   rows: 100
   cols: 1
   dt: f
   data: [ 3.54101445e-04, 1.23916077e+02, 9.93522644e+01,
       2.42377838e+02, 3.53855858e+01, 1.69853516e+02, 5.81151466e+01,
       8.07454453e+01, 1.83035984e+01, 2.13557846e+02, 1.52394699e+02,
       1.10933914e+02, ......

Я пробовал с YAMLMatlab, но все еще получаю ту же ошибку. Пожалуйста, помогите, как прочитать эти файлы и преобразовать их в файлы .mat.

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Вы можете использовать парсер, который я написал и недавно опубликовал на matlabcentral и github, cvyamlParser.Он может правильно обрабатывать заголовок в файле yaml.

https://zenodo.org/record/2703498#.XNg20NMzafU

https://github.com/tmkhoyan/cvyamlParser

https://in.mathworks.com/matlabcentral/fileexchange/71508-cvyamlparser

Это MEX-файл, скомпилированныйдля Linux и OSX.Вы можете использовать файл src и инструкции по компиляции версии для Windows.Он возьмет файл yaml, написанный open cv, и преобразует его в структуру с теми же именами переменных, что и в yaml.Тип данных переменной выводится во время выполнения, при желании вы можете использовать сортировку для переменных с числовым индексом, таких как A1, A2, A4, A5 и т. Д. Используйте это так:

s = readcvYaml('../data/test_data.yaml') 
s = 
struct with fields:

matA0: [1000×3 double] 
matA1: [1000×3 double] 
matA2: [1000×3 double] 

Или с сортировкой:

s = readcvYaml('../data/test_data.yaml','sorted') 
s = 
struct with fields:

matA: [1×3 struct]
0 голосов
/ 21 января 2019

Похоже, что связанная библиотека (которая, похоже, использует SnakeYAML под колпаком) не в состоянии проанализировать директиву YAML 1.0 YAML , которая содержит двоеточие (:), а не пробел в более поздних версиях спецификации.

%YAML:1.0

Стала:

%YAML 1.2

Появляется , что содержимое файла YAML совместимо с более новыми форматами YAML, поэтому вы можете попробовать удалить директиву из файла перед синтаксическим анализом (удалить первую строку).

Что касается преобразования после загрузки данных в MATLAB, вы должны иметь возможность делать что-то вроде:

% Read the yaml file
yaml = yaml.ReadYaml(yaml_file);

% Load in the matrix and reshape into the desired size
mat = reshape(yaml.data, yaml.cols, yaml.rows).';

% Save to .mat file
save('output.mat', 'mat')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...