以下文章來源于OpenFPGA,作者碎碎思
介紹

FPGA 廣泛應用于各種圖像處理應用,包括醫(yī)療和科學成像、空間成像、汽車和國防領域。
不管用哪種解決方案,高級算法可能不一樣,但最基礎的部分都是一樣的:它們都得先跟圖像傳感器或者攝像頭連接,把拍到的畫面處理一下,然后整理成視頻流,好讓顯示器顯示或者通過網(wǎng)絡傳出去。
在本項目中,我們將詳細了解使用圖像傳感器時涉及的不同階段和元素。
我們將從頭開始:圖像傳感器實際上是如何工作的。
圖像傳感器如何工作?
圖像傳感器是一種神奇的設備,因為它們不僅使我們能夠看到可見光譜內(nèi)的東西,而且還使我們能夠看到人類可見光范圍之外的東西,例如X射線和紅外線。

圖像傳感器主要基于兩種技術:
電荷耦合器件(CCD)
CMOS圖像傳感器(CIS)
電荷耦合器件- 利用勢阱形成像素陣列,勢阱在入射光子撞擊像素時形成。在積分時間(即捕獲圖像的時間)內(nèi),撞擊像素的光子產(chǎn)生的電荷會累積,就像水灌滿桶一樣,將勢阱填滿。積分時間結束時,逐個像素輸出,將電荷轉換為電壓。
其工作原理類似于移位寄存器:定時信號將存儲信號移位通過像素陣列。為了加快讀取速度,可以實現(xiàn)多個輸出通道。CCD 是模擬的,信號的定時和電壓電平會影響數(shù)據(jù)傳輸和圖像的整體質量。通常使用外部 ADC 將像素電壓轉換為數(shù)字表示,以便進一步處理。
CCD 如今已不太常見,但由于其卓越的性能,仍用于天文學和空間成像等高端成像應用。
CMOS 圖像傳感器- CIS 使用光電二極管形成像素陣列,在每個像素上將光子轉換為電壓。該模擬電壓直接在芯片上轉換為數(shù)字輸出。
這種轉換方式比CCD讀取速度更快,但是CIS的噪聲性能通常較差。如今大多數(shù)相機都使用CIS,因為它們更易于操作和數(shù)字化集成。
可見光譜外成像
如果我們想要在可見光譜之外成像,就必須選擇合適的設備。CMOS 和 CCD 傳感器都可以捕獲 X 射線到近紅外 (NIR) 波長。
隨著波長向紅外光譜方向遞減,電子能量也隨之降低,需要比硅更先進的半導體。根據(jù)觀察到的光譜,典型的器件包括:
電荷耦合器件(CCD):X射線到可見光,延伸至近紅外。
CMOS圖像傳感器(CIS):X射線到可見光,延伸至近紅外。
非制冷紅外:微測輻射熱計,通常在中紅外范圍內(nèi)工作。
冷卻紅外線:需要冷卻的基于 HgCdTe 或 InSb 的解決方案。
線掃描或二維掃描
當我們觀看靜止圖像或視頻幀時,它是二維的。然而,如何創(chuàng)建二維圖像則取決于具體應用。
例如,如果目標物體正在移動(例如在生產(chǎn)線上),可以使用單行像素,并通過移動生成二維圖像。這種方法在生產(chǎn)線檢測和軌道衛(wèi)星成像中很常見,因為軌道的運動提供了生成圖像所需的運動。
更常見的替代方法是使用 2D 傳感器,無需移動即可捕獲 2D 圖像。
傳感器性能
圖像傳感器的一個關鍵性能指標是量子效率 (QE)。QE 測量的是入射到器件的光子數(shù)與像素中檢測到的光子數(shù)之比。
當制造圖像傳感器時,設備上的結構可以降低前照式設計中的 QE(即光子撞擊傳感器的前部)。
為了實現(xiàn)更好的量子效率 (QE),人們采用了背照式設計,以減少結構對光子探測的影響。然而,背照式設計需要額外的工藝,這會降低良率并增加成本。

卷簾快門或全局快門
使用二維圖像傳感器時,我們經(jīng)常需要確定圖像傳感器上快門的類型。快門主要有兩種類型:
卷簾快門:每行在其積分時間之后讀出,但是捕獲的圖像可能會因運動而損壞。
全局快門:整個陣列同步并作為一個整體讀出。

我相信我們都在網(wǎng)上看過這樣的視頻:直升機在飛行,但旋翼卻似乎沒有動。這是因為卷簾快門與卷簾上的旋翼葉片同步,導致旋翼葉片看起來靜止不動。
彩色或灰度
對于大多數(shù)人來說,我們通過眼睛感知世界的方式是彩色視覺。然而,到目前為止,我們只討論了像素、電荷的積累,以及電荷轉化為電壓,再轉化為數(shù)字格式的過程。
所有波長的光子在一個像素上混合,并轉換成代表圖像的電壓。如果我們在圖像處理應用程序中按原樣處理這些信息,結果將是一幅灰度圖像。
灰度圖像用于許多應用,因為它們提供亮度信息,這對于分析亮度、對比度、邊緣、形狀、輪廓、紋理、透視和陰影至關重要。
灰度運算也具有計算效率高的特點,因為只需處理單個通道的數(shù)據(jù)。此外,使用閾值處理很容易將灰度圖像轉換為二值圖像,從而實現(xiàn)形態(tài)學運算。
為了獲得彩色圖像,需要在傳感器上直接應用一個特定的光學濾鏡。這個濾鏡被稱為拜耳掩模,它覆蓋每個像素,只允許一種波長的光(紅色、綠色或藍色)通過。
每個像素僅捕獲紅色、綠色或藍色光子。這些濾光片通常排列成 2x2 的網(wǎng)格,包含一個紅色像素、一個藍色像素和兩個綠色像素。這種排列會突出綠色,因為它位于可見光譜的中間,而人眼對綠光更敏感。

去拜耳化過程
拜耳掩模需要后期處理才能重建全彩圖像。在 FPGA 中,我們可以處理像素流,對原始數(shù)據(jù)進行反拜耳處理,使用 2x2 網(wǎng)格將每個像素轉換為 RGB 值。
此過程涉及網(wǎng)格中相鄰像素之間的插值。雖然有效,但由于需要插值來填充缺失的顏色信息,可能會導致圖像分辨率略有損失。
色彩空間
如果我們決定處理 RGB 圖像,還需要考慮顏色空間。通常,我們從 RGB 顏色空間開始。假設每個顏色通道(R、G、B)8 位,則每個像素需要 24 位。
在 FPGA 中,可以輕松實現(xiàn)任意總線大小。但是,由于 24 位格式,將這些數(shù)據(jù)存儲在內(nèi)存(例如 DDR3 或 DDR4)中效率不高。
為了提高內(nèi)存效率,我們可以使用更緊湊的色彩空間,例如 YUV,它將亮度 (Y) 和色度(U 和 V)通道分開。在 YUV 色彩空間中,兩個像素可以共享 U 和 V 通道,從而將存儲需求降低到每像素 16 位,從而提高效率。
此外,較窄的總線寬度簡化了 FPGA 內(nèi)的布線,使實現(xiàn)更容易且可能更具成本效益。

與傳感器和攝像頭接口
現(xiàn)在我們了解了圖像傳感器的工作原理,我們可以探索傳感器如何與 FPGA 連接。
主要有兩種方法:
相機集成傳感器:傳感器嵌入在執(zhí)行大部分接口的相機中,并輸出圖像以供進一步處理。
直接傳感器接口:FPGA 直接與傳感器接口,需要額外的控制和信號處理。
無論采用何種方法,F(xiàn)PGA I/O 都是多功能的,能夠與攝像機和傳感器連接。
我們先來看一下一些常用的接口標準:
HDMI(高清多媒體接口)- HDMI 通常用于相機,尤其是緊湊型運動相機。FPGA 可以使用最小化傳輸差分信號 (TMDS) 標準直接與 HDMI 接口。AMD 7 系列 FPGA、UltraScale 器件和 UltraScale+ 器件均支持此功能。
對于分辨率更高的圖像,其性能可能超出高清 (HD) 存儲體的性能,可以使用千兆收發(fā)器。HDMI 通過三個差分通道(分別用于紅、綠、藍)和一個用于時鐘信號的附加通道傳輸視頻數(shù)據(jù)。
SDI(串行數(shù)字接口)視頻- SDI 是一種通過帶有 BNC 連接器或光纖的同軸電纜傳輸未壓縮的數(shù)字視頻、音頻和元數(shù)據(jù)的專業(yè)標準。
支持的分辨率:范圍從標準清晰度(SD-SDI)到超高清(12G-SDI)。
應用:由于其高質量、低延遲性能和對長電纜傳輸?shù)闹С?,非常適合廣播和現(xiàn)場制作。
FPGA 支持:當與 AMD FPGA 或 SoC 連接時,SDI 使用千兆收發(fā)器。
SDI 視頻信號通過專用硬件 IP 核進行處理,可提供:
支持各種SDI標準。諸如視頻縮放、色彩空間轉換和多路復用等功能。
這些核心能夠實現(xiàn)與專業(yè)視頻工作流程的強大而靈活的集成。
Camera Link - Camera Link 使用多個 LVDS(低壓差分信號)通道將數(shù)據(jù)從相機傳輸?shù)綆杉鳎ㄔ?Camera Link 標準中,幀采集器就是我們的 FPGA)。Camera Link 使用四對 LVDS 線傳輸數(shù)據(jù),第五對 LVDS 線傳輸時鐘。

并行/串行 -許多相機或傳感器提供并行或串行輸出,其方式可以通過反串行化來重建像素數(shù)據(jù)、相關幀以及行有效信號。這可以使用 LVDS/SLVS(可擴展低壓信號)等實現(xiàn)。如果采用串行化,則可以使用 FPGA IO 提供的 IO 結構來同步和正確解碼數(shù)據(jù)流。

MIPI (移動行業(yè)處理器接口)- MIPI 是最廣泛使用的傳感器接口之一。它是一種高帶寬、點對點協(xié)議,旨在通過多個差分串行通道傳輸圖像傳感器或顯示數(shù)據(jù)。
協(xié)議層:MIPI 跨各種 OSI 模型層運行,最低的是 DPHY 層。
DPHY 定義了通道數(shù)、時鐘以及差分信號 (SLVS) 與單端信號 (LVCMOS) 之間的轉換。
該組合支持CSI-2(攝像機串行接口)和DSI(顯示器串行接口)等協(xié)議的高帶寬數(shù)據(jù)傳輸。
低速通信允許以較低的功率水平有效傳輸控制信息。
表現(xiàn):
每個 MIPI DPHY 鏈路可支持 1 至 4 個高速串行通道,每通道運行速度高達 2.5 Gbps,或四通道運行速度高達 10 Gbps。
數(shù)據(jù)傳輸以兩倍數(shù)據(jù)速率進行,與時鐘通道同步。
FPGA支持:
AMD UltraScale+ 設備和 Versal 自適應 SoC 原生支持 MIPI DPHY。
對于 AMD 7 系列 FPGA 和 UltraScale 設備,可以使用外部電阻網(wǎng)絡或定制 DPHY 電路實現(xiàn) MIPI DPHY。
利用可編程邏輯和 IP 庫
FPGA的核心理念是盡可能多地利用 Vivado 設計套件和 Vitis 平臺 IP 庫中的現(xiàn)有 IP(知識產(chǎn)權)。這些庫提供了豐富的預設計組件,能夠高效地實現(xiàn)復雜的功能。
用于視頻傳輸?shù)?AXI Stream
視頻處理流水線中的大多數(shù)接口都使用 AXI Stream 協(xié)議在模塊之間傳輸視頻流。AXI Stream 的核心操作主要使用以下信號:
TData:將數(shù)據(jù)有效載荷從主機傳送到從機。
TValid:表示 TData 總線上有有效數(shù)據(jù)。
TReady:來自從屬設備的信號,表示它已準備好接受數(shù)據(jù)。
視頻數(shù)據(jù)標記
對于視頻流,需要額外的標記來指示幀的開始和行的結束,以便可以構建和處理完整的 2D 圖像。
為了實現(xiàn)這一目標,AXI Stream 引入了:
TUse信號:表示新幀的開始。
TLast信號:標記視頻流中一行的結束。
這些標記確保視頻數(shù)據(jù)的正確同步和重建,使 AXI Stream 協(xié)議非常適合處理 FPGA 中的 2D 圖像和視頻處理。
了解了 AXI Stream 的概念及其在圖像處理流傳輸中的應用后,我們現(xiàn)在可以探索如何利用 FPGA 的并行特性。一種有效的方法是將多個像素包含在單個 AXI Stream 數(shù)據(jù)流中。
通過每個時鐘周期傳輸多個像素,可以顯著提高圖像處理管道的吞吐量。

在 AXI Stream 中利用 FPGA 并行性
了解了 AXI Stream 的概念及其在圖像處理流傳輸中的應用后,我們現(xiàn)在可以探索如何利用 FPGA 的并行特性。一種有效的方法是將多個像素包含在單個 AXI Stream 數(shù)據(jù)流中。
通過每個時鐘周期傳輸多個像素,可以顯著提高圖像處理管道的吞吐量。
AXI Stream 中的像素并行性
通常,AXI Stream 可以配置為每個時鐘周期傳輸 1、2 或 4 個像素,具體取決于應用和系統(tǒng)要求。例如,當每個時鐘周期輸出 4 個像素時,整體數(shù)據(jù)速率和處理效率會顯著提高,如下例所示。
這種并行性不僅增強了基于 FPGA 的圖像處理流水線的性能,而且還確保了高分辨率和高幀率視頻流的無縫處理。

FPGA 圖像處理流水線架構
在可編程邏輯中實現(xiàn)圖像處理流水線時,需要考慮兩種主要架構:
1. 直接架構
在直接架構中,輸入直接連接到處理階段和輸出,具有最少的緩沖并且沒有幀緩沖。
優(yōu)點:這種方法提供了輸入和輸出之間的最低延遲,使其成為延遲至關重要的應用的理想選擇,例如自動駕駛汽車或實時視頻分析。
局限性:由于沒有幀緩沖,這種架構對于需要時間數(shù)據(jù)存儲或同步的任務來說靈活性較差。

2. 幀緩沖架構
幀緩沖架構利用內(nèi)存來緩沖一個或多個幀。
優(yōu)點:在以下情況下使用此方法:
需要向相關處理系統(tǒng)中的處理器提供該圖像。
需要修改視頻流的輸出時間(例如,為了同步或與其他組件兼容)。
用例:幀緩沖架構在靈活性和時間調(diào)整比延遲問題更重要的應用中很常見。

管道配置
無論選擇哪種圖像處理架構(直接還是幀緩沖),設計中使用的 IP 核都需要通過 AXI Lite 進行正確的配置。
AXI Lite 配置:
設置圖像尺寸(寬度和高度)。
啟用 IP 核功能。
控制核心的處理算法。
示例:直接方法圖像處理管道
對于此應用程序,我們將創(chuàng)建一個使用直接方法實現(xiàn)的示例圖像處理管道。
這意味著從輸入到輸出無需幀緩沖,從而確保從輸入幀到輸出幀的最小延遲。為了實現(xiàn)這一點,我們必須最大限度地減少整個流水線的緩沖。
目標設備
該設計的目標設備是 AMD Kintex 7 FPGA,具體使用 Digilent Genesys 2 開發(fā)板,其特點是:
HDMI 輸入和輸出接口:非常適合從運動相機或測試設備捕捉圖像并將其顯示在屏幕上。
該設計將利用 Vivado,并可分為兩個主要部分:
圖像處理管道
使用 AMD MicroBlaze V 進行控制和配置
管道設計
該管道將:
通過 HDMI 接收數(shù)據(jù):將其從具有垂直和水平同步信號的并行視頻格式轉換為 AXI 流。
將視頻流轉換為 AXI Stream:AXI Stream 是大多數(shù)圖像處理塊使用的標準接口。
通過 AXI Stream 將數(shù)據(jù)輸出到視頻輸出:這在視頻時序發(fā)生器的控制下生成并行視頻。
使用 AMD MicroBlaze V 處理器進行控制
管道和相關的視頻時序生成器將由基于 RISC-V 指令集架構的 AMD MicroBlaze V 處理器控制。
與之前使用 VDMA(視頻直接內(nèi)存訪問)的示例不同,此應用程序將不使用 VDMA 來確保輸入和輸出之間的最低延遲。
AMD Vivado 設計套件組件
圖像處理流水線將使用以下IP核:
DVI2RGB:用于將 DVI 轉換為 RGB 格式的 Digilent IP 核。
視頻輸入到 AXI Stream:Vivado Design Suite IP 塊用于將 RGB 視頻轉換為 AXI Stream 格式。
AXI Stream 到視頻輸出:Vivado Design Suite IP 塊用于將 AXI Stream 轉換回 RGB 格式。
視頻時序控制器:配置用于檢測輸入時序并生成輸出時序。如有需要,此配置還將支持未來的 VDMA 應用。
AXI Stream FIFO:以數(shù)據(jù)包模式配置,在線路通過之前對其進行緩沖。
AXIS 寄存器切片:在管道內(nèi)添加以幫助時序收斂。
AMD MicroBlaze V 處理器子系統(tǒng)
AMD MicroBlaze V 處理器控制器子系統(tǒng)配置為微控制器。此配置支持 AXI 外設數(shù)據(jù)和指令接口,并通過 AXI 互連連接到:
UartLite:用于 UART 控制臺通信的 Vivado Design Suite IP 塊。
AXI GPIO:監(jiān)控顯示器和攝像頭熱插拔檢測信號。
AXI 中斷控制器:處理處理器中斷。
MicroBlaze V 處理器調(diào)試模塊:支持使用 Vitis 平臺進行調(diào)試。


設備利用率如下所示:

該軟件運行在AMD Vitis平臺開發(fā)的AMD MicroBlaze V處理器上。
#include#include"platform.h" #include"xil_printf.h" #include"xvtc.h" #include"xgpio.h" #include"vga.h" #include"xparameters.h" XVtc VtcInst; XVtc_Config *vtc_config ; XGpio hpd_in; XVtc_SourceSelect SourceSelect; intmain() { u16 result; VideoMode video; XVtc_Timing vtcTiming; init_platform(); printf("Setting up VTC "); vtc_config = XVtc_LookupConfig(XPAR_XVTC_0_BASEADDR); XVtc_CfgInitialize(&VtcInst, vtc_config, vtc_config->BaseAddress); //configure and assert the HPD XGpio_Initialize(&hpd_in, XPAR_XGPIO_0_BASEADDR); XGpio_DiscreteWrite(&hpd_in,1,0x1); sleep(20); XGpio_DiscreteWrite(&hpd_in,2,0x1); ///needs time here video = VMODE_1280x720; vtcTiming.HActiveVideo = video.width; /**< Horizontal Active Video Size */ ?vtcTiming.HFrontPorch = video.hps - video.width; /**< Horizontal Front Porch Size */ ?vtcTiming.HSyncWidth = video.hpe - video.hps; ?/**< Horizontal Sync Width */ ?vtcTiming.HBackPorch = video.hmax - video.hpe + 1; ?/**< Horizontal Back Porch Size */ ?vtcTiming.HSyncPolarity = video.hpol; /**< Horizontal Sync Polarity */ ?vtcTiming.VActiveVideo = video.height; /**< Vertical Active Video Size */ ?vtcTiming.V0FrontPorch = video.vps - video.height; /**< Vertical Front Porch Size */ ?vtcTiming.V0SyncWidth = video.vpe - video.vps; /**< Vertical Sync Width */ ?vtcTiming.V0BackPorch = video.vmax - video.vpe + 1;; /**< Horizontal Back Porch Size */ ?vtcTiming.V1FrontPorch = video.vps - video.height; /**< Vertical Front Porch Size */ ?vtcTiming.V1SyncWidth = video.vpe - video.vps; /**< Vertical Sync Width */ ?vtcTiming.V1BackPorch = video.vmax - video.vpe + 1;; /**< Horizontal Back Porch Size */ ?vtcTiming.VSyncPolarity = video.vpol; /**< Vertical Sync Polarity */ ?vtcTiming.Interlaced = 0; ? ? memset((void *)&SourceSelect, 0, sizeof(SourceSelect)); ?SourceSelect.VBlankPolSrc = 1; ?SourceSelect.VSyncPolSrc = 1; ?SourceSelect.HBlankPolSrc = 1; ?SourceSelect.HSyncPolSrc = 1; ?SourceSelect.ActiveVideoPolSrc = 1; ?SourceSelect.ActiveChromaPolSrc= 1; ?SourceSelect.VChromaSrc = 1; ?SourceSelect.VActiveSrc = 1; ?SourceSelect.VBackPorchSrc = 1; ?SourceSelect.VSyncSrc = 1; ?SourceSelect.VFrontPorchSrc = 1; ?SourceSelect.VTotalSrc = 1; ?SourceSelect.HActiveSrc = 1; ?SourceSelect.HBackPorchSrc = 1; ?SourceSelect.HSyncSrc = 1; ?SourceSelect.HFrontPorchSrc = 1; ?SourceSelect.HTotalSrc = 1; ?XVtc_RegUpdateEnable(&VtcInst); ?XVtc_SetGeneratorTiming(&VtcInst, &vtcTiming); ?XVtc_SetSource(&VtcInst, &SourceSelect); ?XVtc_EnableGenerator(&VtcInst); ?XVtc_Enable(&VtcInst); ?XVtc_EnableDetector(&VtcInst); ?XVtc_Enable(&VtcInst); ?xil_printf("Video Mode = %i ", result); ?xil_printf(" "); ? ??printf("VTC Set Up "); ? ? cleanup_platform(); ? ??return?0; }
-
FPGA
+關注
關注
1660文章
22408瀏覽量
636227 -
CMOS
+關注
關注
58文章
6217瀏覽量
242818 -
二極管
+關注
關注
149文章
10406瀏覽量
178403 -
圖像傳感器
+關注
關注
68文章
2075瀏覽量
132202
原文標題:燈光、鏡頭和FPGA邏輯
文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
ISSCC上的最新圖像傳感器技術
圖像傳感器實際上是如何工作的
評論