InfraredCameraHelper.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  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 void SetCameraResolutionNew(int width, int height)
  133. {
  134. Debug.Log("设置分辨率,width:" + width + " ,height:" + height);
  135. _screenLocate.Resize(width, height);
  136. }
  137. /// <summary>
  138. /// 获取相机画面分辨率
  139. /// </summary>
  140. public Vector2 GetCameraResolution()
  141. {
  142. return new Vector2(
  143. _screenLocate.mUVCDrawer.DefaultWidth,
  144. _screenLocate.mUVCDrawer.DefaultHeight
  145. );
  146. }
  147. #endregion
  148. #region 操作接口
  149. /// <summary>
  150. /// 单点模式开关
  151. /// </summary>
  152. public void SetSinglePoint(bool value)
  153. {
  154. _screenLocate.bSinglePoint = value;
  155. }
  156. /// <summary>
  157. /// 是否为单点模式
  158. /// </summary>
  159. public bool IsSinglePoint()
  160. {
  161. return _screenLocate.bSinglePoint;
  162. }
  163. /// <summary>
  164. /// 设置抖动过滤值
  165. /// </summary>
  166. public void SetShakeFilterValue(float value)
  167. {
  168. _screenLocate.filterDis = value;
  169. }
  170. /// <summary>
  171. /// 获取抖动过滤值
  172. /// </summary>
  173. public float GetShakeFilterValue()
  174. {
  175. return _screenLocate.filterDis;
  176. }
  177. /// <summary>
  178. /// 是否已经定位
  179. /// </summary>
  180. public bool IsScreenLoateOK()
  181. {
  182. return _screenLocate.IsScreenLoateOK();
  183. }
  184. /// <summary>
  185. /// 是否正在手动定位
  186. /// </summary>
  187. public bool IsScreenLocateManualDoing()
  188. {
  189. return _screenLocate.IsScreenLocateManualDoing();
  190. }
  191. /// <summary>
  192. /// 进入手动定位
  193. /// </summary>
  194. /// <returns>相机画面截图</returns>
  195. public Texture2D EnterScreenLocateManual()
  196. {
  197. return _screenLocate.EnterScreenLocateManual();
  198. }
  199. /// <summary>
  200. /// 退出/完成手动定位
  201. /// </summary>
  202. /// <param name="points">定位点(左下、右下、右上、左上)</param>
  203. public void QuitScreenLocateManual(List<Vector2> points)
  204. {
  205. _screenLocate.QuitScreenLocateManual(points);
  206. }
  207. /// <summary>
  208. /// 进入自动定位
  209. /// </summary>
  210. public void EnterScreenLocateManualAuto() {
  211. _screenLocate.EnterScreenLocateManualAuto();
  212. }
  213. /// <summary>
  214. /// 修改 Capture ,建议值30
  215. /// </summary>
  216. public void SetCapture(int value)
  217. {
  218. _screenLocate.SetCapture(value);
  219. }
  220. /// <summary>
  221. /// 修改delay,建议值30
  222. /// </summary>
  223. public void SetDelay(int value)
  224. {
  225. _screenLocate.SetDelay(value);
  226. }
  227. #endregion
  228. #region 监听事件
  229. /// <summary>
  230. /// UVC 相机准备事件
  231. /// </summary>
  232. public OnUVCIsReadyEvent OnUVCIsReady;
  233. public delegate void OnUVCIsReadyEvent(UVCManager.CameraInfo camera);
  234. public void InvokeOnUVCIsReady(UVCManager.CameraInfo camera) {
  235. try
  236. {
  237. OnUVCIsReady?.Invoke(camera);
  238. }
  239. catch (Exception e)
  240. {
  241. Debug.LogError(e);
  242. }
  243. }
  244. /// <summary>
  245. /// 单点更新事件
  246. /// </summary>
  247. public OnPositionUpdateEvent OnPositionUpdate;
  248. public delegate void OnPositionUpdateEvent(Vector2 position);
  249. public void InvokeOnPositionUpdate(Vector2 position)
  250. {
  251. try
  252. {
  253. OnPositionUpdate?.Invoke(position);
  254. }
  255. catch (Exception e)
  256. {
  257. Debug.LogError(e);
  258. }
  259. }
  260. /// <summary>
  261. /// 双点更新事件
  262. /// </summary>
  263. public OnPositionUpdate2Event OnPositionUpdate2;
  264. public delegate void OnPositionUpdate2Event(Vector2 position, int index);
  265. public void InvokeOnPositionUpdate2(Vector2 position, int index)
  266. {
  267. try
  268. {
  269. OnPositionUpdate2?.Invoke(position, index);
  270. }
  271. catch (Exception e)
  272. {
  273. Debug.LogError(e);
  274. }
  275. }
  276. #endregion
  277. }
  278. }