在Matlab中读取.yml文件

6
我想在Matlab中读取.yml文件。这些文件包含面部图像上关键点的坐标x和y。我寻找了不同的工具,但似乎没有找到答案。
我的.yml文件看起来像这样:
YAML:1.0
Image file: "00032009.jpg"
Contours count: 8
Contours:
   -
      Name: FO
      Count: 41
      Closed: 0
      Points:
         -
            x: 682.5947265625000000
            y: 743.1998901367187500
         -
            x: 685.9638061523437500
            y: 771.3800659179687500

......

等等

注意,00032009.jpg 是一张脸部的图片, x 和 y 是脸上一个点的坐标,例如眼睛右侧的角等。

请问您能指出一种读取文件并显示脸部图像上的点的方法吗?

编辑 1:以下是我收到的错误信息。

Error: File: ReadYamlRaw.m Line: 14 Column: 11
Expression or statement is incorrect--possibly unbalanced (, {, or [.
Error in ==> ReadYaml at 38
    ry = ReadYamlRaw(filename, 0, nosuchfileaction);

奇怪的是ReadYamlRaw.m文件中的第14行。
[pth,~,~]= fileparts(mfilename('fullpath'));

 Parse error at ','(second one) and ']' usage appears to be invalid matlab syntax.

那么,那里的波浪线有什么用?为什么会出错?
编辑2:我在上面的行中用虚拟变量替换了波浪线,然后我得到了这些错误 O_O
 Error using ==> ReadYamlRaw>scan at 81
Unknown data type: logical

Error in ==> ReadYamlRaw>scan_map at 138
            result.(ich) = scan(r.get(java.lang.String(ich)));

Error in ==> ReadYamlRaw>scan at 79
        result = scan_map(r);

Error in ==> ReadYamlRaw>scan_list at 116
        result{ii} = scan(i);

Error in ==> ReadYamlRaw>scan at 77
        result = scan_list(r);

Error in ==> ReadYamlRaw>scan_map at 138
            result.(ich) = scan(r.get(java.lang.String(ich)));

Error in ==> ReadYamlRaw>scan at 79
        result = scan_map(r);

Error in ==> ReadYamlRaw>load_yaml at 48
        result = scan(yaml.load(fileread([filename, fileext])));

Error in ==> ReadYamlRaw at 19
    result = load_yaml(filename, nosuchfileaction);

Error in ==> ReadYaml at 38
    ry = ReadYamlRaw(filename, 0, nosuchfileaction);

我也尝试使用不同的yml文件,看起来是这样的。
%YAML:1.0
RE-C:
   x: 919
   y: 580
LE-C:
   x: 1209
   y: 597
N-C:
   x: 1063
   y: 698
FO-B:
   x: 1045
   y: 1114
REL-O:
   x: 852
   y: 597
REL-I:
   x: 986
   y: 600
REL-T:
   x: 918
   y: 564

我收到以下错误信息。
Java exception occurred:
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
         ^


    at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirectiveName(ScannerImpl.java:1028)

    at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirective(ScannerImpl.java:990)

    at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDirective(ScannerImpl.java:534)

    at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:251)

    at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:179)

    at
    org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:198)

    at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:161)

    at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:146)

    at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105)

    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:121)

    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:480)

    at org.yaml.snakeyaml.Yaml.load(Yaml.java:399)


Error in ==> ReadYamlRaw>load_yaml at 48
        result = scan(yaml.load(fileread([filename, fileext])));

Error in ==> ReadYamlRaw at 19
    result = load_yaml(filename, nosuchfileaction);

Error in ==> ReadYaml at 38
    ry = ReadYamlRaw(filename, 0, nosuchfileaction);

也许有人能从这些中得出什么信息,或者你可以指出另一组可用的函数?我搜索了一下但没有找到除了这个以外的。

1
这看起来很像 YAML。 - David Brown
1
你尝试过yamlmatlab吗? - yuk
@ David Brown 文件是yml格式的。我可能会感到困惑,因为我不知道.yml和.yaml之间的区别。我已经下载并添加了yamlmatlab,但我不知道如何在我的情况下使用它 yaml_file = 'test.yaml'; >> YamlStruct = ReadYaml(yaml_file); 如果我将yaml替换为yml,它是否有效? - Michiru
1
@user1313569 是的,扩展名并不重要。 - David Brown
2个回答

10

确实是YAML文件(正如@DavidBrown在评论中提到的,扩展名并不重要)。但它存在一些问题。我不知道是由于错误的YAML格式还是MATLAB实现的问题。

我已经安装了YAMLMATLAB并对你的文件进行了一些操作。

YamlStruct = ReadYaml(yaml_file);

如果我将文件直接作为输入,YAMLMATLAB 会返回错误。只有当我注释掉第一行并删除字段名称中的空格时才有效。因此,文件的开头看起来像这样:

#YAML:1.0
Imagefile: 00032009.jpg
Contourscount: 8
...skipped the rest...

然后我得到了正确的结构。例如,您可以通过以下方式访问第一个点的x坐标:

YamlStruct.Contours{1}.Points{1}.x

ans =

  682.5947

更新

在YAMLMATLAB中,字段名称中的空格实际上是一个已知的问题。请参见报告和可能的解决方案此处

更新2

根据@Jirka_cigler(YAMLMATLAB开发人员组)的评论:

在程序版本0.4.3中,我们添加了对字段名称中空格的支持,因此该问题不应再次出现。

太好了!

我也删除了第一次更新中先前开发者对该问题的评论,因为它已经不正确了。


1
我在包中搜索 ~ 符号,并且在这个新特性的上下文中,它仅出现在三个语句中。其中一个是在 selftest_yamlmatlab.m 文件中的第42行(您可能不需要此文件),然后在 ReadYamlRaw.m 文件的第14行和 WriteYaml 文件的第7行。在这两个文件中,您可以只保留 pth = ... 或者用一些虚拟变量替换 ~ 符号,例如 [pth,dummy,dummy] = ...。我保证它会工作。如果不能,那么问题与 ~ 无关。 - yuk
我编辑了问题并附上了我得到的错误。我将ReadYamlRaw保存到which ReadYamlRaw返回的目录中。我不知道该怎么办了:( - Michiru
你应该使用#而不是MATLAB中的%来注释第一行。 - yuk
是的,我知道那个已经在文件里了,我没有添加那个。但现在我从旧版本中下载了0.1.1版,虽然只能与第二个文件一起使用,并且如果我注释掉%YAML 1.0,它才能正常工作。您还可以看到有像REL-I:这样的字段,但只有在我删除每个字段中的-时它才能正常工作。噢,有总比没有好,非常感谢您的帮助。我将您的回答标记为正确,因为它也可能对其他人有帮助,同时也帮助了我。 - Michiru
我属于开发人员的群体,因此我想要做出反应。在程序发布0.4.3版本中,我们增加了对字段名称中空格的支持,因此该问题不应再次出现。 - Jirka cigler
显示剩余8条评论

0

ZozaniDB数据库工具箱带有一个Matlab本地的YAML实现,可以处理这里的.yml文件。要解析字符串或文件,请使用:

>> yaml_parse ( str )
>> yaml_read ( filename )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接