VisionMaster4.2.0 联合C#实现相机SDK取图
VisionMaster4.2.0 聯合C#實現相機SDK取圖
- 一、相機取流
- 1.1 設備連接接口流程
- 1.2 主動取流
- 1.3 回調取流
- 二、VisionMaster 圖像源SDK取圖
一般情況下,VisionMater支持絕大多數工業相機直連,但是在實際使用過程中,例如相機需要被其他軟件占用等復雜情況,VisionMaster無法連接相機獲取圖像數據。為此,VisionMaster圖像源支持二次開發情況下,利用SDK獲取圖像數據。今天,簡單介紹一下工業相機取流以及VisionMaster的SDK取圖。
一、相機取流
這里采用海康MVS相機SDK,完成相機的取流。
1.1 設備連接接口流程
Created with Rapha?l 2.3.0開始枚舉所有設備(可選)MV_CC_EnumDevices_NET判斷設備是否可訪問(可選)MV_CC_IsDevicesAccessible_NET創建句柄MV_CC_CreateHandle_NET打開設備MV_CC_OpenDevice_NET獲取設備信息(可選)MV_CC_GetAllMatchInfo_NET關閉設備MV_CC_CloseDevice_NET釋放句柄MV_CC_DestoryHandle_NET結束詳細步驟:
-
(可選)調用MV_CC_EnumDevices_NET() 枚舉子網內指定傳輸協議對應的所有設備。可以通過nTLayerType在結構 MV_CC_DEVICE_INFO() 中找到設備的信息。
-
(可選)在打開指定設備之前,調用 MV_CC_IsDeviceAccessible_NET() 檢查指定設備是否可訪問。
-
調用 MV_CC_CreateDevice_NET() 以創建設備句柄。
-
調用 MV_CC_OpenDevice_NET() 打開設備。
-
(可選)執行以下一個或多個操作:
獲取設備信息 調用 MV_CC_GetAllMatchInfo_NET()
獲得最佳包大小(僅對網口相機有效) 調用 MV_CC_GetOptimalPacketSize_NET()
-
調用 MV_CC_CloseDevice_NET() 關閉設備。
-
調用 MV_CC_DestroyDevice_NET() 來銷毀句柄并釋放資源。
1.2 主動取流
SDK提供主動獲取圖像的接口,用戶可以在開啟取流后直接調用此接口獲取圖像,也可以使用異步方式(線程、定時器等)獲取圖像。
- 主動取流有兩種方式(不可以同時使用)
方式一:調用 MV_CC_StartGrabbing_NET() 開始采集,需要自己開啟一個buffer,然后在應用層循環調用 MV_CC_GetOneFrameTimeout_NET() 獲取指定像素格式的幀數據,獲取幀數據時上層應用程序需要根據幀率控制好調用該接口的頻率。
方式二:調用 MV_CC_StartGrabbing_NET() 開始采集,然后在應用層調用 MV_CC_GetImageBuffer_NET() 獲取指定像素格式的幀數據,然后調用 MV_CC_FreeImageBuffer_NET() 釋放buffer,獲取幀數據時上層應用程序需要根據幀率控制好調用該接口的頻率。
- 區別:
1、 MV_CC_GetImageBuffer_NET() 需要與 MV_CC_FreeImageBuffer_NET() 配套使用,當處理完取到的數據后,需要用 MV_CC_FreeImageBuffer_NET() 接口將pstFrame內的數據指針權限進行釋放。
2、 MV_CC_GetImageBuffer_NET() 與 MV_CC_GetOneFrameTimeout_NET() 相比,有著更高的效率。且其取流緩存的分配是由sdk內部自動分配的,而 MV_CC_GetOneFrameTimeout_NET() 接口是需要客戶自行分配。
- 采集流程(以MV_CC_GetImageBuffer_NET為例)
1.3 回調取流
SDK提供注冊回調函數的接口,用戶可以將自己定義的回調函數注冊在SDK內部,SDK獲取到相機圖像會主動回調到應用程序供用戶處理,此方式可以簡化用戶程序邏輯。
- 采集流程
- 注意事項:
1、回調函數中不建議有耗時操作、線程鎖等,容易造成回調阻塞。
2、pData返回的是一個地址指針,建議將pData里面的數據copy出來另建線程使用。
示例(偽代碼):
//創建設備列表 MyCamera.MV_CC_DEVICE_INFO_LIST m_stDeviceList = new MyCamera.MV_CC_DEVICE_INFO_LIST(); //返回成功或錯誤信息 int nRet;//回調函數 public static MyCamera.cbOutputExdelegate ImageCallback; void ImageCallbackFunc(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser) { //放入自己的操作 }// ch:枚舉設備 | en:Enum device nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref m_stDeviceList);// ch:獲取選擇的設備信息 | en:Get selected device information MyCamera.MV_CC_DEVICE_INFO device =(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(m_stDeviceList.pDeviceInfo[Index],typeof(MyCamera.MV_CC_DEVICE_INFO));//Index 設備索引// ch:創建設備 | en:Create device public MyCamera m_MyCamera = new MyCamera();//創建設備對象 nRet = m_MyCamera.MV_CC_CreateDevice_NET(ref device);// ch:打開設備 | en:Open device nRet = m_MyCamera.MV_CC_OpenDevice_NET(ref device);// ch:注冊回調函數 | en:Register image callback ImageCallback = new MyCamera.cbOutputExdelegate(ImageCallbackFunc); nRet = m_MyCamera.MV_CC_RegisterImageCallBackEx_NET(ImageCallback, IntPtr.Zero);// ch:開啟抓圖 || en: Start grab image nRet = m_MyCamera.MV_CC_StartGrabbing_NET();// ch:停止抓圖 | en:Stop grab image nRet = m_MyCamera.MV_CC_StopGrabbing_NET();// ch:關閉設備 | en:Close device nRet = m_MyCamera.MV_CC_CloseDevice_NET();// ch:釋放資源 | en:Drstory device nRet = m_MyCamera.MV_CC_DestroyDevice_NET();二、VisionMaster 圖像源SDK取圖
簡單搭建測試方案,設置圖像源為SDK。
我們通過相機SDK取流,將圖像數據拷貝并傳給圖像源模塊中。
偽代碼如下:
//用于拷貝出相機圖像數據 public ImageBaseData stInputImageInfo;//相機回調函數 void ImageCallbackFunc(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser) {byte[] m_BufForDriver1 = new byte[pFrameInfo.nFrameLen];//海康相機取流 指針轉byte[]Marshal.Copy(pData, m_BufForDriver1, 0, ((int)pFrameInfo.nFrameLen));stInputImageInfo = new ImageBaseData(m_BufForDriver1, pFrameInfo.nFrameLen, pFrameInfo.nWidth, pFrameInfo.nHeight, 1); }//實例化圖像源,傳入相機圖像數據stInputImageInfo ImageSourceModuleTool imageSourceModuleTool = VmSolution.Instance["流程1.圖像源1"] as ImageSourceModuleTool; imageSourceModuleTool.SetImageData(stInputImageInfo); //流程執行 VmProcedure vmProcedure = VmSolution.Instance["流程1"] as VmProcedure; vmProcedure.Run();- 通過接口函數ImageBaseData(byte[] imageData, uint dataLen, int width, int height, int pixelformat)將數據轉換為VisionMaster的圖像數據類型ImageBaseData。
效果展示:
總結
以上是生活随笔為你收集整理的VisionMaster4.2.0 联合C#实现相机SDK取图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 此次为大家带来的是关于一些PLC编程控制
- 下一篇: 张小龙演讲4小时之我认为重要的点