You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
6.7 KiB
C#

using HalconDotNet;
using MvCamCtrl.NET;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Rs.Camera
{
public enum ECameraErrorCode
{
Ok,
CameraNoExist,
EnumDevicesFail,
CreateDeviceFail,
OpenDeviceFail,
GevSCPSPacketSizeFail,
SetTriggerModeFail,
SetTriggerSourceFail,
RegisterImageCallBackExFail,
StartGrabbingFail
}
public enum ETriggerMode
{
/// <summary>
/// 手动触发
/// </summary>
Manual,
/// <summary>
/// 自动触发
/// </summary>
Auto
}
public class HikCamera
{
private static HikCamera instance;
public static HikCamera Instance
{
get
{
if (instance == null)
instance = new HikCamera();
return instance;
}
}
private ETriggerMode m_triggerMode = ETriggerMode.Manual;
private HikCamera()
{
cbImage = new MyCamera.cbOutputExdelegate(ImageCallBack);
}
MyCamera.MV_CC_DEVICE_INFO_LIST m_pDeviceList;
Dictionary<string, MyCamera> cameraDic = new Dictionary<string, MyCamera>();
int apiResult = 0;
MyCamera.cbOutputExdelegate cbImage;
public event Action<int, HObject> GrabOkEvent;
private void ImageCallBack(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
{
int nIndex = (int)pUser;
HObject image = new HObject();
HOperatorSet.GenImage1(out image, "byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pData);
if (GrabOkEvent != null)
{
GrabOkEvent(nIndex, image);
}
//Marshal.FreeHGlobal(pData);
}
public List<string> GetCameras()
{
List<string> list = new List<string>();
foreach (KeyValuePair<string,MyCamera> camera in cameraDic)
{
list.Add(camera.Key);
}
return list;
}
public ECameraErrorCode Init()
{
int nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_pDeviceList);
if (nRet != 0)
{
return ECameraErrorCode.EnumDevicesFail;
}
else if (m_pDeviceList.nDeviceNum>0)
{
for (int i = 0; i < m_pDeviceList.nDeviceNum; i++)
{
///获取相机信息
MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_pDeviceList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));
string cameraInfo = gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")";
MyCamera camera = new MyCamera();
cameraDic.Add(cameraInfo, camera);
apiResult = camera.MV_CC_CreateDevice_NET(ref device);
if (apiResult != 0)
{
return ECameraErrorCode.CreateDeviceFail;
}
apiResult = camera.MV_CC_OpenDevice_NET();
if (apiResult != 0)
{
return ECameraErrorCode.OpenDeviceFail;
}
if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE)
{
int nPacketSize = camera.MV_CC_GetOptimalPacketSize_NET();
if (nPacketSize > 0)
{
nRet = camera.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize);
if (nRet != MyCamera.MV_OK)
{
return ECameraErrorCode.GevSCPSPacketSizeFail;
}
}
else
{
return ECameraErrorCode.GevSCPSPacketSizeFail;
}
}
apiResult = camera.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_ON);
if (nRet != MyCamera.MV_OK)
{
return ECameraErrorCode.SetTriggerModeFail;
}
apiResult = camera.MV_CC_SetEnumValue_NET("TriggerSource", (uint)MyCamera.MV_CAM_TRIGGER_SOURCE.MV_TRIGGER_SOURCE_SOFTWARE);
if (nRet != MyCamera.MV_OK)
{
return ECameraErrorCode.SetTriggerSourceFail;
}
apiResult = camera.MV_CC_RegisterImageCallBackEx_NET(cbImage, (IntPtr)i);
if (apiResult != 0)
{
return ECameraErrorCode.RegisterImageCallBackExFail;
}
apiResult = camera.MV_CC_StartGrabbing_NET();
if(apiResult!=0)
{
return ECameraErrorCode.StartGrabbingFail;
}
}
}
}
else
{
return ECameraErrorCode.CameraNoExist;
}
return ECameraErrorCode.Ok;
}
public void SetTriggerMode(ETriggerMode triggerMode)
{
m_triggerMode=triggerMode;
}
public int Grab(string camName)
{
if(cameraDic.ContainsKey(camName))
{
apiResult = cameraDic[camName].MV_CC_SetCommandValue_NET("TriggerSoftware");
if(apiResult==0)
{
return 0;
}
}
return -1;
}
public ECameraErrorCode Deinit()
{
foreach (KeyValuePair<string, MyCamera> item in cameraDic)
{
item.Value.MV_CC_CloseDevice_NET();
item.Value.MV_CC_DestroyDevice_NET();
}
return ECameraErrorCode.Ok;
}
}
}