如何在matlab中读取.yml文件

如何在matlab中读取.yml文件,matlab,opencv,Matlab,Opencv,我有一系列由opencv生成的.yml文件,我试图使用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 char

我有一系列由opencv生成的.yml文件,我试图使用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
         ^ 


我已经试过了,但仍然有同样的错误。请帮助阅读这些文件并将其转换为.mat文件。

在规范的更高版本中,似乎使用SnakeYAML的链接库无法解析包含冒号而不是空格的

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

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

它是一个为linux和osx编译的MEX文件。您可以使用上的src文件和说明编译windows版本。 它将采用OpenCV编写的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]

谢谢你的回复。我的数据%YAML:1.0-词汇表中的意思:!!opencv矩阵行:100列:1 dt:f数据:[3.54101445e-04,1.23916077e+02,9.93522644e+01,2.42377838e+02,3.538558E+01,1.69853516e+02,5.81151466e+01,8.0745453E+01,1.83035984e+01,2.13557846e+02,1.52394699e+02,1.10933914e+02,……首先我需要从每行删除冒号,然后我必须解析100行的CV??如%YAML1.0-100行dtf数据[3.54101445e-04、1.23916077e+02、9.93522644e+01、2.42377838e+0@a.kushwaha不,您只需删除文件的第一行并保存它,谢谢您,先生……现在yaml=yaml.ReadYamlDictionary1.yml没有错误;但mat=Reformateyaml.data、yaml.cols、yaml.rows仍有错误。';错误是引用不存在的字段“data”。…如何解决此问题???@a.kushwaha yaml有哪些字段?fieldnamesyamlyaml是一种大小为1*1的stuct类型,并具有字段词汇表。然后,像“cols 128行250数据”这样的数据[1.61622086e+01,1.99162388e+01,1.45940113e+01,9.71231461e+00,7.46669197e+00,7.39586544e+00,7.86521……]不幸的是,您的解析器不适合我。编译工作正常,但当我尝试使用它时,出现了一个opencv错误:无效的MEX文件“/home/neuroreact/Documents/MATLAB/cvyamlParser/MEX/readcvYaml.mexa64”:libopencv_core.so.4.2:无法打开共享对象文件:没有这样的文件或目录,但我有该文件。它位于/usr/loc中al/lib,正如它应该的那样。@Max这是一个链接问题,而不是解析器问题。您可以尝试检查库设置是否正确,我假设您在Linux机器上工作:1.在调用Matlab可执行文件的终端中显式导出库路径:export LD_library_path=$LD_library_path:/usr/local/lib/opencv4.如果解析器现在在此终端会话中运行,则您的库未正确链接2.如果未从源代码处编译,请通过ubuntu libopencv dev上的package manager安装opencv库的开发版本。@Max 3.使用setenv'LD_library_PATH',[getenv'LD_library_PATH',:/usr/local lib/opencv4']在matlab命令窗口中设置库。使用getenv,您可以检查库是否在路径上。4.通过设置预加载变量LD_preload显式预加载库。在linux上,matlab仅在另一个终端会话中打开,所有环境变量都需要到位,以允许访问库。在任何情况下,首先要做的是检查opencv_核心是否与正确地使用ldconfig-p | grep opencv_core安装您的系统。让我知道它是否有效。谢谢,第一个解决方案直接起作用。但是,我不明白为什么mex没有报告这样的链接器错误。我确实需要不同的opencv安装,一个来自源代码,另一个来自ubuntu repos,但我可以在使用时轻松地构建和链接它们中的任何一个我明白了。期待你的更新。我已经投票了,谢谢你的支持。
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]