如何在Matlab中读取.yml文件

时间:2019-01-21 09:04:03

标签: matlab opencv

我有一个由.yml生成的opencv文件序列,我试图使用yamlmatlab读入MATLAB,但是出现以下错误:

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 :(得分:0)

似乎链接的库(似乎在后台使用SnakeYAML)无法解析包含冒号(:)而不是空格的YAML 1.0 YAML directive。规范的更高版本。

%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')

答案 1 :(得分:0)

您可以使用我最近在matlabcentral和github上编写和发布的解析器cvyamlParser。它可以正确处理yaml文件中的标头。

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

https://github.com/tmkhoyan/cvyamlParser

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

这是为Linux和osx编译的MEX文件。您可以使用src文件和上的说明来编译Windows版本。 它将使用由open cv编写的yaml文件,并将其转换为具有与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]