周更!節日快樂!
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++。
代碼絕對是運行不起來的,畢竟我是一個采集卡都沒見過的人,紙上談兵罷了哈哈哈