читать.в формате YML файлов в 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-координаты точки На грани, например: правый угол глаза и т. д.
не могли бы вы указать способ прочитать файл, а затем отобразить точки На изображении лица?
Edit 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);
что странно, это строка 14 в ReadYamlRaw.м
[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);
может быть, кто-то может сделать что-то из них или вы могли бы указать другой набор функций, которые будут работать? Я поискал, но не нашел ничего, кроме этого.
2 ответов
это действительно файл YAML (как упоминал @DavidBrown в своем комментарии, расширение не имеет значения). Но у него есть некоторые проблемы. Не знаю, связано ли это с неправильным форматом YAML или реализацией MATLAB.
Я установил YAMLMATLAB и немного поиграл с вашим файлом.
YamlStruct = ReadYaml(yaml_file);
YAMLMATLAB возвращает ошибку, если файлы являются фид как есть. Это работает только если я комментирую первую строку и удалить пробелы из имен полей. Итак, начало файла выглядит так это:
#YAML:1.0
Imagefile: 00032009.jpg
Contourscount: 8
...skipped the rest...
тогда я получаю правильную структуру. Например, вы можете получить доступ к 1-й точке x координат
YamlStruct.Contours{1}.Points{1}.x
ans =
  682.5947
обновление
пробел в именах файлов на самом деле является известной проблемой в YAMLMATLAB. См. отчет и возможное решение здесь.
обновление 2
согласно комментарию @Jirka_cigler (YAMLMATLAB developers group):
в версия программы 0.4.3 добавлена поддержка пробелов в поле имена, поэтому проблема не должна появляться снова.
великолепно!
Я также удалил предыдущий комментарий разработчиков по проблеме в первом обновлении, так как это уже не так.
ZozaniDB Базы Данных Toolbox поставляется с MATLAB-родной реализацией YAML, которая обрабатывает .файл yml здесь. Чтобы проанализировать строку или файл, используйте:
>> yaml_parse ( str )
>> yaml_read ( filename )
