2012-04-04 147 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)