我有一个由.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文件。
答案 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]