2016-04-02 10 views
0

У меня возникли проблемы с отображением результата, возвращаемого Emotion API. Результат возвращается в виде Emotion []. Код выглядит следующим образом:Отображение проекта API-интерфейс Oxford's Emotion API в 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()); 
     } 
    } 

и мне нужно найти наиболее доминирующую эмоцию от результатов различных эмоций.

ответ

1

Я пошел в API reference. Он возвращает 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 
    } 
    } 
] 

я вставил, что в http://json2csharp.com/ и она породила некоторые классы для меня. (Я переименовал корневой класс в Emotion и заменил класс scores на IDictionary<string, double>. Это потому, что вы не просто хотите получить свойство для каждой эмоции. Вам нужен набор, который вы можете сортировать, чтобы найти наивысшую эмоцию. (IDictionary<string, double> было тем, что больше всего .. легко десериализации JSON в)

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

Тогда я написал тест блока и вставить в формате JSON со страницы API от Microsoft, чтобы увидеть, смогу ли я десериализации это я добавил Newtsonsoft.Json Nuget package и написал это:

[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}}]"; 

} 

Тест проходит, так оно и есть. a Dictionary<string,double>, содержащий оценки, поэтому вы можете отображать их и находить эмоции с наивысшим результатом.

+0

Я нашел эти определения классов в файлах примеров API Emotion, но проблема в том, что я не смог преобразовать его в словарь или List даже с встроенными командами. Я полагаю, что существует путь, не противоречащий определениям классов в файлах Microsoft.ProjectOxford.Emotion.Contract. –

+0

Предложение Скотта довольно хорошее, но если вы уже используете клиентский SDK, он включает сериализацию Emotion [] для строки и обратно в _other_ Emotion []. Другой вариант - это что-то вроде этого: '' var top = emotions.Select (emotion => { var dict = new Словарь (); foreach (свойство var в typeof (Scores) .GetProperties()) { dict.Add (property.Name, (плавающее) property.GetValue (emotion.Scores));} возврата dict.OrderByDescending (кв => kv.Value) .ThenBy (кв => kv.Key) .First(); }); '' – cthrash

+0

@ScottHannen Мой проект работает, спасибо за помощь :) –