1
0

FaceDetectorManager.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using ToneTuneToolkit.Common;
  5. using Mediapipe.Tasks.Core;
  6. using Mediapipe.Unity;
  7. using Mediapipe.Unity.Sample;
  8. using Mediapipe.Unity.Sample.FaceDetection;
  9. /// <summary>
  10. /// 面部检测工具管理器
  11. /// 延后初始化
  12. ///
  13. /// 基本配置文件
  14. /// ..\MediaPipeUnity\Samples\Scenes\AppSettings.asset
  15. /// </summary>
  16. public class FaceDetectorManager : SingletonMaster<FaceDetectorManager>
  17. {
  18. [SerializeField] private FaceDetectorRunner runner;
  19. // ==================================================
  20. private void Start() => Init();
  21. // ==================================================
  22. private void Init() => StartCoroutine(nameof(DelayInit));
  23. private IEnumerator DelayInit()
  24. {
  25. yield return new WaitForSeconds(3f);
  26. InitImageSource();
  27. InitRunnerConfig();
  28. runner.Play();
  29. }
  30. // ==================================================
  31. #region 面部检测状态控制
  32. /// <summary>
  33. /// 开关暂停恢复检测
  34. /// </summary>
  35. /// <param name="value"></param>
  36. public void SwitchFaceDetector(FaceDetectorState value)
  37. {
  38. switch (value)
  39. {
  40. default: break;
  41. case FaceDetectorState.Play: runner.Play(); break;
  42. case FaceDetectorState.Stop: runner.Stop(); break;
  43. case FaceDetectorState.Pause: runner.Pause(); break;
  44. case FaceDetectorState.Resume: runner.Resume(); break;
  45. }
  46. }
  47. public enum FaceDetectorState
  48. {
  49. Play = 0, // 具备Reload功能
  50. Stop = 1, Pause = 2, Resume = 3
  51. }
  52. #endregion
  53. // ==================================================
  54. #region 画面源、面部检测参数初始化
  55. private void InitImageSource()
  56. {
  57. ImageSourceProvider.Switch(ImageSourceType.WebCamera);
  58. ImageSource imageSource = ImageSourceProvider.ImageSource;
  59. imageSource.SelectSource(0); // 0:BRIO 1:USBHD
  60. imageSource.SelectResolution(7); // 1280x720 30fps
  61. imageSource.isHorizontallyFlipped = false;
  62. }
  63. private void InitRunnerConfig()
  64. {
  65. runner.config.Delegate = BaseOptions.Delegate.CPU;
  66. runner.config.ImageReadMode = ImageReadMode.CPUAsync;
  67. runner.config.Model = ModelType.BlazeFaceShortRange;
  68. runner.config.RunningMode = Mediapipe.Tasks.Vision.Core.RunningMode.LIVE_STREAM;
  69. runner.config.MinDetectionConfidence = 0.4f; // 0.0 - 1.0 // 越高越不容易误检
  70. runner.config.MinSuppressionThreshold = 0.3f; // 0.0 - 1.0
  71. runner.config.NumFaces = 3; // 1-3
  72. }
  73. #endregion
  74. }