InfraredCameraHelper.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System;
  5. using Serenegiant.UVC;
  6. using UnityEngine.UI;
  7. namespace InfraredManager
  8. {
  9. public class InfraredCameraHelper
  10. {
  11. #region 单例
  12. private static InfraredCameraHelper _Instance;
  13. public static InfraredCameraHelper GetInstance()
  14. {
  15. if (_Instance == null) _Instance = new();
  16. return _Instance;
  17. }
  18. #endregion
  19. #region 创建销毁
  20. private GameObject _managerObject;
  21. private ScreenLocate _screenLocate;
  22. public static List<RawImage> InfraredCameraHelperRawImageList = new();
  23. public void Create()
  24. {
  25. if (_managerObject) return;
  26. string prefabName = "WebCameraView";
  27. var o = UnityEngine.Object.Instantiate(Resources.Load<GameObject>(prefabName));
  28. UnityEngine.Object.DontDestroyOnLoad(o);
  29. o.name = prefabName;
  30. _screenLocate = o.GetComponent<ScreenLocate>();
  31. _screenLocate.InfraredCameraHelper = this;
  32. _managerObject = o;
  33. if (Application.platform == RuntimePlatform.Android) Application.targetFrameRate = 60;
  34. //for (int i = 0; i < InfraredCameraHelperRawImageList.Count; i++)
  35. //{
  36. // //添加目标
  37. // _screenLocate.mUVCDrawer.RenderTargets.Add(InfraredCameraHelperRawImageList[i].gameObject);
  38. //}
  39. }
  40. public void Dispose()
  41. {
  42. if (_managerObject) UnityEngine.Object.DestroyImmediate(_managerObject);
  43. if (_Instance == this) _Instance = null;
  44. }
  45. #endregion
  46. #region 画面接口
  47. public void onStartPreview() {
  48. Debug.Log("onStartPreview_screenLocate.mUVCCameraInfo.device:" + _screenLocate.mUVCCameraInfo.device);
  49. _screenLocate.mUVCManager.onStartPreview(_screenLocate.mUVCCameraInfo.device);
  50. }
  51. public void onStopPreview()
  52. {
  53. Debug.Log("onStopPreview_screenLocate.mUVCCameraInfo.device:" + _screenLocate.mUVCCameraInfo.device);
  54. _screenLocate.mUVCManager.onStopPreview(_screenLocate.mUVCCameraInfo.device);
  55. }
  56. /// <summary>
  57. /// 获取摄像机对象CameraInfo
  58. /// </summary>
  59. public UVCManager.CameraInfo GetUVCCameraInfo() {
  60. return _screenLocate.mUVCCameraInfo;
  61. }
  62. /// <summary>
  63. /// 获取相机画面贴图
  64. /// </summary>
  65. public Texture GetCameraTexture()
  66. {
  67. return _screenLocate.getUVCTexture; //_screenLocate.rawImage.texture;
  68. }
  69. /// <summary>
  70. /// 获取相机画面材质
  71. /// </summary>
  72. public Material GetCameraMaterial()
  73. {
  74. return null;//_screenLocate.rawImage.material;
  75. }
  76. /// <summary>
  77. /// 设置亮度(0~10)
  78. /// </summary>
  79. public void SetBrightness(float value)
  80. {
  81. _screenLocate.rawImage.material.SetFloat("_Brightness", value);
  82. }
  83. /// <summary>
  84. /// 获取亮度(0~10)
  85. /// </summary>
  86. public float GetBrightness()
  87. {
  88. return _screenLocate.rawImage.material.GetFloat("_Brightness");
  89. }
  90. /// <summary>
  91. /// 设置饱和度(0~10)
  92. /// </summary>
  93. public void SetSaturation(float value)
  94. {
  95. _screenLocate.rawImage.material.SetFloat("_Saturation", value);
  96. }
  97. /// <summary>
  98. /// 获取饱和度(0~10)
  99. /// </summary>
  100. public float GetSaturation()
  101. {
  102. return _screenLocate.rawImage.material.GetFloat("_Saturation");
  103. }
  104. /// <summary>
  105. /// 设置对比度(0~10)
  106. /// </summary>
  107. public void SetContrast(float value)
  108. {
  109. _screenLocate.rawImage.material.SetFloat("_Contrast", value);
  110. }
  111. /// <summary>
  112. /// 获取对比度(0~10)
  113. /// </summary>
  114. public float GetContrast()
  115. {
  116. return _screenLocate.rawImage.material.GetFloat("_Contrast");
  117. }
  118. /// <summary>
  119. /// 设置相机画面分辨率
  120. /// </summary>
  121. public void SetCameraResolution(int width, int height)
  122. {
  123. _screenLocate.mUVCManager.DefaultWidth = width;
  124. _screenLocate.mUVCManager.DefaultHeight = height;
  125. _screenLocate.mUVCDrawer.DefaultWidth = width;
  126. _screenLocate.mUVCDrawer.DefaultHeight = height;
  127. Debug.Log("设置分辨率,width:" + width + " ,height:" + height);
  128. }
  129. /// <summary>
  130. /// 获取相机画面分辨率
  131. /// </summary>
  132. public Vector2 GetCameraResolution()
  133. {
  134. return new Vector2(
  135. _screenLocate.mUVCDrawer.DefaultWidth,
  136. _screenLocate.mUVCDrawer.DefaultHeight
  137. );
  138. }
  139. #endregion
  140. #region 操作接口
  141. /// <summary>
  142. /// 单点模式开关
  143. /// </summary>
  144. public void SetSinglePoint(bool value)
  145. {
  146. _screenLocate.bSinglePoint = value;
  147. }
  148. /// <summary>
  149. /// 是否为单点模式
  150. /// </summary>
  151. public bool IsSinglePoint()
  152. {
  153. return _screenLocate.bSinglePoint;
  154. }
  155. /// <summary>
  156. /// 设置抖动过滤值
  157. /// </summary>
  158. public void SetShakeFilterValue(float value)
  159. {
  160. _screenLocate.filterDis = value;
  161. }
  162. /// <summary>
  163. /// 获取抖动过滤值
  164. /// </summary>
  165. public float GetShakeFilterValue()
  166. {
  167. return _screenLocate.filterDis;
  168. }
  169. /// <summary>
  170. /// 是否已经定位
  171. /// </summary>
  172. public bool IsScreenLoateOK()
  173. {
  174. return _screenLocate.IsScreenLoateOK();
  175. }
  176. /// <summary>
  177. /// 是否正在手动定位
  178. /// </summary>
  179. public bool IsScreenLocateManualDoing()
  180. {
  181. return _screenLocate.IsScreenLocateManualDoing();
  182. }
  183. /// <summary>
  184. /// 进入手动定位
  185. /// </summary>
  186. /// <returns>相机画面截图</returns>
  187. public Texture2D EnterScreenLocateManual()
  188. {
  189. return _screenLocate.EnterScreenLocateManual();
  190. }
  191. /// <summary>
  192. /// 退出/完成手动定位
  193. /// </summary>
  194. /// <param name="points">定位点(左下、右下、右上、左上)</param>
  195. public void QuitScreenLocateManual(List<Vector2> points)
  196. {
  197. _screenLocate.QuitScreenLocateManual(points);
  198. }
  199. /// <summary>
  200. /// 进入自动定位
  201. /// </summary>
  202. public void EnterScreenLocateManualAuto() {
  203. _screenLocate.EnterScreenLocateManualAuto();
  204. }
  205. /// <summary>
  206. /// 修改 Capture ,建议值30
  207. /// </summary>
  208. public void SetCapture(int value)
  209. {
  210. _screenLocate.SetCapture(value);
  211. }
  212. /// <summary>
  213. /// 修改delay,建议值30
  214. /// </summary>
  215. public void SetDelay(int value)
  216. {
  217. _screenLocate.SetDelay(value);
  218. }
  219. #endregion
  220. #region 监听事件
  221. /// <summary>
  222. /// UVC 相机准备事件
  223. /// </summary>
  224. public OnUVCIsReadyEvent OnUVCIsReady;
  225. public delegate void OnUVCIsReadyEvent(UVCManager.CameraInfo camera);
  226. public void InvokeOnUVCIsReady(UVCManager.CameraInfo camera) {
  227. try
  228. {
  229. OnUVCIsReady?.Invoke(camera);
  230. }
  231. catch (Exception e)
  232. {
  233. Debug.LogError(e);
  234. }
  235. }
  236. /// <summary>
  237. /// 单点更新事件
  238. /// </summary>
  239. public OnPositionUpdateEvent OnPositionUpdate;
  240. public delegate void OnPositionUpdateEvent(Vector2 position);
  241. public void InvokeOnPositionUpdate(Vector2 position)
  242. {
  243. try
  244. {
  245. OnPositionUpdate?.Invoke(position);
  246. }
  247. catch (Exception e)
  248. {
  249. Debug.LogError(e);
  250. }
  251. }
  252. /// <summary>
  253. /// 双点更新事件
  254. /// </summary>
  255. public OnPositionUpdate2Event OnPositionUpdate2;
  256. public delegate void OnPositionUpdate2Event(Vector2 position, int index);
  257. public void InvokeOnPositionUpdate2(Vector2 position, int index)
  258. {
  259. try
  260. {
  261. OnPositionUpdate2?.Invoke(position, index);
  262. }
  263. catch (Exception e)
  264. {
  265. Debug.LogError(e);
  266. }
  267. }
  268. #endregion
  269. }
  270. }