C#筆記 關於采集卡


 周更!節日快樂!

1. 參數

1.1 CAM file

CAM file是文件擴展名為.cam的可讀ASCII文件,包含了參數列表,比如:AcquisitionMode,TrigMode等。通過McSetParamStr方法將Camfile加載到通道:

McSetParamStr(MyChannelMyChannel, MC_CamFile , "VCC VCC-870A_P15RA");

1.2 channel

通道是攝像頭、幀捕獲器和主機PC內存之間的采集路徑。通道由三部分組成:

1. 負責圖像捕獲的相機。
2. 幀捕獲器負責圖像的采集和傳輸。
3. 用於在主機PC中存儲圖像的內存緩沖區。

 

通道可以被設置為以下四種狀態之一:

Name Meaning
Orphan 沒有與之關聯的抓取器。因此不可能立即獲取圖像。但是通道存在,其所有參數都可以自由設置或獲取。
Idle

當通道處於空閑狀態時,它有一個與之關聯的抓取器。因此,可以立即進行圖像采集。在此狀態下,MultiCam可能會自動將抓取器資源重新分配給另一個通道。

Ready

當通道處於就緒狀態時,它有一個與之關聯的抓取器。因此,可以立即進行圖像采集。在此狀態下,MultiCam無法自動將抓取器資源重新分配給另一個通道。

Active 當通道處於活動狀態時,它有一個與其相關聯的抓取器,並執行圖像采集序列。在此狀態下,MultiCam無法自動將抓取器資源重新分配給另一個通道。

代碼示例:

1.3 surface

surface是一個緩沖區,用戶應用程序可以在其中找到要分析的采集圖像。內存緩沖區由稱為surface的MultiCam對象表示。surface可以由Multicam自動創建,也可以由用戶手動創建。抓取器通過DMA機制自動將采集的圖像傳輸到目標surface。通道可以有一個或多個surface(默認為4)。根據surface的數量,定義了單緩沖和多緩沖。

Surface state Meaning
FREE 自由表面能夠無條件地從抓取器接收圖像數據。
FILLING

目前正在從抓取器接收圖像數據,或准備接收數據。一個cluster中應該都有一個FILLING狀態的Surface。

FILLED 已完成從抓取器接收圖像數據,已准備好進行處理。
PROCESSING

PROCESSING狀態的Surface正在被處理器處理。

RESERVED 從標准狀態轉換機制中刪除。

代碼示例:

一組surface稱為cluster,一個通道只能有一個cluster。cluster的狀態有OFF,READY(在獲取圖像但沒有surface處於PROCESSING),BUSY(有surface處於PROCESSING),UNAVAILABLE(不能獲取圖像)

Single Buffering

 

 Dual Buffering

 Triple Buffering

1.4 Multicam Signaling

信號是由通道生成的與用戶應用程序交互的事件。

Frame Trigger Violation  
Start Exposure 該信號在幀曝光條件開始時發出。
End Exposure 該信號在幀曝光條件結束時發出。
Surface Filled 當目標cluster的Surface 進入Filled狀態時,會發出此信號。
Surface Processing 當目標cluster的Surface 進入Processing狀態時,會發出此信號。
Cluster Unavailable  
Acquisition failure (**)  

Start of Acquisition Sequence

 
End of Acquisition Sequence  
End of Channel Activity  

有三種機制可以訪問它們:

1. 涉及在出現預定義信號時自動調用的用戶編寫的函數。(callback)
2. 允許線程等待預定義信號出現的專用機制。
3. 涉及標准Windows等待函數的用戶定義機制。

使用callback的步驟:

1. 默認情況下,禁用所有信號。SignalEnable參數用於設置它。

2. 注冊回調函數

3. 在回調函數中,使用包含觸發事件信息的PMCSIGNALINFO捕獲事件。

示例:

 

1.5 Trigger

觸發事件由TrigMode和NextTrigMode參數進行設置。

1.5.1 初始觸發事件:

  • 連續:將ChannelState設為Active后立即啟動,NextTrigMode為REPEAT
  • 硬觸發
  • 軟觸發:將ForceTrig參數設置為TRIG
  • 結合觸發

1.5.2 觸發事件的結束

可以通過EndTrigMode結束采集階段:
1)幀、頁或行計數器到期時,采集序列自動終止。(AUTO)
2)當檢測到硬件端觸發線的有效轉換時,采集序列終止(HARD)
或者通過BreakEffect參數直接終止channel的活動狀態:

1)在slice/phase/sequence結束后再停止采集(FINISH)

2)立刻停止(ABORT)

1.6 Acquisition Mode

  • VIDEO模式用於從標准區域掃描攝像機記錄多個視頻序列。ActivityLength指定通道活動周期內的序列數。
  • SNAPSHOT模式用於從區域掃描相機獲取快照圖像。唯一序列能夠在信道活動周期內獲取SeqLength_Fr幀。
  • PAGE模式用於從線掃描相機獲取離散對象的圖像。每一頁由連續的行組成;頁面長度(以行表示)由PageLength\u Ln指定。單個序列能夠在通道活動周期內獲取SeqLength_Pg頁面。
  • WEB模式用於從線掃描相機獲取連續對象(如網絡)的圖像。在信道活動周期內,可使用單個序列獲取連續行的SeqLength_。序列被划分為連續的相位,每個相位獲取PageLength\u Ln行。如果SeqLength_Ln不是PageLength_Ln的倍數,則在最后階段會部分填充surface。序列和第一采集階段根據觸發模式啟動。后續采集階段自動啟動,無任何線路損耗。BreakEffect指定用戶中斷時的行為。

1.7 Exception

異常通過異常代碼或Windows異常進行管理。ErrorHandling參數設置錯誤管理行為,有4個可能的值。

  • None 沒有異常時為MC_OK或者0,有異常時函數會返回MCSTATUS類型的值。

 

  • MSGBOX 沒有異常時為MC_OK或者0,有異常會顯示對話框

  • Exception
  • MSGException

 

2. Demo

2.1 打開driver

// Open MultiCam driver
MC.OpenDriver();

2.2 創建channel

// Create a channel and associate it with the first connector on the first board
MC.Create("CHANNEL", out channel);
MC.SetParam(channel, "DriverIndex", 0);

2.3 相機參數設置

// Choose the CAM file
MC.SetParam(channel, "CamFile", "1000m_P50RG");
// Choose the camera expose duration
MC.SetParam(channel, "Expose_us", 20000);
// Choose the pixel color format
MC.SetParam(channel, "ColorFormat", "Y8");

2.4 觸發模式更改

//Set the acquisition mode to Snapshot
MC.SetParam(channel, "AcquisitionMode", "SNAPSHOT");
// Choose the way the first acquisition is triggered
MC.SetParam(channel, "TrigMode", "COMBINED");
// Choose the triggering mode for subsequent acquisitions
MC.SetParam(channel, "NextTrigMode", "COMBINED");

2.5 事件觸發

2.5.1 注冊回調函數

// Register the callback function
 multiCamCallback = new MC.CALLBACK(MultiCamCallback);
MC.RegisterCallback(channel, multiCamCallback, channel);

2.5.2 開啟信號

// Enable the signals corresponding to the callback functions
MC.SetParam(channel, MC.SignalEnable + MC.SIG_SURFACE_PROCESSING, "ON");
MC.SetParam(channel, MC.SignalEnable + MC.SIG_ACQUISITION_FAILURE, "ON");

2.5.3 判斷接收到的信號

如果接收到的是MC.SIG_SURFACE_PROCESSING,調用ProcessingCallback獲取圖片的數據,將圖片數據轉換為bitmap。如果接收到的是MC.SIG_ACQUISITION_FAILURE,調用AcqFailureCallback輸出"Acquisition Failure"。

private void MultiCamCallback(ref MC.SIGNALINFO signalInfo)
        {
            switch(signalInfo.Signal)
            {
                case MC.SIG_SURFACE_PROCESSING:
                    ProcessingCallback(signalInfo);
                    break;
                case MC.SIG_ACQUISITION_FAILURE:
                    AcqFailureCallback(signalInfo);
                    break;
                default:
                    throw new Euresys.MultiCamException("Unknown signal");
            }
        }

2.6 channel狀態置為READY

// Prepare the channel in order to minimize the acquisition sequence startup latency
MC.SetParam(channel, "ChannelState", "READY");

 

3.  測試程序的編寫

觸發模式就用默認的連續觸發。

將camfile的加載顯示在界面上。

Demo界面只有Go和stop還有狀態條,增加按鈕打開/關閉相機和開始/停止采集。

曝光開始事件觸發,幀開始count++;surface_processing事件觸發,采圖count++;獲取失敗事件觸發,丟失幀count++。

 

 代碼絕對是運行不起來的,畢竟我是一個采集卡都沒見過的人,紙上談兵罷了哈哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM