1. 程式人生 > 其它 >海康相機回撥函式

海康相機回撥函式

技術標籤:工作記錄c#

記錄C#海康相機回撥用法,寫的有點亂,回頭再整理吧。
單個相機,取圖輸出CogImage8Grey 格式 和 CMvdImage格式。

用法:
先初始化相機 Camera
Camera.Run();
最後通過Camera.CIMG獲取CogImage8Grey影象結果(康耐檢視像結果)
最後通過Camera.MIMG獲取CMvdImage影象結果(海康讀碼)

public class Camera
        {
            public static MyCamera.cbOutputExdelegate ImageCallback;
            MyCamera.
MV_CC_DEVICE_INFO_LIST
stDevList = new MyCamera.MV_CC_DEVICE_INFO_LIST(); MyCamera.MV_CC_DEVICE_INFO stDevInfo; // 通用裝置資訊 MyCamera device = new MyCamera(); private double processtime; object imageLocker = new object(); bool
acqFinished = false; public double processTime { get { return processtime; } set { processtime = value; } } private bool succeed = true; Stopwatch Stopwatch = new Stopwatch(); private
CogImage8Grey cImg; public CogImage8Grey CIMG { get { return cImg; } set { cImg = value; } } private VisionDesigner.CMvdImage mImg; public VisionDesigner.CMvdImage MIMG { get { return mImg; } set { mImg = value; } } public bool SUCCEED { get { return succeed; } set { succeed = value; } } public bool Init() { int nRet; // ch:列舉裝置 | en:Enum device stDevList = new MyCamera.MV_CC_DEVICE_INFO_LIST(); nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref stDevList); if (MyCamera.MV_OK != nRet) { return false; } if (0 == stDevList.nDeviceNum) { return false; } // 通用裝置資訊 // ch:列印裝置資訊 en:Print device info for (Int32 i = 0; i < stDevList.nDeviceNum; i++) { stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO)); if (MyCamera.MV_GIGE_DEVICE == stDevInfo.nTLayerType) { MyCamera.MV_GIGE_DEVICE_INFO stGigEDeviceInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO)); uint nIp1 = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24); uint nIp2 = ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16); uint nIp3 = ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8); uint nIp4 = (stGigEDeviceInfo.nCurrentIp & 0x000000ff); } else if (MyCamera.MV_USB_DEVICE == stDevInfo.nTLayerType) { MyCamera.MV_USB3_DEVICE_INFO stUsb3DeviceInfo = (MyCamera.MV_USB3_DEVICE_INFO)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO)); } } stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[0], typeof(MyCamera.MV_CC_DEVICE_INFO)); // ch:建立裝置 | en:Create device nRet = device.MV_CC_CreateDevice_NET(ref stDevInfo); if (MyCamera.MV_OK != nRet) { return false; } // ch:開啟裝置 | en:Open device nRet = device.MV_CC_OpenDevice_NET(); if (MyCamera.MV_OK != nRet) { return false; } // ch:探測網路最佳包大小(只對GigE相機有效) | en:Detection network optimal package size(It only works for the GigE camera) if (stDevInfo.nTLayerType == MyCamera.MV_GIGE_DEVICE) { int nPacketSize = device.MV_CC_GetOptimalPacketSize_NET(); if (nPacketSize > 0) { nRet = device.MV_CC_SetIntValue_NET("GevSCPSPacketSize", (uint)nPacketSize); if (nRet != MyCamera.MV_OK) { Console.WriteLine("Warning: Set Packet Size failed {0:x8}", nRet); } } else { Console.WriteLine("Warning: Get Packet Size failed {0:x8}", nPacketSize); } } // ch:設定觸發模式為OFF || en:set trigger mode as off nRet = device.MV_CC_SetEnumValue_NET("TriggerMode", (uint)MyCamera.MV_CAM_TRIGGER_MODE.MV_TRIGGER_MODE_OFF); if (MyCamera.MV_OK != nRet) { return false; } // ch:註冊回撥函式 | en:Register image callback ImageCallback = new MyCamera.cbOutputExdelegate(ImageCallbackFunc); nRet = device.MV_CC_RegisterImageCallBackEx_NET(ImageCallback, IntPtr.Zero); if (MyCamera.MV_OK != nRet) { return false; } return true; } private void ImageCallbackFunc(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser) { int width = pFrameInfo.nWidth; int height = pFrameInfo.nHeight; byte[] SrcData = new byte[pFrameInfo.nHeight * pFrameInfo.nWidth];//影象資料 Marshal.Copy(pData, SrcData, 0, (int)pFrameInfo.nFrameLen); CMvdImage tempImage = new CMvdImage(); VisionDesigner.MVD_IMAGE_DATA_INFO stData = new MVD_IMAGE_DATA_INFO(); stData.stDataChannel[0].arrDataBytes = SrcData; stData.stDataChannel[0].nLen = pFrameInfo.nFrameLen; stData.stDataChannel[0].nRowStep = pFrameInfo.nWidth; stData.stDataChannel[0].nSize = (uint)(pFrameInfo.nHeight * pFrameInfo.nWidth); tempImage.InitImage((uint)pFrameInfo.nWidth, (uint)pFrameInfo.nHeight, VisionDesigner.MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08, stData); mImg = tempImage; CogImage8Grey cImage = null; CogImage8Root cogImage8Root = new CogImage8Root(); cogImage8Root.Initialize(width, height, pData, width, null); CogImage8Grey cogImage8Grey = new CogImage8Grey(); cogImage8Grey.SetRoot(cogImage8Root); cImg = cogImage8Grey; lock (imageLocker) { acqFinished = true; Monitor.Pulse(imageLocker); //完成,通知等待佇列,告知已完,執行下一個。 } Stopwatch.Stop(); processtime = Math.Round(Stopwatch.Elapsed.TotalMilliseconds,2); Stopwatch.Reset(); device.MV_CC_StopGrabbing_NET(); } public void Run() { int nRet = device.MV_CC_StartGrabbing_NET(); Stopwatch.Start(); if (MyCamera.MV_OK != nRet) { succeed = false; } lock (imageLocker) { while (!acqFinished) { Monitor.Wait(imageLocker); } } acqFinished = false; } public void closeCamera() { int nRet = device.MV_CC_CloseDevice_NET(); } public void setExposure(float exposure) { globalClass.device.MV_CC_SetEnumValue_NET("ExposureAuto", 0); int nRet = device.MV_CC_SetFloatValue_NET("ExposureTime", exposure); if (nRet != MyCamera.MV_OK) { // ShowErrorTip("設定曝光失敗!!"); } } public float getExposure() { try { MyCamera.MVCC_FLOATVALUE stParam = new MyCamera.MVCC_FLOATVALUE(); int nRet = device.MV_CC_GetFloatValue_NET("ExposureTime", ref stParam); if (MyCamera.MV_OK == nRet) { return stParam.fCurValue; } return 0; } catch (Exception) { return 0; } } }