Dalsa 8K彩色相機Camera link C#採圖

来源:https://www.cnblogs.com/SSRYang/archive/2019/12/23/12082107.html
-Advertisement-
Play Games

一個採圖工具,所以界面做的很簡單。 private SapAcquisition m_Acquisition; private SapBuffer m_Buffers; private SapAcqToBuf m_Xfer; private SapView m_View; private SapCo ...


 

 一個採圖工具,所以界面做的很簡單。

 

        private SapAcquisition m_Acquisition;
        private SapBuffer m_Buffers;
        private SapAcqToBuf m_Xfer;
        private SapView m_View;
        private SapColorConversion m_ColorConv;
        private SapProcessing m_Pro;
        private SapLocation m_ServerLocation;
        private String m_ConfigFileName;
        private String m_Executetime;
        private bool m_IsSignalDetected;
        private bool m_online;
public bool CreateNewObjects() { m_ServerLocation = new SapLocation("Xtium-CL_MX4_1", 2);//第一位是顯卡名稱,第二位是選擇模式的第幾項 m_ConfigFileName = "22N_No_Name_Default_Default.ccf";//配置文件路徑 m_Acquisition = new SapAcquisition(m_ServerLocation, m_ConfigFileName); if (SapBuffer.IsBufferTypeSupported(m_ServerLocation, SapBuffer.MemoryType.ScatterGather)) m_Buffers = new SapBufferWithTrash(2, m_Acquisition, SapBuffer.MemoryType.ScatterGather); else m_Buffers = new SapBufferWithTrash(2, m_Acquisition, SapBuffer.MemoryType.ScatterGatherPhysical); m_Xfer = new SapAcqToBuf(m_Acquisition, m_Buffers); m_ColorConv = new SapColorConversion(m_Acquisition, m_Buffers); m_Xfer.Pairs[0].EventType = SapXferPair.XferEventType.EndOfFrame; m_Xfer.XferNotify += new SapXferNotifyHandler(xfer_XferNotify); m_Xfer.XferNotifyContext = this; m_Pro = new SapMyProcessing(m_Buffers, m_ColorConv, new SapProcessingDoneHandler(ProCallback), this); if (!CreateObjects()) { DestroyObjects(); DisposeObjects(); return false; } EnableSignalStatus(); return true; } //這項函數官方demo是用來顯示幀率的,但是我這裡不需要所以就沒寫功能,但是要加這個函數,否則連續採集的時候就只會拍兩張照片。 static void ProCallback(object sender, SapProcessingDoneEventArgs pInfo) { Form1 demo = pInfo.Context as Form1; } private bool CreateObjects() { // Create acquisition object if (m_Acquisition != null && !m_Acquisition.Initialized) { if (m_Acquisition.Create() == false) { DestroyObjects(); return false; } } // Create buffer object if (m_Buffers != null && !m_Buffers.Initialized) { if (m_Buffers.Create() == false) { DestroyObjects(); return false; } m_Buffers.Clear(); } // Create color conversion object if (m_ColorConv != null && !m_ColorConv.Initialized) { if (m_ColorConv.Create() == false) { DestroyObjects(); return false; } } // Create view object if (m_View != null && !m_View.Initialized) { if (m_ColorConv != null && m_ColorConv.Initialized) { // Set buffer to be viewed // When using hardware color decoder, view the acquired RGB buffer, // otherwise, for software color conversion, view the converted RGB buffer. SapBuffer convBuffer = m_ColorConv.OutputBuffer; if (convBuffer != null && convBuffer.Initialized) m_View.Buffer = convBuffer; else m_View.Buffer = m_Buffers; } if (m_View.Create() == false) { DestroyObjects(); return false; } } // Create Xfer object if (m_Xfer != null && !m_Xfer.Initialized) { if (m_Xfer.Create() == false) { DestroyObjects(); return false; } m_Xfer.AutoEmpty = false; } // Create processing object if (m_Pro != null && !m_Pro.Initialized) { if (!m_Pro.Create()) { DestroyObjects(); return false; } m_Pro.AutoEmpty = true; } return true; } private void DestroyObjects() { if (m_Xfer != null && m_Xfer.Initialized) m_Xfer.Destroy(); if (m_Pro != null && m_Pro.Initialized) m_Pro.Destroy(); if (m_View != null && m_View.Initialized) m_View.Destroy(); if (m_ColorConv != null && m_ColorConv.Initialized) m_ColorConv.Destroy(); if (m_Buffers != null && m_Buffers.Initialized) m_Buffers.Destroy(); if (m_Acquisition != null && m_Acquisition.Initialized) m_Acquisition.Destroy(); } private void DisposeObjects() { if (m_Xfer != null) { m_Xfer.Dispose(); m_Xfer = null; } if (m_Pro != null) { m_Pro.Dispose(); m_Pro = null; } if (m_View != null) { m_View.Dispose(); m_View = null; } if (m_ColorConv != null) { m_ColorConv.Dispose(); m_ColorConv = null; } if (m_Buffers != null) { m_Buffers.Dispose(); m_Buffers = null; } if (m_Acquisition != null) { m_Acquisition.Dispose(); m_Acquisition = null; } } private void EnableSignalStatus() { if (m_Acquisition != null) { m_IsSignalDetected = (m_Acquisition.SignalStatus != SapAcquisition.AcqSignalStatus.None); // if (m_IsSignalDetected == false) // StatusLabelInfo.Text = "Online... No camera signal detected"; // else // StatusLabelInfo.Text = "Online... Camera signal detected"; m_Acquisition.SignalNotifyEnable = true; } } static void xfer_XferNotify(object sender, SapXferNotifyEventArgs argsNotify) { Form1 demo = argsNotify.Context as Form1; // If grabbing in trash buffer, do not display the image, update the // appropriate number of frames on the status bar instead if (argsNotify.Trash) return; // Refresh view else { demo.TakeImage(); demo.m_Pro.ExecuteNext(); } }
        private void button1_Click(object sender, EventArgs e)
        {
            m_Xfer.Grab();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            m_Xfer.Freeze();
        }
     private void TakeImage()
        {
            try
            {
                SapBuffer m_pBuffer;
                int m_StartFrame;
             //   SapBuffer.FileFormat[] m_StandardTypes;
                m_pBuffer = m_Buffers;
                m_StartFrame = m_pBuffer.Index; string m_Option = "-format jpeg -quality 30";
                m_Buffers.Save(textBox2.Text, m_Option, m_StartFrame,0);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }


 

關於採圖,上面用的是官方的SDK方式,因為我採集的圖片像素是8K*8K,原圖BMP格式有256MB,壓縮成30%質量的JPG也還有2.3MB左右。

還有一種方式是用Bitmap來獲取圖片地址,但是需要註意的一點。

    IntPtr addr;
    int Height = m_Buffers.Height;
    int Width = m_Buffers.Width;
    m_Buffers.GetAddress(out addr);       
    bitmap = new Bitmap(Width, Height, Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppRgb, addr);
                        

  這裡的寬度是*4,原因是我的BMP原圖圖像位深度是32位的。所以保存用Bitmap的方式需要先確定原圖的位深度,否則保存圖片會出現重影。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發WPF應用時出現:”調用線程無法訪問此對象,因為另一個線程擁有該對象。“ 是因為UI線程是WPF應用的主線程,若嘗試子線程更新UI線程應使用Dispatcher.BeginInvoke()或者Invoke()方法。 Dispatcher.BeginInvoke() //非同步執行,不等待委托結束 ...
  • 上一篇文章https://www.cnblogs.com/mbpframework/p/12073102.html,介紹了一下Mbp的框架.其實這個框架寫出來主要是為了學習,當然也可以經過優化運用到實際的項目中.今天我們來說說怎麼使用這個框架. 首先我們用分層的方式來規划下我們的項目代碼結構. Me ...
  • 本筆記摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,記錄一下學習過程以備後續查用。 一、Lambda 的意義 在Framework 2.0 以前,聲明委托的唯一方法是通過方法命名,從Framework 2.0 ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Compression; using... ...
  • 有些時候電腦上會有一些文件刪除不了,例如:刪除的時候,提示文件不存在,或者請求的安全信息不可用或無法顯示。 無法刪除文件夾的原因: 1.當文件夾中存在正在被占用的文件時,刪除當然會失敗。其中包括有一些病毒程式在運行時,刪除文件夾的操作也會失敗。2.如果採用NTFS文件系統,當前用戶不具備目標文件的完 ...
  • 該問題出現在WPF中的VM類中,ObservableCollection類型,該類型的 CollectionView 不支持從調度程式線程以外的線程對其 SourceCollection 進行的更改,解決辦法: ThreadPool.QueueUserWorkItem(delegate { Sync ...
  • 當DataGrid屬於單元格選中時出現紅框,是因為WPF中DataGrid擁有預設的驗證屬性,如需關閉,請在DataGrid中加入以下屬性: Validation.ErrorTemplate="{x:Null}" ...
  • 目錄 目錄 Linux伺服器部署.Net Core筆記:一、開啟ssh服務 Linux伺服器部署.Net Core筆記:二、安裝FTP Linux伺服器部署.Net Core筆記:三、安裝.NetCore運行環境 Linux伺服器部署.Net Core筆記:四、安裝Supervisor進程守護 Li ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...