日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

VisionMaster4.2.0 联合C#实现相机SDK取图

發布時間:2024/1/1 C# 114 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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為例)
Created with Rapha?l 2.3.0開始開啟取流MV_CC_StartGrabbing_NET()從相機中獲取圖像MV_CC_GetImageBuffer_NET() MV_CC_FreeImageBuffer_NET()停止采集MV_CC_StopGrabbing_NET()結束

1.3 回調取流

SDK提供注冊回調函數的接口,用戶可以將自己定義的回調函數注冊在SDK內部,SDK獲取到相機圖像會主動回調到應用程序供用戶處理,此方式可以簡化用戶程序邏輯。

  • 采集流程
Created with Rapha?l 2.3.0開始注冊回調函數MV_CC_RegisterImageCallBackEx_NET()開啟取流MV_CC_StartGrabbing_NET()停止采集MV_CC_StopGrabbing_NET()結束
  • 注意事項:

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];//??迪鄼C取流 指針轉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取图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。