2012-04-04 146 views
5

我想在Matlab中读取.yml文件。这些文件包含脸部图像上关键点的坐标x和y。我寻找不同的工具,但我似乎没有找到任何答案。在matlab中读取.yml文件

我.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

[pth,~,~]= fileparts(mfilename('fullpath')); 

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

那么,什么是在那里利用〜的,为什么线14有没有错误?

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); 

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

+1

,看起来很像YAML我 – 2012-04-04 18:42:42

+1

您是否尝试过[yamlmatlab(http://code.google.com/p/yamlmatlab/)? – yuk 2012-04-04 18:59:19

+0

@ David Brown文件是yml。我可能会感到困惑,因为我不知道.yml和.yaml之间的区别。我已经下载并添加了yamlmatlab,但我不知道如何在我的情况下使用它yaml_file ='test.yaml'; >> YamlStruct = ReadYaml(yaml_file);如果我用yml替换yaml它应该工作吗? – Michiru 2012-04-04 19:06:07

回答

8

这的确是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 

UPDATE

空间中提起的名字实际上是YAMLMATLAB一个已知的问题。请参阅报告和可能的解决方案here

更新2

根据从@Jirka_cigler(YAMLMATLAB开发组)发表评论:

In the program release 0.4.3 we added support for whitespaces in field names, so the problem should not appear again.

太好了!

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

+0

谢谢你的回复。我得到这个错误错误:文件:ReadYamlRaw.m行:14列:11 表达式或语句不正确 - 可能不平衡(,{,或[.Error在==> Readyaml在38 ry = ReadYamlRaw(文件名,0, nosuchfileaction);我已经将0032009.yml放入yaml_file变量,删除空格并按照你所说的注释第一行,然后读取它,但是发生了这个错误,文件夹和子文件夹被添加到了MATLAB路径中。 ! – Michiru 2012-04-05 19:15:28

+0

我可能会补充说我使用的是r2007b版本,因为这是我老师告诉我安装的原因,不是因为我想要,也许这就是导致错误的原因, – Michiru 2012-04-05 19:26:56

+0

错误很奇怪,可能是yamlmatlab被破坏了。重新下载并安装最新版本,你能上传你的yml文件吗?一些公共分享网站可能是?我会看看。 – yuk 2012-04-05 20:12:09

0

ZozaniDB Database Toolbox附带了一个Matlab本地YAML实现,它在这里处理.yml文件。解析字符串或文件,使用:

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