tikemonton
@tikemonton

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Unity で AmazonRekognitionを使って、ボタンを押した時に 感情値データを上手く取得できない問題の対処法

実現したいこと

以下の記事を参考に、Unity でボタンを押した時にwebカメラの画像を取得してAmazon Recognition から返される、Json形式の感情値をデバッグログ出力させようと試みています。
開発環境は、Unity 2020.3.6f1 で Mac OS を使用しています。開発言語は C# です。
C#もUnityも初心者で、もし丸投げの質問になってたらすみません。
情報の過不足などあればご指摘よろしくお願いします!

発生している問題

システム実行後、1回目にボタンを押した時は感情値 "Emotions" の "Confidence" と "Type" を取得してデバッグログに出力できました。しかし、その後 2 回目にボタンを押した時は "Type" の値がデバッグログに出力されず "Confidence" の値だけが出力されてしまいます。
何故 "Type" の値がデバッグログに出力されないのかがわかりません。
エラーコードが出ず、困っています。

1回目にボタンを押した時のデバッグログ
"Confidence" と "Type" の値が交互にデバッグログに出力されている。
qiita質問2021-07-14No2.png

2回目にボタンを押した時のデバッグログ
"Confidence"の値だけデバッグログに出力されている。
qiita質問2021-07-14No1.png

該当するソースコード

以下のように、他のスクリプトから ボタンを押した時に Example() を実行

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SampleCode : MonoBehaviour
{
    public Button button;
    FaceRecognition script; 

       public void start()
       { 

              button.onClick.AddListener(() =>
                   {
                        StartCoroutine(script.Example());
                   }
              );

        }

}

以下、参考記事の完成コードから Example() と UseReko() の部分を変更したソースコード

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Amazon.Rekognition;
using Amazon.Rekognition.Model;

public class FaceRecognition : MonoBehaviour
{

    public RawImage rawImage;

    WebCamTexture webCamTexture;

    //textureをtexture2dにする関数
    public Texture2D ToTexture2D(Texture self)
    {
        var sw = self.width;
        var sh = self.height;
        var format = TextureFormat.RGBA32;
        var result = new Texture2D(sw, sh, format, false);
        var currentRT = RenderTexture.active;
        var rt = new RenderTexture(sw, sh, 32);
        Graphics.Blit(self, rt);
        RenderTexture.active = rt;
        var source = new Rect(0, 0, rt.width, rt.height);
        result.ReadPixels(source, 0, 0);
        result.Apply();
        RenderTexture.active = currentRT;
        return result;
    }

    //Amazon Rekognition
    public IEnumerator Example()
    {
        var img2d = ToTexture2D(webCamTexture);
        var img = img2d.EncodeToJPG();
        var stream = new MemoryStream(img);
        List<string> att = new List<string>() { "ALL" };
        var rekoImg = new Amazon.Rekognition.Model.Image { Bytes = stream };
        var reqImg = new DetectFacesRequest {Attributes=att, Image = rekoImg };

        //Amazon.RegionEndpoint.USEast1を追記した。    
        AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient("AWSのアクセスキー", "AWSのシークレットキー", Amazon.RegionEndpoint.USEast1);
        var response = rekognitionClient.DetectFaces(reqImg);


        foreach(var i in response.FaceDetails[0].Emotions)
        {

            Debug.Log(i.Confidence);
            Debug.Log(i.Type);

        }

        yield return null;

    }

    //start
    public void Start()
    {
        webCamTexture = new WebCamTexture();
        rawImage.texture = webCamTexture;
        webCamTexture.Play();

    }


}



調べた時に出てきた記事

http://blog.lab7.biz/archives/26945319.html
https://teratail.com/questions/127973

0

No Answers yet.

Your answer might help someone💌