Dalsa線陣CCD相機使用開發手冊


  要使用Dalsa工業相機進行二次開發,看用戶開發手冊順便做下筆記:(歡迎加QQ討論:77248031, 或QQ群:585068192)

  由於“本公主”用的.NET開發,軟件支持只翻譯了手冊中.NET部分,如有使用C++的小伙伴,可自行查閱手冊。

  一,Application Architecture

   不管使用哪個API(Sapera LT++, Sapera LT.NET 或者是標准C),Sapera LT模塊都可以部署在不同的Sapera LT服務器上。

  服務器可以運行在本地或者是Teledyne DALSA設備上。Sapera LT調用通過Sapera LT消息傳遞層以一種完全獨立於底層硬件的方式路由到不同的服務器。 

二,Library Architecture

  典型的機器視覺應用程序需要配置采集資源、圖像捕獲和傳輸到內存緩沖區。圖像緩沖區可以處理或展示,分析(圖像),通過結果確定后續流程。

  可以監視事件並觸發合適的響應。Sapera LT庫架構是圍繞這些基本機器視覺功能塊組織起來的。

 三,Sapera LT .NET Basic Classes by Subject

  下圖介紹了一些主要的Sapera LT.NET類的描述,並介紹了它們與其它類的關系:

3.1 Sapera LT ++ and Sapera LT .NET Class Descriptions

C++/.NET class Description
SapAcqDevice

控制Teledyne DALSA相機上的采集設備(例如,Genie M640)。 它被用作源傳輸節點,允許數據從一個采集資源傳輸到另一個傳輸節點,比如SapBuffer。 它被SapTransfer類使用。  

SapAcqToBuf,

SapAcqDeviceToBuf,

SapBufToBuf,

SapMultiAcqToBuf

這些具體化的傳輸類是從SapTransfer派生出來的,可以輕松地創建最常用的傳輸配置。 例如,設置一個從SapAcquisition對象(幀抓取器)到SapBuffer對象的傳輸配置通常需要很多行代碼來調用SapTransfer類中的各種函數。 而使用具體化類SapAcqToBuf可以將其減少到僅一行代碼。

SapAcquisition

通過acquisition section控制Teledyne DALSA board的采集設備(例如,X64 Xcelera-CL PX4)。它被用作源傳輸節點,允許數據從一個采集資源傳輸到另一個傳輸節點,比如SapBuffer。它被SapTransfer類使用。 

SapBuffer

對緩沖區的資源數組進行操作。一個SapTransfer實例可以將一個SapBuffer實例看成傳輸目的地,使得數據從原節點(例如SapAcquisition or SapAcqDevice)完成傳輸。一個SapBuffer實例可以通過SapView class來顯示,也可以使用SapProcessing class來處理。

SapBufferRoi

SapBufferRoi 類的目的是在已存在的SapBuffer實例中創建一個感興趣的矩形區域。ROI對於實例中的所有緩沖區資源具有相同的原點和維度

SapBufferWithTrash

SapBufferWithTrash類創建了一個額外的叫做緩沖垃圾的資源,在實時應用程序的數據傳輸過程中使用。trash buffer是一個應急緩沖,當數據傳輸比數據處理的速度快時使用。當處理速度不夠快的時候,來不及處理新進來的數據,圖像會被暫時傳輸到trash buffer直到重新穩定。

SapColorConversion

SapColorConversion類的目的是對從相機獲取的圖像以及其它格式的彩色圖像進行Bayer轉換。當使用帶有采集卡的Teledyne DALSA板時,該類支持在采集硬件中的顏色轉換(如果硬件支持)。否則該類也支持在主機上進行基於軟件的轉換。

SapData and SapDataXxx

SapData及其派生類充當Sapera LT數據類型的包裝器,其中每個類封裝特定類型的一個數據元素。 它們被用作各種Sapera LT ++和Sapera LT . net類中的屬性值、方法參數或返回值。  

SapDisplay

SapDisplay類及其功能可以將資源顯示在系統顯示設備(計算機視頻卡)或帶有顯卡的Teledyne DALSA板上。系統中每個顯示適配器(VGA板)上至少有一個這樣的資源。注意,SapView對象自動管理默認顯示資源的內部SapDisplay 對象。但是,如果你需要默認資源以外的顯示資源的話,你需要顯式的管理對象。 

SapFeature

SapFeature類及功能可以從SapAcqDevice類檢索特征信息。SapAcqDevice類支持的每個特性都提供了一組屬性,如名稱、類型、訪問模式等,這些屬性可以通過特性模塊獲得。  

SapFlatField

SapFlatField類的目的是對從相機獲取的圖像或從磁盤加載的圖像進行平場校正。 它可以從獲取硬件(如果支持的話)或從軟件實現中支持該功能。  

SapGio SapGio類的目的是控制一個通用輸入和輸出塊——一組可以同時讀寫的I/ o。  
SapLocation SapLocation類標識一個Sapera服務器/資源對  
SapLut SapLut類實現了查找表管理。 它通常與SapAcquisition和SapView類一起使用,分別操作采集和顯示查找表。  
SapManager SapManager類包括描述系統中出現的Sapera資源的方法。 它還包括錯誤管理功能。  
SapMetadata

SapMetadata類提供了管理GigE- vision相機元數據的函數(用於Genie-TS和Linea GigE)。 啟用時,支持的元數據(例如,時間戳或設備ID)包含在SapBuffer對象中。  

SapPerformance

SapPerformance類實現基本的基准測試功能。 它被SapProcessing類用來計算處理一個緩沖區所需的時間。 您也可以根據自己的基准測試需要使用它。  

SapProcessing SapProcessing類允許您通過派生類實現自己的處理。  
SapTransfer

SapTransfer類實現了管理通用傳輸過程的功能——將數據從一個源節點傳輸到一個目標節點。 以下類被認為是傳輸節點:SapAcquisition、SapAcqDevice和SapBuffer。  

SapView

SapView類包含通過SapDisplay對象在窗口中顯示SapBuffer對象的資源的功能。 “自動清空”機制允許SapView和SapTransfer對象之間同步,以便在不丟失任何數據的情況下實時顯示緩沖區。  

SapXferFrameRateInfo

SapXferFrameRateInfo類為相關的SapTransfer對象提供幀速率統計信息。它在構造SapTransfer對象時自動創建。  

SapXferNode

SapXferNode類是基類,用於表示由SapTransfer類管理的傳輸任務中涉及的源或目標傳輸節點。節點的實際類可以是SapAcqDevice、SapAcquisition或SapBuffer。  

SapXferPair SapXferPair類描述了SapTransfer類的一對源節點和目標節點。  
SapXferParams SapXferParams類存儲由SapTransfer類管理的傳輸任務所需的參數。  

 

.NET Only Class Description
SapAcqDeviceNotifyEventArgs SapAcqDeviceNotifyEventArgs類存儲了SapAcqDevice類的AcqDeviceNotify事件的參數  
SapAcqNotifyEventArgs SapAcqNotifyEventArgs類存儲了SapAcquisition類的AcqNotify事件的參數  
SapDisplayDoneEventArgs SapDisplayDoneEventArgs類存儲了SapView類的DisplayDone事件的參數。  
SapErrorEventArgs SapErrorEventArgs類存儲SapManager類的錯誤事件的參數  
SapException SapException類是SapLibraryException和SapNativePointerException類通用的基類。  
SapGioNotifyEventArgs SapGioNotifyEventArgs類存儲了SapGio類的GioNotify事件的參數。  
SapLibraryException 當Sapera LT庫中報告異常的錯誤條件時,會拋出SapLibraryException類。  
SapManVersionInfo SapManVersionInfo類包含與當前安裝的Sapera LT副本對應的版本信息。  
SapNativePointerException 當發生內部指針錯誤條件時,會拋出SapNativePointerException類。  
SapProcessingDoneEventArgs SapProcessingDoneEventArgs類存儲了SapProcessing類的ProcessingDone事件的參數。  
SapResetEventArgs SapResetEventArgs類存儲SapManager類的Reset事件的參數。  
SapServerFileNotifyEventArgs SapServerFileNotifyEventArgs包含SapManager類的ServerFileNotify事件的應用程序處理程序方法的參數。  
SapServerNotifyEventArgs SapServerNotifyEventArgs類存儲SapManager類的ServerNotify事件的參數。  
SapSignalNotifyEventArgs SapSignalNotifyEventArgs類存儲了SapAcquisition類的SignalNotify事件的參數。  
SapXferCounterStampInfo SapXferCounterStampInfo類存儲關於特定傳輸對的counter-stamp功能的信息。  
SapXferNotifyEventArgs SapXferNotifyEventArgs類存儲了SapTransfer類的XferNotify事件的參數。  

四,Trigger-to-Image-Reliability Framework

   機器視覺系統用於檢測,在不同類型的制造和過程工業識別和指導應用。 

  該視覺系統包括面和線掃描,彩色和單色相機和幀捕捉器,以提供能夠自動操作的系統,對物體執行100%的檢查任務。 

  視覺系統必須在各種操作條件下產生可靠的結果,以幫助提高產品和工藝的質量。 

  Teledyne DALSA的相機和幀捕捉器結合了Trigger-to-Image-Reliability(T2IR) Framework,以確保從物體被放置在相機前到決定接受或拒絕被檢查物體的數據可靠性。 

  T2IR框架基於硬件和軟件設計原則,以確保可靠性,並作為硬件特性和功能、獨立的基於GUI的工具和編程API交付。 T2IR框架允許應用程序跟蹤、跟蹤、調試、恢復和防止任何數據丟失。

4.1 Teledyne DALSA采集設備功能架構

  讓我們簡要地看一下Teledyne DALSA硬件設備的采集設備架構的主要構建模塊:

  • Acquisition Control Uint (ACQ):這個概念功能塊負責控制圖像采集功能和特征。它負責確保在正確的時間采集到正確的圖像。ACQ負責管理軟件控制下的攝像機控制信號。 此外,ACQ還提供了圖像采集序列的運行狀態。
  • Data Transfer Engine(DTE):DTE負責將數據從板載內存移進移出到主機內存,該功能塊采用智能DMA體系結構,並根據硬件的性能指標進行擴展。 DTE還負責根據T2IR框架生成管理圖像流所需的所有通知。
  • Image Processing Unit(IPU):IPU實現實時嵌入式圖像處理。 IPU的能力根據采購硬件的價格性能標准而有所不同。 從簡單的幀捕捉器和相機中的顏色空間轉換到圖像分析,再到視覺處理器上的外部設備控制,嵌入式處理的復雜性各不相同。

  考慮到Teledyne DALSA圖像采集設備的功能架構,讓我們進一步了解T2IR框架,了解它是什么,它的主要構建模塊,以及它如何幫助降低成本。

4.2 什么是Trigger-to-Image Reliability (T2IR)?

  機器視覺應用程序的圖像采集過程始於向相機發送一個信號,稱為外部觸發器,以開始生成圖像。 因此,無論視覺系統的性質如何,觸發信號都代表了圖像采集序列的關鍵起點,使圖像處理和分析能夠為進一步的檢查過程提供決策。

  

  視覺系統的可靠性體現在其處理可預測和不可預測觸發信號的能力上。 為了實現這種可靠性,視覺系統中的圖像采集和控制兩個部分必須協調工作。 

  對系統事件的控制響應與生成具有相同質量的產品所需的信息質量直接相關。 這有助於通過增加系統的正常運行時間和產量來降低成本。

 

  T2IR是硬件和軟件功能的結合,可以共同提高視覺系統的可靠性。 T2IR功能提供完整的系統級監控、控制和診斷能力。 它可以讓你進入你的視覺系統來監控和調試圖像流。 

  您可以跟蹤數據流,從圖像采集到傳輸到主機內存。 您甚至可以將圖像臨時存儲在板載內存中,以克服意想不到的傳輸瓶頸。 這意味着沒有丟失的數據,沒有錯誤的數據,而且還有明確的源頭來識別和跟蹤所有錯誤。

  Sapera T2IR以一種不干擾應用程序的方式完成這些任務。

4.3 跟蹤圖像(Tracking and Tracing Images)

  雖然我們已經從檢測目標的角度進行了討論,當目標處於正確位置時觸發閃光燈和攝像頭采集,並從傳感器讀取正確的圖像數據,但這只是設計可靠的機器視覺系統的開始。 

  另一個主要問題是協調圖像數據的收集,並將這些圖像與通過材料處理系統移動的實物相關聯。  

 

  T2IR使用一個重要的設計概念來幫助工程師創建可靠和可重復的系統:圖像標記或時間戳。 為了說明這一點,讓我們使用一個材料處理單元的示例,其處理速度可達每分鍾3,600個零件(ppm)。 

  為了使工廠的生產線以最高速度工作,每個圖像都必須加標簽,以便下游決定對正確的物體進行保留、丟棄或重新檢查。

 

  更高級的應用程序可能需要來自多個視圖的檢查。 繼續我們之前的例子,讓我們假設對象必須在每一面檢查,每一面都有不同的照明,相同的幀率。 

  現在,限制從每分鍾檢查3600個部件發展到每分鍾處理14400個圖像。 在這種情況下,成像系統必須將四個不同的采集點關聯起來,然后才能做出接受、拒絕或重新檢查目標的最終決定。  

   圖像標簽(時間戳)由機載硬件時鍾、PC時鍾或使用外部信號(如觸發器、編碼器滴答聲或圖像采集和/或圖像傳輸到主機時的另一個脈沖輸入)生成。 例如,Xtium-CL MX4提供了以下硬件時間戳:

  

  設備和主機(在開始接收幀時發出)的采集幀開始時間戳與圖像一起保存在Sapera緩沖區中。 主機應用程序可以使用Sapera函數檢索這些時間戳進行分析.

  由於在圖像捕獲和分析之間存在時間滯后,可以使用圖像時間戳來確保系統對正確的對象進行操作。 時間戳還可以用來精確地測量采集或處理速率。 它還可以通過比較連續幀之間的時間間隔來確定是否發生了數據丟失。

五,Overcoming Too Much Data

5.1 跟蹤Trashed Frames

  讓我們以前面的例子為基礎:系統每分鍾處理3600個零件,包括同時從4個方面獲取圖像,從而導致機器視覺系統每分鍾獲取、處理和分析14400幅圖像。 適當的系統設計要求在系統中內置一定數量的過剩容量,以處理高峰負載。 觸發器-圖像可靠性框架通過圓形緩沖區的概念提供峰值負載能力。 它還將此與用戶通知相結合,以便持續跟蹤。 在處理峰值負載時,重要的是要監視圖像隊列,以確保系統的各個部分保持同步,如果發生任何變化,則識別出來並及時通知用戶應用程序。

  T2IR框架的可擴展性使Teledyne DALSA能夠在其硬件產品中添加復雜的參數切換功能,這些功能非常適合用於循環緩沖區。 例如,Teledyne DALSA Genie相機允許用戶在一幀一幀的基礎上改變觸發延遲、頻閃輸出、曝光延遲和持續時間、增益、LUTs和FFC(平場系數)。 類似地,Xtium-CL MX4幀捕獲器允許用戶在一幀一幀的基礎上切換平場和lut。 當激活時,這些高級切換功能完全在采集設備中運行,而無需使用主機CPU資源。 此外,切換參數時生成的圖像可以保存為圖像序列。

  T2IR為處理數據過多的情況提供了廣泛的選擇。它為用戶提供了安全丟棄圖像的必要信息,同時保留了圖像處理后結果的准確性。當每個圖像都計數時,丟棄圖像不可避免的會導致吞吐量下降。因此,即使在丟棄圖像時,也必須注意將對吞吐量的影響降到最低。如果確定系統隨后無法處理圖像,T2IR框架運行應用程序在收集流程的早起丟棄圖像。T2IR框架使用”垃圾“緩沖區的概念來有效的丟棄傳入的圖像。當系統無法處理傳入的數據時,獲取的圖像被傳輸到”垃圾緩沖區“。

  發生這種情況時,將通過數據溢出事件通知用戶應用程序。 例如,當將圖像傳輸到主機緩沖區時,Xtium系列幀捕獲器會監測下游瓶頸,並立即在獲取源處丟棄圖像,而不是一直在主機內存中傳輸然后丟棄它。 這允許采集部分立即返回到就緒狀態,以捕獲下一個圖像.

 5.2 確保數據質量

  一般來說,機器視覺攝像機負責以一種可預測的方式優雅地處理過度觸發的情況。 當相機的觸發器的速率超過其最大幀率或線率能力時,發生相機的過觸發情況。 如果相機不能正常響應並停止發送圖像,T2IR功能提供了從這種情況中恢復的方法,並向用戶應用程序生成通知。 這是所有Teledyne DALSA幀抓取器的標准功能。 捕獲和處理丟線或幀是決定采集系統可靠性的重要因素,直接影響結果的准確性。 例如,對於線掃描相機,缺失的線會改變圖像中物體的寬高比,導致處理算法產生不正確的結果。 同樣,對於區域掃描相機來說,這可能意味着丟失了物體。

 六,Processing Buffers

  為了在獲取圖像的同時處理其它圖像,需要多個圖像緩沖區。當這些緩沖區通過一個傳輸資源與采集設備相連,圖像以環形方式存儲在這些緩沖區內,先存到第一個緩沖區,然后第二個,等等,直到到達最后一個,接下來第一個緩沖區會被覆蓋繼續循環。當第一個緩沖區被處理時,圖像被保存到下一個緩沖區。

  例如,4個圖像緩沖區:

  然而,圖像緩沖區只有在平均圖片處理時長小於平均采集時長的情況下可以處理所有的圖片。當處理時長追不上采集幀率時,就需要用到另外一種緩存來解決來不及處理的圖片,此緩存不是環形列表的一部分。在Sapera LT,這個緩存稱為Trash buffer。

  

  分配緩存的API支持:

  •  用一個SapBuffer或SapBufferWithTrash類的實例,都可以給定一個緩存大小

  將緩存鏈接在一起的API支持:

  •  用一個SapTransfer類的實例,或它的一個派生類,例如:SapAcqToBuf或SapAcqDeviceToBuf

6.1 緩存狀態

  緩存可以有兩種狀態:

  • Empty: 意味着可以像緩沖區存儲圖像
  • Full:意味着有未處理的數據仍然存儲在緩存區中

  緩存狀態在empty和full之間變換如下:

  • 所有buffer初始狀態都是empty
  • 當圖像被采集到緩沖區時,傳輸硬件將它們的狀態設置為full
  • 當傳輸硬件需要一個新的圖像緩沖區時,它可以考慮或忽略當前的緩沖區狀態,這取決於傳輸循環模式
  • 當緩沖區可以再次用於收集圖像時,由應用程序代碼負責將其狀態設置為空

注意:這些與Trash buffers無關。

  API對管理buffer狀態的支持:

  .NET: 雖然你可以使用SapBuffer和SapBufferWithTrash類的State屬性,但是依賴SapTransfer、SapProcessing和SapView類中的自動空機制通常是更好的。

6.2 Auto-Empty 機制

引用一種應用程序可配置機制,根據該機制,緩沖區狀態自動設置為空。

  有4種可能的場景:

  • 在transfer回調函數(如果有的話)執行完返回之后,Buffer狀態立刻被transfer(SapTransfer)置為empty。這是默認執行的。
  • 當緩沖區內的圖像被處理后,Buffer狀態立刻被processing(SapProcessing)置為empty狀態,這一過程是在processing回調函數(如果有的話)被調之前完成的。
  • 當緩沖區內的圖像被展示后,在view回調函數(如果有的話)被調之前,緩沖區狀態會被view(SapView)置為empty
  • Buffer狀態也可以在程序中被直接置為empty

管理auto-empty機制的API支持:

  .NET: 在SapTransfer, SapProcessing和SapView類中使用AutoEmpty屬性。

6.3 Transfer Cycling Modes

 當決定下一張圖片存儲在哪個緩存區時,使用transfer所使用的標准。

  OFF模式時:

  • 永遠傳輸到當前緩沖區
  • 忽略buffer的狀態
  • 忽略是否有trash buffer

  Asynchronous模式時:

  • 永遠傳輸到下一個緩沖區
  • 忽略buffer的狀態
  • 忽略是否有trash buffer

  Synchronous模式時:

  • (Case 1)如果下一個緩沖區是empty狀態,則傳輸到下一個緩沖區
  • (Case 2)如果下一個緩沖區是full狀態,則傳輸到當前緩沖區
  • 忽略是否有trash buffer

  Next Empty模式時:

  • (Case 1)如果下一個緩沖區是empty狀態,則傳輸到下一個緩沖區
  • (Case 2)如果下一個緩沖區是full狀態,則傳輸到隊列的再下一個緩沖區
  • (Case 3)如果所有緩沖區都是full狀態,則傳輸到當前緩沖區
  • 忽略trash buffer的存在

  Synchromous With Trash 模式時:

  • (Case 1)如果下一個緩沖區是empty狀態,則傳輸到下一個緩沖區
  • (Case 2)如果下一個緩沖區是full狀態,則傳輸到trash buffer
  • (Case 3)只要下一個緩沖區是full狀態,則持續傳輸到trash buffer
  • 緩沖區狀態與trash buffer無關

  Synchronous Next Empty With Trash模式時:

  • (Case 1)如果下一個緩沖區是empty,則傳輸到下一個緩沖區
  • (Case 2)如果下一個緩沖區是full,傳輸到隊列中的下一個empty緩沖區
  • (Case 3)如果所有緩沖區都是full,則傳輸到trash buffer
  • (Case 4)只要所有緩沖區都是full,則持續傳輸到trash buffer
  • buffer狀態與trash buffer無關

  管理transfer cycling 模式的API支持:

  .NET: 使用SapXferPair類種的Cycle屬性

6.4 處理和顯示圖像的執行流程

   例一:程序只需要讀取采集圖像的時間戳

     .NET API:

    • 調用SapTransfer類的XferNotify事件的handler function
    • 函數讀取SapBuffer類的CounterStamp屬性來檢索時間戳,並返回
    • 緩沖區狀態由SapTransfer類自動設置為空

   例二:程序只需要處理采集的圖像

     .NET API(初始化):

    • 創建一個從SapProcessing派生的新類,該類覆蓋的Run函數將處理實際的處理過程
    • 將SapTransfer類的AutoEmpty屬性設置為False,避免buffers在此類中被設置為empty
    • 將SapProcessing類的AutoEmpty屬性設為True,在此類中緩沖區可被置為empty

     .NET API(在每個圖像被采集后):

    • 調用SapTransfer類中XferNotify事件的application handler function
    • 函數調用SapProcessing類的Execute函數,並返回
    • 最終調用應用程序中被overriden的Run函數
    • 這個函數執行圖像的實際處理,並返回
    • 緩沖區狀態被SapProcessing類自動設置為empty
    • 調用SapProcessing類的ProcessingDone事件的application handler function(如果有的話)

  例三:程序需要在顯示(處理之后的)圖像之前處理圖像

     .NET API(初始化):

    • 創建一個從SapProcessing類派生出的新類,重載Run函數以進行實際的圖像處理
    • 將SapTransfer類的AutoEmpty屬性置為False,以避免在SapTransfer類中被置為empty
    • 將SapProcessing類的AutoEmpty屬性置為False,以避免在SapProcessing類中被置為empty
    • 將SapView類的AutoEmpty屬性置為True,在SapView類中將buffer狀態置為empty

     .NET API (每張圖像被采集后):

    • 調用SapTransfer類中XferNotify的application handler function
    • 這個function調用SapProcessing類的Execution function,並return
    • 最終在程序中調用重載的Run function
    • Run function執行實際的圖像處理,並返回
    • 調用SapProcessing類中ProcessingDone事件的application handler function
    • 這個函數調用SapView類中的Show函數來顯示處理后的圖像,並返回
    • buffer狀態被SapView類自動設置為empty狀態
    • 調用SapView類中DisplayDone事件的application handler function(如果有的話)

 七,平場校正

  許多Teledyne DALSA幀捕捉器和攝像機支持硬件平場校正。以下部分概述了如何使用Sapera LT SapFlatField類進行平場校正。

  平場校正每個像素使用2個系數(偏移量和增益)來補償固定模式噪聲(FPN)和光響應不均勻性(PRNU)。

  • 暗場校正(FPN)是在沒有入射光(也稱為暗電流)的情況下像素響應的變化。 它是由傳感器中存在的背景電壓產生的噪聲信號。 平場偏移(offset)系數被用來校正這種噪聲。 為了使用SapFlatField::ComputeOffset進行FPN校正,需要對一些暗圖像進行平均(即,使用鏡頭蓋阻止所有光線進入傳感器)。 平均圖像中允許的零像素百分比可以使用SapFlatField::SetBlackPixelPercentage設置(太多的零像素表示相機的黑色級別太高,信息被剪切; 調整相機設置相應)。
  • 明場校正(PRNU)是是像素對等量光的響應變化。平常增益系數(flat field gain coefficients)用於矯正這種響應的不均勻性,使得當暴露在享同得入射光時輸出相同的像素響應值。為了使用SapFlatField::ComputeGain進行PRNU校正,需要對一些白色圖像進行平均,這樣相機就接近但不飽和。計算每個像素的增益系數,使其達到低於飽和的指定目標值。

  對於FPN和PRNU校正來說,使用越多數量的圖像來平均越能減少隨機噪聲帶來的影響

   ComputeOffset函數必須在ComputeGain函數之前調用。要對圖像應用軟件平場校正,請使用SapFlatField::Execute函數。 對於硬件平場校正,將平場校正文件加載到設備並在硬件上激活,有關更多信息,請參閱設備文檔(device documentation)。

  平場校正后應用的系統偏移量和增益通常用於最大化典型圖像場景的圖像動態范圍。

7.1 平場文件格式

  平場校正生成一個8或16-bit的TIF文件,包含偏移(offset)和增益(gain)因子。緩存與采集圖像等寬但高度2倍於采集圖像的高度(第一半包含偏移(offset)因子,第二半是增益(gain)因子)。

  8位或16位的格式由傳遞給SapFlatField::ComputeOffset / ComputeGain函數的緩沖區的格式決定。 16位文件用於10、12、14或16位輸出格式。一般來說,應該使用傳感器的最高輸出格式來校正平場系數。通過設置偏移因子(SapFlatField::SetOffsetFactor), 16位平坦場系數文件可以用於較低的輸出格式。

  Sapera LT使用的TIFF文件結構

  • TIFF header —— 根據TIFF 6.0規范
  • 圖像數據寬度與采集圖像寬度相等
  • 圖像數據高度是采集圖像高度的2倍
  • 圖像的上半部是偏移(offset)數據
  • 圖像下半部是增益(gain)數據
  • 圖像像素格式與采集圖像的像素格式相同

7.2 平場校正公式

  對於每個像素,平場校正通過以下公式計算:

$correctedValue = (originalValue - offset) * (gain / gainDivisor + gain base)$

  Gain Divisor增益除數

   對於8位增益系數,增益除數通常等於128,這樣在0和255之間的增益值就變成了0和2之間的值。 然后,當調用Create方法時,它被設置為采集設備增益除數(gain divisor)的值(SapFlatField::SetGainDivisor方法只在沒有硬件支持的情況下使用)。 gainDivisor和gain base用於將浮點增益值(gain value)轉換為可保存在. TIFF圖像中的整數值。

  Gain Base

  對於增益基,如果采集設備(例如,Genie TS)支持,則在調用Create方法后從設備中檢索它。 對於所有其他采集設備,以及基於軟件的平場校正,該屬性的初始值為0,如果需要,應用程序代碼可以調用SetGainBase。

7.3 偏移因子(offset coefficients)

  FPN校正的偏移因子(offset coefficients)基於對每個像素點進行計算,使用在Xn, Yn點的平均像素減去DN值。DN值對應的是表示小於1%像素點分布的下限(利用~3σ標准差計算平均黑色圖像的直方圖平均值)。

  $Offset coefficient(Xn, Yn)= average pixel value(Xn, Yn) - DN value of ~3σ$

  這種方法保留了動態范圍,減少了在零處被裁剪的像素數(這將導致圖像數據的丟失,即使隨后應用偏移量和增益來調整黑色閾值)。 

  SapFlatField::SetOffsetMinMax可以用來限制可能的增益值。 如果像素達到這個限制,當SapFlatField::EnableClippedGainOffsetDefects = TRUE(默認)時,它們將被標記為有問題的。

 

7.4 增益因子(Gain Coefficients)

  應用偏移系數后計算增益系數。 計算增益系數使所有像素達到指定的目標值(或白色圖像中的最大像素值)。 SapFlatField::SetGainMinMax可以用來限制可能的增益值。 如果像素達到這個限制,當SapFlatField::EnableClippedGainOffsetDefects = TRUE(默認)時,它們將被標記為有問題的

7.5 像素替換 (Pixel Replacement)

  or the black and white images, pixel values higher/lower than

(average pixel value +/- deviationMax)

  are considered as defective pixels. By default, the maximum deviation is 0.25 x maximum pixel value (for example for 8-bit images the maximum deviation is 63). The maximum deviations for the black and white images are set using the SapFlatField::SetDeviationMaxBlack / SetDeviationMaxWhite functions. Pixel replacement is enabled/disabled using SapFlatField::EnablePixelReplacement. Pixels are replaced using the pixel to its immediate left, other than the first pixel of a line, which uses the pixel to the right.

7.6 校正相機的平場系數:

  • 配置相機到所需的幀率和曝光時間,調整光照的水平以正常運行。 如果使用,任何水平或垂直的像素合並(binning)也應使用。
  • 鏡頭應在所需的放大倍率和孔徑並輕微不聚焦,以避免在參考圖像中引入粒度或細節(當校正完成,重新聚焦鏡頭)。
  • 由於白色參考點位於物體平面上,其表面的任何標記或污染物(即灰塵、划痕、污跡)都將體現在相機的校正文件中。 為了避免這一點,使用干凈的白色塑料或陶瓷材料,而不是試圖依靠紙張參考。 (理想情況下,白色物體將在校正過程中移動,因為相機的平均處理會減少白色參考中的任何微小變化的影響。)
  • 調整系統增益直到峰值強度達到所需DN水平,然后使用SapFlatField::ComputeOffset函數校正固定模式噪聲(FPN)。 使用鏡頭蓋,以確保沒有光線到達傳感器。
  • 完成后,取下鏡頭蓋,使用SapFlatField::ComputeOffset使用所需的目標值(DN)進行光響應非均勻性(PRNU)校正。 你希望所有的像素都匹配。 這個目標值應該高於你第一次設置相機時看到的峰值。
  • The system gain remains as first set

7.7 代碼示例:C++代碼展示如何使用Sapera LT進行平場手動校正

 1 // Rely on the SapFlatField class to automatically create the offset and gain buffers with the
 2 // correct dimensions and format, but perform the calibration manually
 3 // pAcquisition is an existing SapAcquisition object
 4 // pBuffer is an existing SapBuffer object containing an acquired image.
 5 SapFlatField* pFlatField = new SapFlatField(pAcquisition); 
 6 BOOL success = pFlatField->Create();
 7 SapBuffer* pBufferOffset = pFlatField->GetBufferOffset(); 
 8 SapBuffer* pBufferGain = pFlatField->GetBufferGain(); 
 9 // Can also use the following: 
10 // int bufWidth = pBufferOffset->GetWidth(); 
11 // int bufWidth = pBufferGain->GetWidth();
12 int bufWidth = pBuffer->GetWidth();
13 // Can also use the following:
14 // int bufHeight = pBufferOffset->GetHeight();
15 // int bufHeight = pBufferGain->GetHeight();
16 int bufHeight = pBuffer->GetHeight();
17 // Can also use the following:
18 // int bufFormat = pBufferOffset->GetFormat();
19 // int bufFormat = pBufferGain->GetFormat();
20 int bufFormat = pBuffer->GetFormat();
21 // This is for 8-bit buffers.
22 BYTE* pBufData;
23 success = pBuffer->GetAddress(&pBufData);
24 BYTE* pOffsetData;
25 success = pBufferOffset->GetAddress(&pOffsetData);
26 BYTE* pGainData;
27 success = pBufferGain->GetAddress(&pGainData);
28 int gainDivisor = pFlatField->GetGainDivisor();
29 // Code to perform manual calibration using pBufData, pOffsetData,
30 // pGainData, and gainDivisor goes here
31 //
32 success = pFlatField->Destroy();
33 delete pFlatField;

 

 

  

    

 

 

 

 

 

 
 


免責聲明!

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



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