IntelCameraHandler.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. using Emgu.CV;
  2. using Emgu.CV.Structure;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Security.Permissions;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace BBIWARG.Input.InputProviding
  12. {
  13. class IntelCameraWrapper : MarshalByRefObject
  14. {
  15. private Assembly assembly;
  16. public InputProviderIntel inputProviderIntel;
  17. private dynamic senseManager;
  18. private dynamic session;
  19. private dynamic AccessRead;
  20. private dynamic PixelFormat;
  21. private dynamic EverythingFine;
  22. private MethodInfo acquireAccessMethod;
  23. private object[] methodParams;
  24. public bool errorstate = false;
  25. public IntelCameraWrapper()
  26. {
  27. }
  28. [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.Infrastructure)]
  29. public override object InitializeLifetimeService()
  30. {
  31. return null;
  32. }
  33. public void init(InputProviderIntel intelInputProvider) {
  34. inputProviderIntel = intelInputProvider;
  35. var domain = System.AppDomain.CreateDomain("IntelCamDomain");
  36. assembly = Assembly.Load("libpxcclr.cs");
  37. AccessRead = (dynamic)Enum.Parse(assembly.GetType("PXCMImage+Access"), "ACCESS_READ");
  38. PixelFormat = (dynamic)Enum.Parse(assembly.GetType("PXCMImage+PixelFormat"), "PIXEL_FORMAT_DEPTH");
  39. EverythingFine = (dynamic)Enum.Parse(assembly.GetType("pxcmStatus"), "PXCM_STATUS_NO_ERROR");
  40. // here be dragons
  41. Type imageDataType = assembly.GetType("PXCMImage+ImageData");
  42. Type refType = imageDataType.MakeByRefType();
  43. Type[] types = new Type[] { AccessRead.GetType(), PixelFormat.GetType(), refType };
  44. acquireAccessMethod = assembly.GetType("PXCMImage").GetMethod("AcquireAccess", types);
  45. //depthImage.AcquireAccess(AccessRead, PixelFormat, out imageData);
  46. methodParams = new object[] { AccessRead, PixelFormat, null };
  47. session = assembly.GetType("PXCMSession").GetMethod("CreateInstance").Invoke(null, null);
  48. senseManager = session.CreateSenseManager();
  49. dynamic ddesc = Activator.CreateInstance(assembly.GetType("PXCMVideoModule+DataDesc"));
  50. ddesc.deviceInfo.streams = (dynamic)Enum.Parse(assembly.GetType("PXCMCapture+StreamType"), "STREAM_TYPE_DEPTH");
  51. senseManager.EnableStreams(ddesc);
  52. var result = senseManager.Init();
  53. dynamic fov = senseManager.captureManager.device.QueryDepthFieldOfView();
  54. inputProviderIntel.FieldOfViewHorizontal = fov.x;
  55. inputProviderIntel.FieldOfViewVertical = fov.y;
  56. inputProviderIntel.lowConfidenceValue = senseManager.captureManager.device.QueryDepthLowConfidenceValue();
  57. senseManager.captureManager.device.SetDepthConfidenceThreshold((UInt16)Parameters.ConfidenceImageMinThreshold);
  58. Console.WriteLine("Started camera. Delivering frames...");
  59. }
  60. internal void run()
  61. {
  62. while (inputProviderIntel.IsActive)
  63. {
  64. errorstate = false;
  65. var status = senseManager.AcquireFrame(true);
  66. if (status != EverythingFine)
  67. {
  68. Console.WriteLine("Found crash inside CameraHandler...");
  69. errorstate = true;
  70. break;
  71. }
  72. if (inputProviderIntel.hasNewFrameEvent())
  73. {
  74. dynamic sample = senseManager.QuerySample();
  75. dynamic depthImage = sample.depth;
  76. dynamic info = depthImage.info;
  77. acquireAccessMethod.Invoke(depthImage, methodParams);
  78. dynamic imageData = methodParams[2];
  79. ushort[] data = imageData.ToUShortArray(0, info.width * info.height);
  80. Image<Gray, UInt16> dImg;
  81. unsafe
  82. {
  83. fixed (ushort* d = data)
  84. {
  85. IntPtr ptr = (IntPtr)d;
  86. dImg = new Image<Gray, UInt16>(info.width, info.height, info.width * sizeof(ushort), ptr).Copy();
  87. }
  88. }
  89. depthImage.ReleaseAccess(imageData);
  90. depthImage.Dispose();
  91. // confidence filter
  92. Image<Gray, byte> mask = dImg.InRange(new Gray(inputProviderIntel.lowConfidenceValue), new Gray(inputProviderIntel.lowConfidenceValue));
  93. dImg.SetValue(new Gray(Int16.MaxValue), mask);
  94. inputProviderIntel.newFrame(inputProviderIntel.CurrentFrameID, dImg);
  95. }
  96. inputProviderIntel.CurrentFrameID += 1;
  97. senseManager.ReleaseFrame();
  98. }
  99. senseManager.Dispose();
  100. }
  101. private void closeCamera()
  102. {
  103. senseManager.Close();
  104. session.Dispose();
  105. }
  106. }
  107. }