2016-04-02 5 views
0

Ich habe Probleme, das von der Emotion-API zurückgegebene Ergebnis anzuzeigen. Ergebnis wird in Form von Emotion [] zurückgegeben. Der Code ist wie folgtAnzeige der Emotion API von Project Oxford in C#

private async void button2_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      pictureBox2.Image = (Bitmap)pictureBox1.Image.Clone(); 
      String s = System.Windows.Forms.Application.StartupPath + "\\" + "emotion.jpg"; 
      pictureBox2.Image.Save(s); 

      string imageFilePath = s;// System.Windows.Forms.Application.StartupPath + "\\" + "testing.jpg"; 
      Uri fileUri = new Uri(imageFilePath); 

      BitmapImage bitmapSource = new BitmapImage(); 
      bitmapSource.BeginInit(); 
      bitmapSource.CacheOption = BitmapCacheOption.None; 
      bitmapSource.UriSource = fileUri; 
      bitmapSource.EndInit(); 

     // _emotionDetectionUserControl.ImageUri = fileUri; 
      // _emotionDetectionUserControl.Image = bitmapSource; 

      System.Windows.MessageBox.Show("Detecting..."); 

      ***Emotion[] emotionResult*** = await UploadAndDetectEmotions(imageFilePath); 

      System.Windows.MessageBox.Show("Detection Done"); 

     } 
     catch (Exception ex) 
     { 
      System.Windows.MessageBox.Show(ex.ToString()); 
     } 
    } 

und ich brauche die dominante Emotion aus den Ergebnissen der verschiedenen Emotionen zu finden.

Antwort

1

Ich ging zum API reference. Es gibt JSON wie folgt aus:

[ 
    { 
    "faceRectangle": { 
     "left": 68, 
     "top": 97, 
     "width": 64, 
     "height": 97 
    }, 
    "scores": { 
     "anger": 0.00300731952, 
     "contempt": 5.14648448E-08, 
     "disgust": 9.180124E-06, 
     "fear": 0.0001912825, 
     "happiness": 0.9875571, 
     "neutral": 0.0009861537, 
     "sadness": 1.889955E-05, 
     "surprise": 0.008229999 
    } 
    } 
] 

ich, dass in http://json2csharp.com/ eingefügt und es erzeugt für mich einige Klassen. (Ich habe die Root-Klasse umbenannt in Emotion und ersetzt die scores Klasse durch eine IDictionary<string, double>. Das ist, weil Sie nicht nur eine Eigenschaft für jede Emotion wollen. Sie wollen eine Menge, die Sie sortieren können, um die höchste Emotion zu finden. (IDictionary<string, double> war was am meisten .. einfach, die json in)

public class FaceRectangle 
{ 
    public int left { get; set; } 
    public int top { get; set; } 
    public int width { get; set; } 
    public int height { get; set; } 
} 

public class Emotion 
{ 
    public FaceRectangle faceRectangle { get; set; } 
    public IDictionary<string, double> scores { get; set; } 
} 

Dann schrieb ich einen Komponententest und eingefügt in den JSON von der Microsoft-API Seite deserialisiert, um zu sehen, ob ich es deserialisieren konnte ich hinzugefügt, um die Newtsonsoft.Json Nuget package und schrieb dazu:

[TestClass] 
public class DeserializeEmotion 
{ 
    [TestMethod] 
    public void DeserializeEmotions() 
    { 
     var emotions = JsonConvert.DeserializeObject<Emotion[]>(JSON); 
     var scores = emotions[0].scores; 
     var highestScore = scores.Values.OrderByDescending(score => score).First(); 
     //probably a more elegant way to do this. 
     var highestEmotion = scores.Keys.First(key => scores[key] == highestScore); 
     Assert.AreEqual("happiness", highestEmotion); 
    } 

    private const string JSON = 
     "[{'faceRectangle': {'left': 68,'top': 97,'width': 64,'height': 97},'scores': {'anger': 0.00300731952,'contempt': 5.14648448E-08,'disgust': 9.180124E-06,'fear': 0.0001912825,'happiness': 0.9875571,'neutral': 0.0009861537,'sadness': 1.889955E-05,'surprise': 0.008229999}}]"; 

} 

Der Test ist bestanden, also ist es das. Sie haben a Dictionary<string,double> enthält die Noten, so dass Sie beide anzeigen können und die Emotion mit der höchsten Punktzahl finden.

+0

Ich fand diese Klassendefinitionen innerhalb der Dateien von Emotion API Beispielen, aber Problem ist, dass ich es nicht in Dictionary oder eine Liste sogar mit eingebauten Befehlen konvertieren konnte. Ich nehme an, dass es einen Weg geben muss, ohne mit den Klassendefinitionen in den Microsoft.ProjectOxford.Emotion.Contract-Dateien zu kollidieren. –

+0

Der Vorschlag von Scott ist ziemlich gut, aber wenn Sie bereits das Client-SDK verwenden, umfasst es das Serialisieren der Emotion [], um in der _other_ Emotion [] zu string und zurück zu gehen. Eine andere Option ist etwa so: '' var top = emotions.Select (> { ) var dict = neues Dictionary (); foreach (var-Eigenschaft in typeof (Scores) .GetProperties() ) { dict.Add (property.Name, (float) property.GetValue (emotion.Scores)); } return dict.OrderByDescending (kv => kv.Value) .ThenBy (kv => kv.Key) .First(); }); '' – cthrash

+0

@ScottHannen Mein Projekt funktioniert Danke für die Hilfe :) –

Verwandte Themen