BaiduBodySegmentManager.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.Networking;
  6. using Newtonsoft.Json;
  7. using UnityEngine.Events;
  8. public class BaiduBodySegmentManager : MonoBehaviour
  9. {
  10. public static BaiduBodySegmentManager Instance;
  11. private const string CLIENTID = @"ltiCIE7Rq17Nt2MH77LX6Qmv";
  12. private const string CLIENTSECRET = @"fjSdI4zFd9QjfFTWymf1sXKQrjzy0UjH";
  13. private const string TOKENURL = @"https://aip.baidubce.com/oauth/2.0/token";
  14. private const string BODYSEGURL = @"https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg?access_token=";
  15. private string token = @"25.0acc4e48d0f7450dd320126240dbaa7c.315360000.2037861152.282335-101570444"; // 后续会Get // 可以用一个月
  16. [SerializeField] private Texture2D texture2dOriginalPhoto;
  17. [SerializeField] private Texture2D texture2dResultPhoto;
  18. private TokenJson tokenJson;
  19. private ResultJson resultJson;
  20. public static event UnityAction<Texture2D> OnResultCallback;
  21. // ==================================================
  22. private void Awake() => Instance = this;
  23. // private void Update()
  24. // {
  25. // if (Input.GetKeyUp(KeyCode.U))
  26. // {
  27. // string testPath = @"D:\2024-06-08 00.33.12.1717777992216_myPic_0.jpg";
  28. // preuploadTexture = TextureProcessor.ReadTexture(testPath);
  29. // preuploadTexture = TextureProcessor.RotateTexture(preuploadTexture, false);
  30. // preuploadTexture = TextureProcessor.HorizontalFlipTexture(preuploadTexture);
  31. // preuploadTexture = TextureProcessor.ScaleTexture(preuploadTexture, preuploadTexture.width * .7f, preuploadTexture.height * .7f);
  32. // preuploadTexture.Apply();
  33. // UploadPhoto2Baidu(preuploadTexture);
  34. // }
  35. // }
  36. // ==================================================
  37. /// <summary>
  38. /// 更新原图
  39. /// </summary>
  40. /// <param name="value"></param>
  41. public void UpdateOriginalPhotoTexture2D(Texture2D value)
  42. {
  43. texture2dOriginalPhoto = value;
  44. return;
  45. }
  46. /// <summary>
  47. /// 人像分割
  48. /// </summary>
  49. public void StartBodySegment() => StartCoroutine(nameof(BodySegmentAction));
  50. private IEnumerator BodySegmentAction()
  51. {
  52. #region GetToken // 获取Token
  53. string url = $"{TOKENURL}?client_id={CLIENTID}&client_secret={CLIENTSECRET}&grant_type=client_credentials";
  54. using (UnityWebRequest request = UnityWebRequest.Post(url, ""))
  55. {
  56. request.SetRequestHeader("Content-Type", "application/json");
  57. request.SetRequestHeader("Accept", "application/json");
  58. yield return request.SendWebRequest();
  59. if (request.result != UnityWebRequest.Result.Success)
  60. {
  61. Debug.LogError("[BBSM] Error " + request.error);
  62. yield break;
  63. }
  64. tokenJson = JsonConvert.DeserializeObject<TokenJson>(request.downloadHandler.text);
  65. token = tokenJson.access_token;
  66. }
  67. #endregion
  68. #region BodySegment // 人像分割
  69. string base64 = Texture2Base64(texture2dOriginalPhoto);
  70. WWWForm form = new WWWForm();
  71. form.AddField("image", base64);
  72. using (UnityWebRequest request = UnityWebRequest.Post(BODYSEGURL + token, form))
  73. {
  74. request.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  75. yield return request.SendWebRequest();
  76. if (request.result != UnityWebRequest.Result.Success)
  77. {
  78. Debug.LogError("[BBSM] Error " + request.error);
  79. yield break;
  80. }
  81. // Debug.Log(request.downloadHandler.text);
  82. resultJson = JsonConvert.DeserializeObject<ResultJson>(request.downloadHandler.text);
  83. string foregroundBase64 = resultJson.foreground;
  84. if (!string.IsNullOrEmpty(foregroundBase64)) // 判断是否有图
  85. {
  86. texture2dResultPhoto = Base642Texture(foregroundBase64);
  87. if (OnResultCallback != null)
  88. {
  89. OnResultCallback(texture2dResultPhoto);
  90. }
  91. }
  92. else
  93. {
  94. // 重拍???
  95. Debug.LogError("[BBSM] Error foreground image null");
  96. texture2dResultPhoto = null;
  97. if (OnResultCallback != null)
  98. {
  99. OnResultCallback(null); // 没拍到 // 传空的回去
  100. }
  101. }
  102. #endregion
  103. yield break;
  104. }
  105. }
  106. // ==================================================
  107. // 工具类
  108. /// <summary>
  109. /// 贴图转Base64
  110. /// </summary>
  111. /// <param name="value"></param>
  112. /// <returns></returns>
  113. public static string Texture2Base64(Texture2D value)
  114. {
  115. if (value == null)
  116. {
  117. return null;
  118. }
  119. Texture2D texture2d = new Texture2D(value.width, value.height, TextureFormat.RGBA32, false);
  120. texture2d.SetPixels(value.GetPixels());
  121. texture2d.Apply();
  122. byte[] bytes = texture2d.EncodeToPNG();
  123. string base64String = Convert.ToBase64String(bytes);
  124. return base64String;
  125. }
  126. /// <summary>
  127. /// Base64转贴图
  128. /// </summary>
  129. /// <param name="value"></param>
  130. /// <returns></returns>
  131. public static Texture2D Base642Texture(string value)
  132. {
  133. if (value == null)
  134. {
  135. return null;
  136. }
  137. byte[] bytes = Convert.FromBase64String(value);
  138. Texture2D texture2d = new Texture2D(1, 1);
  139. texture2d.LoadImage(bytes);
  140. return texture2d;
  141. }
  142. // ==================================================
  143. // 数据类
  144. [Serializable]
  145. public class TokenJson
  146. {
  147. public string refresh_token;
  148. public int expires_in;
  149. public string session_key;
  150. public string access_token;
  151. public string scope;
  152. public string session_secret;
  153. }
  154. [Serializable]
  155. public class ResultJson
  156. {
  157. public string log_id;
  158. public string labelmap;
  159. public string scoremap;
  160. public string foreground;
  161. public string person_num;
  162. public object person_info;
  163. }
  164. }