革博士程序V1仓库
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

248 líneas
9.6 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Runtime.InteropServices;
  7. using IKapC.NET;
  8. using IKapBoardClassLibrary;
  9. using System.Threading;
  10. namespace LeatherApp.Device.CamerUtil
  11. {
  12. class IKDeviceCL : IKDevice
  13. {
  14. [DllImport("kernel32.dll")]
  15. public static extern void CopyMemory(IntPtr Destination, IntPtr Source, int Length);
  16. // 回调函数
  17. #region Callback
  18. delegate void IKapCallBackProc(IntPtr pParam);
  19. private IKapCallBackProc OnGrabStartProc;
  20. private IKapCallBackProc OnFrameLostProc;
  21. private IKapCallBackProc OnTimeoutProc;
  22. private IKapCallBackProc OnFrameReadyProc;
  23. private IKapCallBackProc OnGrabStopProc;
  24. #endregion
  25. public IKDeviceCL()
  26. {
  27. m_nType = 1;
  28. }
  29. public override bool openDevice(int nDevIndex, int nBoardIndex)
  30. {
  31. closeDevice();
  32. uint res = IKapCLib.ItkDevOpen((uint)nDevIndex
  33. , (int)(ItkDeviceAccessMode.ITKDEV_VAL_ACCESS_MODE_CONTROL)
  34. , ref m_pDev);
  35. if (!Check(res))
  36. {
  37. System.Diagnostics.Debug.WriteLine("Camera error:Open camera failed");
  38. return false;
  39. }
  40. m_nDevIndex = nDevIndex;
  41. //打开采集卡
  42. m_pBoard = IKapBoard.IKapOpen((uint)BoardType.IKBoardPCIE, (uint)nBoardIndex);
  43. m_nBoardIndex = nBoardIndex;
  44. if (m_pBoard == new IntPtr(-1))
  45. return false;
  46. return true;
  47. }
  48. public override bool isOpen()
  49. {
  50. return m_pDev != new IntPtr(-1) && m_pBoard != new IntPtr(-1);
  51. }
  52. public override bool closeDevice()
  53. {
  54. if (isOpen())
  55. {
  56. IKapBoard.IKapClose(m_pBoard);
  57. IKapCLib.ItkDevClose(m_pDev);
  58. }
  59. return true;
  60. }
  61. public override bool loadConfiguration(string sFilePath)
  62. {
  63. int ret = IKapBoard.IKapLoadConfigurationFromFile(m_pBoard, sFilePath);
  64. return ret == (int)ErrorCode.IK_RTN_OK;
  65. }
  66. public override bool createBuffer()
  67. {
  68. int ret = (int)ErrorCode.IK_RTN_OK;
  69. int nImageType = 0;
  70. ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_WIDTH, ref m_nWidth);
  71. if (ret != (int)ErrorCode.IK_RTN_OK)
  72. return false;
  73. ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_HEIGHT, ref m_nHeight);
  74. if (ret != (int)ErrorCode.IK_RTN_OK)
  75. return false;
  76. ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_TYPE, ref nImageType);
  77. if (ret != (int)ErrorCode.IK_RTN_OK)
  78. return false;
  79. ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_DATA_FORMAT, ref m_nDepth);
  80. if (ret != (int)ErrorCode.IK_RTN_OK)
  81. return false;
  82. ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_SIZE, ref m_nBufferSize);
  83. if (ret != (int)ErrorCode.IK_RTN_OK)
  84. return false;
  85. switch (nImageType)
  86. {
  87. case 0:
  88. m_nChannels = 1;
  89. break;
  90. case 1:
  91. case 3:
  92. m_nChannels = 3;
  93. break;
  94. case 2:
  95. case 4:
  96. m_nChannels = 4;
  97. break;
  98. }
  99. m_pUserBuffer = Marshal.AllocHGlobal(m_nBufferSize);
  100. return true;
  101. }
  102. public override void clearBuffer()
  103. {
  104. if (m_pUserBuffer == new IntPtr(-1))
  105. return;
  106. Marshal.FreeHGlobal(m_pUserBuffer);
  107. m_pUserBuffer = new IntPtr(-1);
  108. }
  109. public override bool startGrab(int nCount)
  110. {
  111. int ret;
  112. // 设置抓取模式,IKP_GRAB_NON_BLOCK为非阻塞模式
  113. //int grab_mode = (int)GrabMode.IKP_GRAB_NON_BLOCK;
  114. //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_GRAB_MODE, grab_mode);
  115. //if (ret != (int)ErrorCode.IK_RTN_OK)
  116. // return false;
  117. //// 设置帧传输模式,IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT为同步保存模式
  118. //int transfer_mode = (int)FrameTransferMode.IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT;
  119. //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_TRANSFER_MODE, transfer_mode);
  120. //if (ret != (int)ErrorCode.IK_RTN_OK)
  121. // return false;
  122. // 设置缓冲区格式
  123. //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_COUNT, m_nFrameCount);
  124. //if (ret != (int)ErrorCode.IK_RTN_OK)
  125. // return false;
  126. //// 设置帧超时时间
  127. //int timeout = -1;
  128. // ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_TIME_OUT, timeout);
  129. //if (ret != (int)ErrorCode.IK_RTN_OK)
  130. // return false;
  131. //// 设置采集模式。
  132. ////
  133. //// Set grab mode.
  134. //int grab_mode = (int)GrabMode.IKP_GRAB_NON_BLOCK;
  135. //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_GRAB_MODE, grab_mode);
  136. //if (ret != (int)ErrorCode.IK_RTN_OK)
  137. // return false;
  138. //// 设置传输模式。
  139. ////
  140. //// Set transfer mode.
  141. //int transfer_mode = (int)FrameTransferMode.IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT;
  142. //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_TRANSFER_MODE, transfer_mode);
  143. //if (ret != (int)ErrorCode.IK_RTN_OK)
  144. // return false;
  145. // 注册回调函数
  146. IntPtr hPtr = new IntPtr(-1);
  147. OnGrabStartProc = new IKapCallBackProc(OnGrabStartFunc);
  148. ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_GrabStart, Marshal.GetFunctionPointerForDelegate(OnGrabStartProc), hPtr);
  149. if (ret != (int)ErrorCode.IK_RTN_OK)
  150. return false;
  151. OnFrameReadyProc = new IKapCallBackProc(OnFrameReadyFunc);
  152. ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_FrameReady, Marshal.GetFunctionPointerForDelegate(OnFrameReadyProc), hPtr);
  153. if (ret != (int)ErrorCode.IK_RTN_OK)
  154. return false;
  155. OnFrameLostProc = new IKapCallBackProc(OnFrameLostFunc);
  156. ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_FrameLost, Marshal.GetFunctionPointerForDelegate(OnFrameLostProc), hPtr);
  157. if (ret != (int)ErrorCode.IK_RTN_OK)
  158. return false;
  159. OnTimeoutProc = new IKapCallBackProc(OnTimeoutFunc);
  160. ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_TimeOut, Marshal.GetFunctionPointerForDelegate(OnTimeoutProc), hPtr);
  161. if (ret != (int)ErrorCode.IK_RTN_OK)
  162. return false;
  163. OnGrabStopProc = new IKapCallBackProc(OnGrabStopFunc);
  164. ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_GrabStop, Marshal.GetFunctionPointerForDelegate(OnGrabStopProc), hPtr);
  165. if (ret != (int)ErrorCode.IK_RTN_OK)
  166. return false;
  167. m_bUpdateImage = false;
  168. m_nCurFrameIndex = 0;
  169. ret = IKapBoard.IKapStartGrab(m_pBoard, nCount);
  170. if (ret != (int)ErrorCode.IK_RTN_OK)
  171. return false;
  172. m_bGrabingImage = true;
  173. return true;
  174. }
  175. public override bool stopGrab()
  176. {
  177. IKapBoard.IKapStopGrab(m_pBoard);
  178. do
  179. {
  180. } while (m_bGrabingImage);
  181. return true;
  182. }
  183. #region Callback
  184. // 开始抓帧回调
  185. public void OnGrabStartFunc(IntPtr pParam)
  186. {
  187. Console.WriteLine("Start grabbing image");
  188. }
  189. // 丢帧回调
  190. public void OnFrameLostFunc(IntPtr pParam)
  191. {
  192. Console.WriteLine("Frame lost");
  193. }
  194. // 帧超时回调
  195. public void OnTimeoutFunc(IntPtr pParam)
  196. {
  197. Console.WriteLine("Grab image timeout");
  198. }
  199. // 一帧图像完成回调
  200. public void OnFrameReadyFunc(IntPtr pParam)
  201. {
  202. IntPtr hPtr = new IntPtr(-1);
  203. // 获取当前帧状态
  204. IKapBoard.IKAPBUFFERSTATUS status = new IKapBoard.IKAPBUFFERSTATUS();
  205. IKapBoard.IKapGetBufferStatus(m_pBoard, m_nCurFrameIndex, ref status);
  206. if (status.uFull == 1)
  207. {
  208. IKapBoard.IKapGetBufferAddress(m_pBoard, m_nCurFrameIndex, ref hPtr);
  209. lock (m_mutexImage)
  210. {
  211. CopyMemory(m_pUserBuffer, hPtr, m_nBufferSize);
  212. m_bUpdateImage = true;
  213. }
  214. }
  215. m_nCurFrameIndex++;
  216. m_nCurFrameIndex = m_nCurFrameIndex % m_nFrameCount;
  217. }
  218. // 停止抓取图像回调
  219. public void OnGrabStopFunc(IntPtr pParam)
  220. {
  221. Console.WriteLine("Stop grabbing image");
  222. m_bGrabingImage = false;
  223. }
  224. #endregion
  225. }
  226. }