2014-01-15 7 views
5

Ich versuche Opencv's .yml-Datei in ArrayLists Mittelwert, Projektion und Etiketten zu laden. Ich habe diese drei Arraylisten erstellt und versuche die Elemente aus der .yml-Datei zu analysieren. Ich habe snakeYAML documentation gefunden. Allerdings habe ich keinen richtigen Weg gefunden. Ich versucheLoad .yml-Datei in Hashmaps mit Snakeyaml (Import Junit-Bibliothek)

final String fileName = "train.yml"; 
    opencvmatrix mat = new opencvmatrix(); 
    Yaml yaml = new Yaml(); 

    try { 
    InputStream ios = new FileInputStream(new File(fileName)); 

    // Parse the YAML file and return the output as a series of Maps and Lists 
    Map<String,Object> result = (Map<String,Object>)yaml.load(ios); 
    System.out.println(result.toString()); 
    Collection<Object> file = result.values(); 



    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

}

ich als Fehler erhalte verwenden die folgenden:

Exception in thread "main" while scanning a directive 
in 'reader', line 1, column 1: 
%YAML:1.0 
^ 
expected alphabetic or numeric character, but found :(58) 
in 'reader', line 1, column 6: 
%YAML:1.0 
    ^

at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirectiveName(ScannerImpl.java:1269) 
at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirective(ScannerImpl.java:1221) 
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDirective(ScannerImpl.java:614) 
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:306) 
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:226) 
at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:195) 
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158) 
at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:143) 
at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:104) 
at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:120) 
at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481) 
at org.yaml.snakeyaml.Yaml.load(Yaml.java:412) 
at projectCV.main(projectCV.java:33) 
Java Result: 1 

EDIT1: Ich habe bemerkt, dass meine Probleme für assertEquals steht, die eine Funktion der ist Klasse aktiviert einen Teil der Junit-Bibliothek. Ich kann keinen Weg finden, die Bibliothek korrekt in meinen Klassenpfad zu importieren. Ich versuche zwei Dinge, download .jar Datei und ADD/Jar-Ordner und aus Projekteigenschaften-> Bibliotheken-> Tests kompilieren-> Bibliothek hinzufügen -> Junit 4.10. Aber ich habe immer noch Probleme.

EDIT2: Ich ändere die YAML 1.0 zu YAML 1.1, aber nichts ändert sich. Ich versuche immer noch, einen geeigneten Weg zu finden, die Yml-Datei zu lesen.

 final String fileName = "train.yml"; 
    opencvmatrix mat = new opencvmatrix(); 
    Yaml yaml = new Yaml(); 

    try { 
    InputStream ios = new FileInputStream(new File(fileName)); 

    // Parse the YAML file and return the output as a series of Maps and Lists 
    Map<String,Object> result = (Map<String,Object>)yaml.load(ios); 
    System.out.println(result.toString()); 
    Collection<Object> file = result.values(); 



    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

}

, als ich diesen Code auszuführen versuche ich erhalte:

Exception in thread "main" Can't construct a java object for tag:yaml.org,2002:opencv- 
matrix; exception=Class not found: opencv-matrix 
in 'reader', line 3, column 7: 
mean: !!opencv-matrix 
    ^

EDIT3: Ich habe eine Klasse opencvmatrix erstellt (wie der Name .yml Eigenschaften), mit die Eigenschaften rows, cols, dt, ArrayList-Daten. Die .yml Datei ist wie:

num_components: 19 
num_components: 19 
mean: !!opencvmatrix 
rows: 1 
cols: 3600 
dt: d 
data: [ 9.6842105263157890e+01, 1.0257894736842104e+02, 
    1.0557894736842104e+02, 1.0794736842105263e+02, 
    1.1752631578947367e+02, 1.1631578947368421e+02, 
    1.1084210526315789e+02, 1.0373684210526315e+02, 
    1.0052631578947368e+02, 9.5263157894736835e+01, 
    9.0421052631578945e+01, 8.5631578947368411e+01, 
    7.8684210526315780e+01, 7.2105263157894740e+01, 
    6.9315789473684205e+01, 6.9105263157894740e+01, 
    7.1052631578947370e+01, 7.9631578947368411e+01, 
    9.0894736842105260e+01, 1.0121052631578947e+02, 
    ....] 
    projections: 
    - !!opencvmatrix 
    rows: 1 
    cols: 19 
    dt: d 
    data: [ 1.6852352677811423e+03, -1.0112905042030820e+03, 
     -1.3152188243875064e+03, 4.8298990155435700e+02, 
     9.1980535900698968e+01, 6.5624763621018792e+02, 
     -1.2380244625181117e+03, -1.8800931631152707e+02, 
     -4.1473232893431384e+02, 5.7197035514178856e+02, 
     4.9990276749703435e+02, 4.9062987890888604e+02, 
     6.1928710580829818e+02, -1.2842392693864540e+03, 
     2.4907719466932619e+01, 8.0299588479341844e+02, 
     1.1621501008120421e+02, 1.0410492864645674e+02, 
     8.5302163830384785e+01 ] 
    - !!opencvmatrix 
    rows: 1 
    cols: 19 
    dt: d 
    data: [ -1.0313663745467784e+03, 1.9900404646205566e+03, 
     -1.2844533156050284e+02, -4.3700867528097513e+02, 
     6.6145551346834259e+02, -2.0562483671734990e+03, 
     -1.9643774942432364e+02, 4.9329679854416281e+02, 
     -2.0003326324501427e+02, 1.0737995038485865e+03, 
     5.4161214984553695e+01, 4.7932826490658994e+02, 
     8.6307152262273064e+02, 6.7413046532276610e+02, 
     6.3835284527337114e+02, 4.1663169960066972e+02, 
     3.5883912817427905e+01, -1.2935687563770381e+02, 
     -1.6471877227400194e+03 ] 
    ... 
    labels: !!opencvmatrix 
    rows: 1 
    cols: 19 
    dt: i 
    data: [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3 ] 

Nun, ohne den Haupt-Code zu ändern ich folgende Fehlermeldung erhalte:

Can't construct a java object for tag:yaml.org,2002:opencvmatrix; exception=No single 
    argument constructor found for class opencvmatrix 
    in 'reader', line 1, column 7: 
    mean: !!opencvmatrix 
    ^

Antwort

6

Ich versuche, endlich den obigen Code:

public static void main(String[] args) { 
    // The path of your YAML file. 
    final String fileName = "test.yml"; 
    ArrayList<String> key = new ArrayList<String>(); 
    ArrayList<String> value = new ArrayList<String>(); 
    Yaml yaml = new Yaml(); 

    try { 
     InputStream ios = new FileInputStream(new File(fileName)); 

     // Parse the YAML file and return the output as a series of Maps and Lists 
     Map< String, Object> result = (Map< String, Object>) yaml.load(ios); 
     for (Object name : result.keySet()) { 

      key.add(name.toString()); 
      value.add(result.get(name).toString());  
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    System.out.println(key + " " + value); } 

die eigentlich .yml Datei liest und gibt die Schlüssel und die Werte Korrespondentin der Datei. Mein Problem ist, dass der Wert andere Objekte enthält, die ihrerseits aufgrund der Reihenfolge der Yaml-Datei andere Maps enthalten. Println zeigt das oben im Terminal:

[mean, eigenvalues, eigenvectors, projections, labels] [[email protected], [email protected], [email protected], [[email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]], [email protected]] 

Wie kann ich Zugriff auf die zurückgegebenen verschachtelten Objekte haben ???

Edit2: Eigentlich musste ich die zurückgegebenen Objekte aus der .yaml-Datei zu einer neuen Klasse, die ich definieren muss. Also mein Code zum Lesen von .yml-Elementen (Gesichtserkennungs-trainierte Elemente):

ArrayList<String> key = new ArrayList<String>(); 
    ArrayList<String> value = new ArrayList<String>(); 

    ArrayList<Object> obj = new ArrayList<Object>(); 
    ArrayList<Object> objected = new ArrayList<Object>(); 
    opencvmatrix mean = new opencvmatrix(); 
    opencvmatrix eigenValues = new opencvmatrix(); 
    opencvmatrix eigenVectors = new opencvmatrix(); 
    ArrayList<Object> opencvmatrix4 = new ArrayList<Object>(); 
    opencvmatrix labels = new opencvmatrix(); 
    opencvmatrix opencvmatrix6 = new opencvmatrix(); 
    ArrayList<ArrayList<Double>> projections = new ArrayList<ArrayList<Double>>(); 
    Yaml yaml = new Yaml(); 

    try { 
     InputStream ios = new FileInputStream(new File(fileName)); 
     // Parse the YAML file and return the output as a series of Maps and Lists 
     Map< String, Object> result = (Map< String, Object>) yaml.load(ios); 
     for (Object name : result.keySet()) { 
      key.add(name.toString()); 
      obj.add(result.get(name)); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    File file = new File("eigenvalues.txt"); 
    // creates the file 
    file.createNewFile(); 
    // creates a FileWriter Object 
    FileWriter writer = new FileWriter(file); 
     // Writes the content to the file 


    mean = (opencvmatrix) (obj.get(0)); 
    eigenValues = (opencvmatrix) (obj.get(1)); 
    eigenVectors = (opencvmatrix) (obj.get(2)); 

    opencvmatrix4 = (ArrayList<Object>) obj.get(3); 

    for(int i=0; i<opencvmatrix4.size(); i++){ 

     opencvmatrix6 = (opencvmatrix)opencvmatrix4.get(i); 
     projections.add(opencvmatrix6.data); 
    } 

    //System.out.println(projections.get(0).size()); 

    labels = (opencvmatrix) (obj.get(4)); 
    //System.out.println(obj3.data.size()); 

    writer.write(eigenVectors.data.get(0) + "  "); 
    temp.add(eigenVectors.data.get(0)); 
    eigenMatrix.add(temp); 

    for (int i = 1; i < eigenVectors.data.size(); i++) { 

     if (i % 3600 == 0) { 
      writer.write("\n"); 
      eigenMatrix.add(temp); 
      temp.clear(); 

     } 

     writer.write(eigenVectors.data.get(i) + "  "); 
     temp.add(eigenVectors.data.get(i)); 

    } 
    writer.flush(); 
    writer.close(); 
1

SnakeYAML ist YAML 1.1-Parser und Sie versuchen, YAML 1.0 zu analysieren. Es wird von angegeben "% YAML: 1,0" Richtlinie

YAML 1.1 hat unterschiedliche Syntax (http://yaml.org/spec/1.0/#id2558635 3.2.3.3 in den Spezifikationen sehen) - "% YAML 1.1" (siehe 7.1.1 in den Spezifikationen http://yaml.org/spec/1.1/#id895631)

Sie können versuchen, diese Anweisung aus Ihrer Datei zu entfernen oder sie in "% YAML 1.1" zu ändern und hoffen, dass sie korrekt analysiert wird.

+0

Nichts ist gleich.Ich habe die erste Zeile in% YAML: 1.1 geändert, allerdings wurde nichts geändert. –

+0

"% YAML 1.1" nicht "% YAML: 1.1". Basierend auf deiner 2. Bearbeitung sind sie falsch. Ausnahme hat sich geändert. Es begann schließlich, den Inhalt Ihrer yaml-Datei zu analysieren. Jetzt haben Sie einen anderen Fehler. Wie es sagt "Klasse nicht gefunden: opencv-matrix" SnakeYaml versucht, ein Objekt des Typs opencv-matrix zu erzeugen, ausgelöst durch !! opencv-matrix Tag. – maslovalex

+0

Also habe ich jedes Element der .yml-Datei in separate Objekte analysieren? –