InfraredCameraHelper.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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. {
  49. Debug.Log("onStartPreview_screenLocate.mUVCCameraInfo.device:" + _screenLocate.mUVCCameraInfo.device);
  50. _screenLocate.mUVCManager.onStartPreview(_screenLocate.mUVCCameraInfo.device);
  51. }
  52. public void onStopPreview()
  53. {
  54. Debug.Log("onStopPreview_screenLocate.mUVCCameraInfo.device:" + _screenLocate.mUVCCameraInfo.device);
  55. _screenLocate.mUVCManager.onStopPreview(_screenLocate.mUVCCameraInfo.device);
  56. }
  57. /// <summary>
  58. /// 获取摄像机对象CameraInfo
  59. /// </summary>
  60. public UVCManager.CameraInfo GetUVCCameraInfo()
  61. {
  62. return _screenLocate.mUVCCameraInfo;
  63. }
  64. /// <summary>
  65. /// 获取相机画面贴图
  66. /// </summary>
  67. public Texture GetCameraTexture()
  68. {
  69. return _screenLocate.getUVCTexture; //_screenLocate.rawImage.texture;
  70. }
  71. /// <summary>
  72. /// 获取相机画面材质
  73. /// </summary>
  74. public Material GetCameraMaterial()
  75. {
  76. return null;//_screenLocate.rawImage.material;
  77. }
  78. /// <summary>
  79. /// 设置亮度(0~10)
  80. /// </summary>
  81. public void SetBrightness(float value)
  82. {
  83. _screenLocate.rawImage.material.SetFloat("_Brightness", value);
  84. }
  85. /// <summary>
  86. /// 获取亮度(0~10)
  87. /// </summary>
  88. public float GetBrightness()
  89. {
  90. return _screenLocate.rawImage.material.GetFloat("_Brightness");
  91. }
  92. /// <summary>
  93. /// 设置饱和度(0~10)
  94. /// </summary>
  95. public void SetSaturation(float value)
  96. {
  97. _screenLocate.rawImage.material.SetFloat("_Saturation", value);
  98. }
  99. /// <summary>
  100. /// 获取饱和度(0~10)
  101. /// </summary>
  102. public float GetSaturation()
  103. {
  104. return _screenLocate.rawImage.material.GetFloat("_Saturation");
  105. }
  106. /// <summary>
  107. /// 设置对比度(0~10)
  108. /// </summary>
  109. public void SetContrast(float value)
  110. {
  111. _screenLocate.rawImage.material.SetFloat("_Contrast", value);
  112. }
  113. /// <summary>
  114. /// 获取对比度(0~10)
  115. /// </summary>
  116. public float GetContrast()
  117. {
  118. return _screenLocate.rawImage.material.GetFloat("_Contrast");
  119. }
  120. /// <summary>
  121. /// 设置相机画面分辨率
  122. /// </summary>
  123. public void SetCameraResolution(int width, int height)
  124. {
  125. _screenLocate.mUVCManager.DefaultWidth = width;
  126. _screenLocate.mUVCManager.DefaultHeight = height;
  127. _screenLocate.mUVCDrawer.DefaultWidth = width;
  128. _screenLocate.mUVCDrawer.DefaultHeight = height;
  129. Debug.Log("设置分辨率,width:" + width + " ,height:" + height);
  130. }
  131. /// <summary>
  132. /// 设置相机画面分辨率
  133. /// </summary>
  134. public void SetCameraResolutionNew(int width, int height)
  135. {
  136. Debug.Log("设置分辨率,width:" + width + " ,height:" + height);
  137. _screenLocate.Resize(width, height);
  138. }
  139. /// <summary>
  140. /// 获取相机画面分辨率
  141. /// </summary>
  142. public Vector2 GetCameraResolution()
  143. {
  144. return new Vector2(
  145. _screenLocate.mUVCDrawer.DefaultWidth,
  146. _screenLocate.mUVCDrawer.DefaultHeight
  147. );
  148. }
  149. #endregion
  150. #region 操作接口
  151. /// <summary>
  152. /// 单点模式开关
  153. /// </summary>
  154. public void SetSinglePoint(bool value)
  155. {
  156. _screenLocate.bSinglePoint = value;
  157. }
  158. /// <summary>
  159. /// 是否为单点模式
  160. /// </summary>
  161. public bool IsSinglePoint()
  162. {
  163. return _screenLocate.bSinglePoint;
  164. }
  165. /// <summary>
  166. /// 设置抖动过滤值
  167. /// </summary>
  168. public void SetShakeFilterValue(float value)
  169. {
  170. _screenLocate.filterDis = value;
  171. }
  172. /// <summary>
  173. /// 获取抖动过滤值
  174. /// </summary>
  175. public float GetShakeFilterValue()
  176. {
  177. return _screenLocate.filterDis;
  178. }
  179. /// <summary>
  180. /// 设置亮度过滤阈值
  181. /// </summary>
  182. public void SetInfraredLocateBrightnessThreshold(float value)
  183. {
  184. _screenLocate.SetInfraredLocateBrightnessThreshold(value);
  185. }
  186. /// <summary>
  187. /// 是否已经定位
  188. /// </summary>
  189. public bool IsScreenLoateOK()
  190. {
  191. return _screenLocate.IsScreenLoateOK();
  192. }
  193. /// <summary>
  194. /// 是否正在手动定位
  195. /// </summary>
  196. public bool IsScreenLocateManualDoing()
  197. {
  198. return _screenLocate.IsScreenLocateManualDoing();
  199. }
  200. /// <summary>
  201. /// 进入手动定位
  202. /// </summary>
  203. /// <returns>相机画面截图</returns>
  204. public Texture2D EnterScreenLocateManual()
  205. {
  206. return _screenLocate.EnterScreenLocateManual();
  207. }
  208. /// <summary>
  209. /// 退出/完成手动定位
  210. /// </summary>
  211. /// <param name="points">定位点(左下、右下、右上、左上)</param>
  212. public void QuitScreenLocateManual(List<Vector2> points)
  213. {
  214. _screenLocate.QuitScreenLocateManual(points);
  215. }
  216. /// <summary>
  217. /// 进入自动定位
  218. /// </summary>
  219. public void EnterScreenLocateManualAuto()
  220. {
  221. _screenLocate.EnterScreenLocateManualAuto();
  222. }
  223. /// <summary>
  224. /// 修改 Capture ,建议值30
  225. /// </summary>
  226. public void SetCapture(int value)
  227. {
  228. _screenLocate.SetCapture(value);
  229. }
  230. /// <summary>
  231. /// 修改delay,建议值30
  232. /// </summary>
  233. public void SetDelay(int value)
  234. {
  235. _screenLocate.SetDelay(value);
  236. }
  237. #endregion
  238. #region 监听事件
  239. /// <summary>
  240. /// UVC 相机准备事件
  241. /// </summary>
  242. public OnUVCIsReadyEvent OnUVCIsReady;
  243. public delegate void OnUVCIsReadyEvent(UVCManager.CameraInfo camera);
  244. public void InvokeOnUVCIsReady(UVCManager.CameraInfo camera)
  245. {
  246. try
  247. {
  248. OnUVCIsReady?.Invoke(camera);
  249. }
  250. catch (Exception e)
  251. {
  252. Debug.LogError(e);
  253. }
  254. }
  255. /// <summary>
  256. /// 单点更新事件
  257. /// </summary>
  258. public OnPositionUpdateEvent OnPositionUpdate;
  259. public delegate void OnPositionUpdateEvent(Vector2 position);
  260. public void InvokeOnPositionUpdate(Vector2 position)
  261. {
  262. try
  263. {
  264. OnPositionUpdate?.Invoke(position);
  265. }
  266. catch (Exception e)
  267. {
  268. Debug.LogError(e);
  269. }
  270. }
  271. /// <summary>
  272. /// 双点更新事件
  273. /// </summary>
  274. public OnPositionUpdate2Event OnPositionUpdate2;
  275. public delegate void OnPositionUpdate2Event(Vector2 position, int index);
  276. public void InvokeOnPositionUpdate2(Vector2 position, int index)
  277. {
  278. try
  279. {
  280. OnPositionUpdate2?.Invoke(position, index);
  281. }
  282. catch (Exception e)
  283. {
  284. Debug.LogError(e);
  285. }
  286. }
  287. #endregion
  288. }
  289. }