0

Emotion API から返された結果の表示に問題があります。結果は Emotion[] の形式で返されます。コードは次のとおりです。

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

そして、さまざまな感情の結果から最も支配的な感情を見つける必要があります。

4

1 に答える 1

1

APIリファレンスに行きました。次のような 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に置き換えましscoresIDictionary<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; }
}

次に、単体テストを作成し、Microsoft の API ページから JSON を貼り付けて、逆シリアル化できるかどうかを確認しました。Newtsonsoft.Json Nuget パッケージを追加して、次のように記述しました。

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

}

テストはパスしたので、それだけです。スコアを含むがDictionary<string,double>あるので、スコアを表示して最高スコアの感情を見つけることができます。

于 2016-04-03T00:19:35.113 に答える