Lab 相關---四相機同步拍攝說明
1. 前言
這部分是我們所做的實驗室影象採集系統中的一個功能模組。 我們的相機採集系統本來是可以直接進行採圖存圖操作的, 但是並不保證同步, 或者說他們之間的同步效能並不高。 由於, 老闆要求實現精確的同步採圖功能, 所以這個模組需要我們進行修改。
2. 處理流程
2.1 查閱資料
因為這是一個新的專案需求, 我們就想從相機的角度出發, 看看相機自身有沒有給我們提供了這個一個相關的處理方法, 如果有的話, 那麼問題就好辦了。通過查閱相機的文件說明, 我們發現我們使用的這個相機 有兩種工作模式:
- freerun 自由工作模式
- SyncIn1 (硬體控制)觸發工作模式
從這個圖中, 我們可以看到我們可以設定相機的SyncIn1 模式下的觸發事件, 當他為上升沿觸發的時候, 就進行採圖。
ie, 我們之前一直使用的工作模式是 freerun 工作模式, 在這個模式下面可以實現相機的採圖存圖功能, 但是同步效能不佳。
這個SyncIn1 工作模式給我們提供了一個思路, 可以通過硬體來解決這個同步觸發的問題。
2.2 觸發器使用
很顯然的, 我們需要一個可以發射脈衝的工具, 在這裡就是我們所用到的觸發器了。當然這裡還涉及到觸發器的控制, 這個其實就是串列埠通訊部分的內容了。常用的串列埠通訊的解決方案有這麼兩種:
- 直接利用 ms 的mscomm 控制元件來實現, 不過這個控制元件在 vs2013 中並不是自帶的,需要額外註冊, 配置
- 使用網上的開源工具類 CSerialPort, 這個工具類提供了串列埠通訊的基本功能, 我們看了下里面最核心的函式其實還是 createFileEx
2.3 剩餘的問題
到這裡, 同步拍攝的原理已經縷清楚了, 實現起來也相對比較容易。不過當我們使用相機來拍攝一個計時中的秒錶的時候
最後兩位資訊有時候還是不同步。ie, 存在100ms左右的時間差。
但是這是為什麼呢? 原理上使用觸發器進行觸發, 所有相機收到的都是同一個觸發脈衝, 所有相機都是統一型號, 理論上不該有這麼大的時間差。
後來經過除錯發現, 問題出在相機的幀快取中。
由於我們的相機底層是通過維護一個 5 幀大小的幀佇列來負責影象的正常更新顯示的, 當我們抓取圖片的時候, 我們可能是抓取到了這個佇列中的任意一個, 由此導致出現時間差。
在明白了這點之後, 我們只需要在抓取圖片之前清空掉棧的快取, 這樣就可以保證抓取到的圖片就是我們的觸發脈衝發射過來的這個時間點上所抓取到的圖片了。