248 lines
9.6 KiB
C#
248 lines
9.6 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Runtime.InteropServices;
|
||
using IKapC.NET;
|
||
using IKapBoardClassLibrary;
|
||
using System.Threading;
|
||
namespace LeatherApp.Device.CamerUtil
|
||
{
|
||
class IKDeviceCL : IKDevice
|
||
{
|
||
[DllImport("kernel32.dll")]
|
||
public static extern void CopyMemory(IntPtr Destination, IntPtr Source, int Length);
|
||
// 回调函数
|
||
#region Callback
|
||
delegate void IKapCallBackProc(IntPtr pParam);
|
||
private IKapCallBackProc OnGrabStartProc;
|
||
private IKapCallBackProc OnFrameLostProc;
|
||
private IKapCallBackProc OnTimeoutProc;
|
||
private IKapCallBackProc OnFrameReadyProc;
|
||
private IKapCallBackProc OnGrabStopProc;
|
||
#endregion
|
||
|
||
public IKDeviceCL()
|
||
{
|
||
m_nType = 1;
|
||
}
|
||
|
||
public override bool openDevice(int nDevIndex, int nBoardIndex)
|
||
{
|
||
closeDevice();
|
||
uint res = IKapCLib.ItkDevOpen((uint)nDevIndex
|
||
, (int)(ItkDeviceAccessMode.ITKDEV_VAL_ACCESS_MODE_CONTROL)
|
||
, ref m_pDev);
|
||
if (!Check(res))
|
||
{
|
||
System.Diagnostics.Debug.WriteLine("Camera error:Open camera failed");
|
||
return false;
|
||
}
|
||
m_nDevIndex = nDevIndex;
|
||
//打开采集卡
|
||
m_pBoard = IKapBoard.IKapOpen((uint)BoardType.IKBoardPCIE, (uint)nBoardIndex);
|
||
m_nBoardIndex = nBoardIndex;
|
||
if (m_pBoard == new IntPtr(-1))
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
public override bool isOpen()
|
||
{
|
||
return m_pDev != new IntPtr(-1) && m_pBoard != new IntPtr(-1);
|
||
}
|
||
|
||
public override bool closeDevice()
|
||
{
|
||
if (isOpen())
|
||
{
|
||
IKapBoard.IKapClose(m_pBoard);
|
||
IKapCLib.ItkDevClose(m_pDev);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
public override bool loadConfiguration(string sFilePath)
|
||
{
|
||
int ret = IKapBoard.IKapLoadConfigurationFromFile(m_pBoard, sFilePath);
|
||
return ret == (int)ErrorCode.IK_RTN_OK;
|
||
}
|
||
|
||
public override bool createBuffer()
|
||
{
|
||
int ret = (int)ErrorCode.IK_RTN_OK;
|
||
int nImageType = 0;
|
||
ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_WIDTH, ref m_nWidth);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_HEIGHT, ref m_nHeight);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_TYPE, ref nImageType);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_DATA_FORMAT, ref m_nDepth);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_SIZE, ref m_nBufferSize);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
switch (nImageType)
|
||
{
|
||
case 0:
|
||
m_nChannels = 1;
|
||
break;
|
||
case 1:
|
||
case 3:
|
||
m_nChannels = 3;
|
||
break;
|
||
case 2:
|
||
case 4:
|
||
m_nChannels = 4;
|
||
break;
|
||
}
|
||
m_pUserBuffer = Marshal.AllocHGlobal(m_nBufferSize);
|
||
return true;
|
||
}
|
||
|
||
public override void clearBuffer()
|
||
{
|
||
if (m_pUserBuffer == new IntPtr(-1))
|
||
return;
|
||
Marshal.FreeHGlobal(m_pUserBuffer);
|
||
m_pUserBuffer = new IntPtr(-1);
|
||
}
|
||
|
||
public override bool startGrab(int nCount)
|
||
{
|
||
int ret;
|
||
// 设置抓取模式,IKP_GRAB_NON_BLOCK为非阻塞模式
|
||
//int grab_mode = (int)GrabMode.IKP_GRAB_NON_BLOCK;
|
||
//ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_GRAB_MODE, grab_mode);
|
||
//if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
// return false;
|
||
|
||
//// 设置帧传输模式,IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT为同步保存模式
|
||
//int transfer_mode = (int)FrameTransferMode.IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT;
|
||
//ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_TRANSFER_MODE, transfer_mode);
|
||
//if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
// return false;
|
||
|
||
// 设置缓冲区格式
|
||
//ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_COUNT, m_nFrameCount);
|
||
//if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
// return false;
|
||
|
||
//// 设置帧超时时间
|
||
//int timeout = -1;
|
||
// ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_TIME_OUT, timeout);
|
||
//if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
// return false;
|
||
|
||
//// 设置采集模式。
|
||
////
|
||
//// Set grab mode.
|
||
//int grab_mode = (int)GrabMode.IKP_GRAB_NON_BLOCK;
|
||
//ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_GRAB_MODE, grab_mode);
|
||
//if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
// return false;
|
||
|
||
//// 设置传输模式。
|
||
////
|
||
//// Set transfer mode.
|
||
//int transfer_mode = (int)FrameTransferMode.IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT;
|
||
//ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_TRANSFER_MODE, transfer_mode);
|
||
//if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
// return false;
|
||
|
||
// 注册回调函数
|
||
IntPtr hPtr = new IntPtr(-1);
|
||
OnGrabStartProc = new IKapCallBackProc(OnGrabStartFunc);
|
||
ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_GrabStart, Marshal.GetFunctionPointerForDelegate(OnGrabStartProc), hPtr);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
|
||
OnFrameReadyProc = new IKapCallBackProc(OnFrameReadyFunc);
|
||
ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_FrameReady, Marshal.GetFunctionPointerForDelegate(OnFrameReadyProc), hPtr);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
|
||
OnFrameLostProc = new IKapCallBackProc(OnFrameLostFunc);
|
||
ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_FrameLost, Marshal.GetFunctionPointerForDelegate(OnFrameLostProc), hPtr);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
|
||
OnTimeoutProc = new IKapCallBackProc(OnTimeoutFunc);
|
||
ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_TimeOut, Marshal.GetFunctionPointerForDelegate(OnTimeoutProc), hPtr);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
|
||
OnGrabStopProc = new IKapCallBackProc(OnGrabStopFunc);
|
||
ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_GrabStop, Marshal.GetFunctionPointerForDelegate(OnGrabStopProc), hPtr);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
|
||
m_bUpdateImage = false;
|
||
m_nCurFrameIndex = 0;
|
||
ret = IKapBoard.IKapStartGrab(m_pBoard, nCount);
|
||
if (ret != (int)ErrorCode.IK_RTN_OK)
|
||
return false;
|
||
m_bGrabingImage = true;
|
||
return true;
|
||
}
|
||
|
||
public override bool stopGrab()
|
||
{
|
||
IKapBoard.IKapStopGrab(m_pBoard);
|
||
do
|
||
{
|
||
} while (m_bGrabingImage);
|
||
return true;
|
||
}
|
||
|
||
#region Callback
|
||
// 开始抓帧回调
|
||
public void OnGrabStartFunc(IntPtr pParam)
|
||
{
|
||
Console.WriteLine("Start grabbing image");
|
||
}
|
||
// 丢帧回调
|
||
public void OnFrameLostFunc(IntPtr pParam)
|
||
{
|
||
Console.WriteLine("Frame lost");
|
||
}
|
||
// 帧超时回调
|
||
public void OnTimeoutFunc(IntPtr pParam)
|
||
{
|
||
Console.WriteLine("Grab image timeout");
|
||
}
|
||
// 一帧图像完成回调
|
||
public void OnFrameReadyFunc(IntPtr pParam)
|
||
{
|
||
IntPtr hPtr = new IntPtr(-1);
|
||
// 获取当前帧状态
|
||
IKapBoard.IKAPBUFFERSTATUS status = new IKapBoard.IKAPBUFFERSTATUS();
|
||
IKapBoard.IKapGetBufferStatus(m_pBoard, m_nCurFrameIndex, ref status);
|
||
if (status.uFull == 1)
|
||
{
|
||
IKapBoard.IKapGetBufferAddress(m_pBoard, m_nCurFrameIndex, ref hPtr);
|
||
lock (m_mutexImage)
|
||
{
|
||
CopyMemory(m_pUserBuffer, hPtr, m_nBufferSize);
|
||
m_bUpdateImage = true;
|
||
}
|
||
}
|
||
m_nCurFrameIndex++;
|
||
m_nCurFrameIndex = m_nCurFrameIndex % m_nFrameCount;
|
||
}
|
||
// 停止抓取图像回调
|
||
public void OnGrabStopFunc(IntPtr pParam)
|
||
{
|
||
Console.WriteLine("Stop grabbing image");
|
||
m_bGrabingImage = false;
|
||
}
|
||
#endregion
|
||
}
|
||
}
|