Unity で AmazonRekognitionを使って、ボタンを押した時に 感情値データを上手く取得できない問題の対処法
Q&A
Closed
実現したいこと
以下の記事を参考に、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" の値が交互にデバッグログに出力されている。
2回目にボタンを押した時のデバッグログ
"Confidence"の値だけデバッグログに出力されている。
該当するソースコード
以下のように、他のスクリプトから ボタンを押した時に 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