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.

那么 ~ 在里面有什么用,为什么会出现错误?

Edit2:我用虚拟变量替换了上面一行中的 ~ 然后我得到了这个错误 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);

也许有人可以从中做出一些东西,或者您可以指出另一组可行的功能?我搜索了但没有找到除了这个之外的任何东西。

4

2 回答 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 中,我们添加了对字段名称中空格的支持,因此该问题不应再次出现。

伟大的!

我还删除了以前开发人员在第一次 UPDATE 中对该问题的评论,因为它不再是真的了。

于 2012-04-05T13:50:55.320 回答
0

ZozaniDB 数据库工具箱附带一个 Matlab 原生 YAML 实现,用于处理此处的 .yml 文件。要解析字符串或文件,请使用:

>> yaml_parse ( str )
>> yaml_read ( filename )
于 2015-03-14T07:34:19.807 回答