IntelCameraHandler.cs 4.8 KB

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