嵌入式視覺系統(tǒng)的構建模塊
傳統(tǒng)嵌入式視覺系統(tǒng)采用FPGA/處理器組合來實現,也有越來越多地使用將高性能處理器與FPGA相結合的片上系統(tǒng)來實現。在本文中我們將會介紹嵌入式視覺系統(tǒng)的高級元素;如何簡便快捷地使用軟件 API 和 IP 庫構建嵌入式視覺系統(tǒng),如何把算法開發(fā)的增值部分添加到圖像處理鏈中。
本文引用地址:http://m.butianyuan.cn/article/201710/365724.htm從監(jiān)控攝像頭等簡單監(jiān)控系統(tǒng)到更高級的應用,例如當今最新款汽車配備的高級駕駛員輔助系統(tǒng) (ADAS)和先進生產設施及工廠里使用的機器視覺,嵌入式視覺系統(tǒng)已在一系列應用中得到使用。不論何種應用,嵌入式視覺系統(tǒng)都具備一些共同之處,總體來講它們可以分為下列三大類:
設備接口 — 提供到所選成像設備的接口。根據選擇的設備類型,提供所需的時鐘、偏置和配置數據。這樣還可以從設備接收圖像數據,根據需要進行解碼和格式化,以供圖像處理鏈做進一步處理。
圖像處理鏈 — 通過設備接口接收圖像數據并進行彩色濾波器陣列內插和色域轉換(即從彩色轉換到灰度)等操作。這部分仍處于我們對接收到的圖像使用大量算法的圖像處理鏈內。這些可以是降噪或邊緣增強等簡單算法,也可以是對象識別或光流等復雜得多的算法。常見情況是在圖像處理鏈的上游部分調用算法實現方案。當然圖像處理鏈上游的實現復雜性取決于要實現的應用。而輸出格式化部分(即將處理后的圖像數據轉換為正確格式,以輸出到顯示器或是通過通信接口輸出)被稱為下游部分。
系統(tǒng)監(jiān)視與控制 – 這是一項獨立于設備接口和圖像處理鏈的類別,它從兩個方面提供系統(tǒng)監(jiān)視和控制。第一個位于設備內部,它提供:
圖像處理鏈的配置
圖像分析功能
在算法執(zhí)行過程中根據要求更新圖像處理鏈
第二個是更廣泛的嵌入式視覺系統(tǒng)的控制與管理,它提供:
電源管理和圖像設備上電排序
執(zhí)行自檢及其他系統(tǒng)管理功能
網絡支持通信或點對點通信
在首次成像操作前通過 I2C 或 SPI 配置圖像設備
部分應用允許系統(tǒng)監(jiān)視功能訪問幀存儲器并在其中的幀上執(zhí)行算法。在這種情況下系統(tǒng)監(jiān)視能夠構成圖像處理鏈的一部分。
這三大類別因為每個階段內在的難點不同,需要不同的實現方法。設備接口和圖像處理鏈都要求有能力處理帶寬高數據,從而在內部實現圖像處理鏈,在外部從系統(tǒng)傳輸圖像數據。而系統(tǒng)監(jiān)視與控制要求能夠處理和響應通過通信接口接收到的命令并為外部通信提供支持。如果系統(tǒng)監(jiān)視也要構成圖像處理鏈的組成部分,就需要一個高性能處理器。
照此,傳統(tǒng)嵌入式視覺系統(tǒng)采用FPGA/處理器組合來實現,也有越來越多地使用將高性能處理器與FPGA相結合的片上系統(tǒng)來實現。在我們演示上述幾個方面如何結合在一起之前,我們先來了解一下這三個類別中每一個的不同難點。
設備接口
傳感器接口由應用所選擇的設備決定,大多數嵌入式視覺應用使用 CMOS 圖像傳感器 (CIS)。一般情況下這些傳感器使用 CMOS 并行輸出總線,用控制信號提示行和幀的有效順序,或者使用速率更高的串行通信,實現較簡單的系統(tǒng)接口,但會導致 FPGA 實現方案略顯復雜。與并行總線相比,這些串行數據流能通過更少數量的通道傳輸圖像,因為它們以快得多的數據速率運行,因此相比并行接口而言,能讓成像器支持更高的幀速率。為實現同步,常見的做法是讓包含圖像及其它數據字的數據通道與包含用于定義數據通道上的內容的代碼字的同步通道相結合。與數據通道和同步通道結合的還有一個時鐘通道,因為該接口采用源同步。這些高速串行通道一般實現為 LVDS 或微擺幅差分信號 (Reduced Swing LVDS),以降低系統(tǒng)噪聲和功耗。
不論輸出圖像格式如何,通常是 CIS 設備在獲取任何圖像之前需要由嵌入式視覺系統(tǒng)加以配置。這是由 CIS 設備的多功能性造成的。這種多功能性在提供強大的片上處理功能的同時,也需要在輸出圖像前使用正確的設置進行配置。這些接口對帶寬的要求沒有圖像傳輸要求的那么高,因此常常使用 I2C 或 SPI 接口標準。
因為所需的圖像數據帶寬較高,經常把該接口實現在 FPGA 中,這樣更便于與圖像處理鏈集成。該 CIS 設備的配置接口一般使用 I2C 或 SPI,它們既可以用 FPGA 實現,也可以用支持這種接口的系統(tǒng)監(jiān)視與控制處理器實現。
圖像處理鏈
圖像處理鏈由上下游元件和接口組成,像素數據通過設備接口輸出。但是接收到的像素的格式可能不能用于正確顯示圖像。我們可能需要進行圖像校正,尤其是在使用彩色成像器的情況下。 為維持所需數據率下的吞吐量,圖像處理鏈常實現在 FPGA 中,以發(fā)揮其并行優(yōu)勢。這樣可以生成圖像處理流水線,使得處理鏈的每一步都將并行實現,從而獲得更高的幀速率。但是對部分應用我們必須考慮時延,尤其是對高級駕駛員輔助系統(tǒng) (ADAS) 這樣的系統(tǒng)而言。為有效建立圖像處理鏈,我們需要使用通用互聯協(xié)議作為圖像處理內核的基礎,從而方便處理 IP 的互聯。這樣可以帶來兩重好處:一是可以重復使用的庫;二是由于每個 IP 核旨在根據定義的標準接收和發(fā)送數據,從而方便流水線的建立。這里有多種常用的協(xié)議可供選用,其中最常見的是 AXI,因其具有同時支持內存映射接口和流接口的靈活性。
圖像處理鏈內的典型處理階段包括:
彩色濾波器陣列 – 在CIS設備上用貝爾 (Bayer) 濾色片生成每個像素的彩色
色域轉換 – 從RGB轉換為YUV
色度重采樣 – 將 YUV 像素轉換為更高效的像素編碼
應用圖像校正算法,比如色彩校正或伽馬校正,或是進行圖像增強或降噪
在下游側我們可以配置視頻輸出時序,然后在輸出到指定的目標前轉換回本機并行輸出視頻格式
部分系統(tǒng)也使用外部內存,例如DDR 的內存作為幀存儲,在 SoC 內部 DDR 內存也往往提供給 SoC 的處理器側。共享內存空間的能力讓系統(tǒng)監(jiān)視側能通過千兆位以太網或 USB 傳輸數據,或成為圖像處理鏈的延伸。
系統(tǒng)監(jiān)視
傳統(tǒng)上該功能實現在處理器內部,能夠處理相關命令,以按應用需求對圖像處理鏈進行配置。為接收和處理命令,系統(tǒng)監(jiān)視功能必須能夠支持從簡單的 RS232、千兆位以太網、USB、PCIe 到 CAN 汽車專用接口等一系列不同的通信接口。
只要嵌入式視覺系統(tǒng)的架構能夠支持,我們就能使用處理器來生成圖像疊加信息,可供疊加在輸出圖像上。在能夠訪問圖像數據的條件下,我們也能夠使用處理器對圖像開展進一步處理,或是收集統(tǒng)計數據(像素值分布柱狀圖等)。這樣系統(tǒng)監(jiān)視就成為圖像處理鏈的一部分,讓開發(fā)人員能利用各種開源圖像處理庫,如OpenCV、OpenCL 和 OpenVX。
EVK使用實例
在闡明嵌入式視覺系統(tǒng)的基本元素后,下文將示范這些概念,展現如何綜合運用它們創(chuàng)建出可工作的系統(tǒng)。該實例將展示我們如何使用安富利 MicroZed 嵌入式視覺套件 (EVK)創(chuàng)建嵌入式視覺系統(tǒng)。
該套件使用安森美 Python 1300C 成像設備和賽靈思 Zynq 7020。 Python 1300C 是一個 1280 像素&TImes;1024行的色彩圖像傳感器,通過 SPI 接口配置。此型號傳感器使用串行輸出實現高幀率,同時EVK 支持通過 HDMI 接口輸出圖像到顯示器。
Zynq 7020 為嵌入式視覺系統(tǒng)的實現提供了一個極好的平臺,因為我們能使用 FPGA 架構中的可編程邏輯 (PL) 實現該設備的接口和圖像處理鏈。而 FPGA 架構中的 ARM A9雙核處理器(即處理系統(tǒng) (PS))可用于根據我們的需要實現系統(tǒng)監(jiān)視功能和圖像處理鏈延伸。
為開發(fā)該應用,我們將用到兩個 SoC 開發(fā)工具。一個是賽靈思 Vivado 2015.4,另一個是賽靈思SDK 2015.4。在 Vivado 中我們將實現設備的接口、圖像處理鏈,在 Zynq 內配置 PS,建立 PS 到 PL 存儲器映射以完成下列操作:
根據圖像大小和幀速率所要求的參數以及所需操作在圖像處理鏈內配置 IP。為此我們將在 PS和 PL 間使用通用 AXI 互聯,以 PS 為主設備。使用該接口我們能在 PS 和 PL 間實現 高達 1,200Mbps 的傳輸速率。
如有必要,將處理器的 DDR 內存置于圖像處理鏈中,以便處理器訪問。為此我們將在 PL 和 PS 間使用高性能 AXI 互聯,以 PL 為主設備。使用該接口我們能在 PL 和 PS DDR 內存間實現高達 2,400Mbps 的傳輸速率。
該演示將使用 HDMI 展示如何將圖像輸出到顯示器上。相當有用的是,EVK 制造商安富利為Python 1300C 提供了一個設備接口 IP 模塊,并為在 EVK 上接口輸出到 HDMI 設備提供了一個 HDMI 輸出 IP 模塊。我們將本實例中使用所有這些模塊。在 Vivado 中我們可以使用 IPXact 格式把這些 IP 模塊添加到 Vivado IP 目錄中。
圖像處理鏈將與安森美設備接口并執(zhí)行下列處理階段,除了 Python 1300C 和 HDMI IP 核,所有使用的 IP 核均來自 Vivado 中的標準賽靈思圖像處理 IP 庫(實際 IP 核的名稱在下面顯示):
圖1:圖像處理流程
將來自 Python 接口 IP 的并行視頻和水平及垂直同步轉換為 AXIS Stream,以便我們能夠將其與后續(xù)的圖像處理IP核接口。 視頻輸入到 AXIS (Video in to AXIS)
彩色濾波器陣列使用貝爾濾色片為每個輸出像素賦予一個 RGB 值(僅以 R、G 或 B 表示)。彩色濾波器陣列插值 (Color Filter Array interpolaTIon)
RGB 到 YUV色域轉換,將 RGB 色域轉換為 HDMI 驅動器優(yōu)選的 YUV 色域輸出格式。RGB 到 YCRCB色域轉換器 (RGB to YCRCB Color-Space Convertor)
將 YUV 從 4:4:4 格式重新縮放為 4:2:2 格式。 色度重采樣 (Chroma Resampler)
配置視頻 DMA 以傳輸圖像幀到 PS DDR。 AXI VDMA
配置同一視頻 DMA,以從 PS DDR 讀取圖像幀。 AXI VDMA
將 AXI Stream 轉換回并行格式。 AXIS 到視頻輸出
為輸出視頻時序提供時序參考生成器。 視頻時序控制器
除了確保系統(tǒng)正常運行,我們還需要兩個 AXI 互聯。一個是高性能 AXI 互聯,另一個是通用AXI 互聯,以及每個時鐘域所需的復位模塊。
圖像處理應用需要一系列的時鐘域,大部分時鐘域我們可以使用 Zynq 內部的 PS 提供給 PL的時鐘。就該應用而言,我們需要下列時鐘:
108 MHz – 這是以 1280x1024 分辨率和 60 Hz幀速率輸出圖像所需的像素時鐘速率。
75 MHz – 用于存儲器映射的 AXI 和 AXI Lite 接口。
150 MHz – 用于圖像處理鏈,也稱為AXI Streaming時鐘。AXI Stream 時鐘的速率必須至少與像素速率相同。但是我們必須考慮處理鏈中的所有 IP 核的吞吐量。雖然大多數模塊能夠每時鐘周期處理一個像素,留出部分裕度并減少所需的緩存是明智的做法。
200 MHz – 提供給 Python 1300C CIS 設備作為基準。
為實現像素時鐘,我們需要使用時鐘向導來生成該 108MHz 像素時鐘,因為該時鐘需要極為準確的設置。雖然在用 PL 架構時鐘設置時,75MHz和150MHz時鐘允許部分容差,但 200MHz時鐘也要求精確。與 108MHz 時鐘不同的是該時鐘可由 PL 架構時鐘精確生成。
所使用的 IP 模塊的時鐘結構如下表所示:
在 Vivavdo 方框圖編輯器中的整個實現方案如下面兩個圖所示。這兩個圖分別顯示的是圖像處理鏈的上游和下游。您還能夠看到使用通用 AXI 互聯和高性能 AXI 互聯實現的 ARM 內核處理器的互聯情況。
圖2:EVK實例設計 — 突出顯示的是上游圖像處理鏈
圖3:EVK實例設計 — 突出顯示的是下游圖像處理鏈
一旦我們完成設計驗證,并為AXI外設分配地址(可自動完成)后,我們就能在 Vivado 2015.4 中構建硬件并將其導入到 SDK 2015.4 軟件開發(fā)環(huán)境中。我們需要在該環(huán)境中編寫一些簡單軟件,讓系統(tǒng)啟動并運行。
在 SDK 內部,我們不僅需要在 Zynq 內配置設計,還需要在使用設計之前在 EVK 上配置部分元素。記住在本實例中 PS 起著系統(tǒng)監(jiān)視和控制功能,因此必須對整個嵌入式視覺系統(tǒng)進行配置,而不僅僅是在 Zynq 中配置 Vivado 設計。
我們需要開發(fā)用于配置下列內容的軟件:
使用SPI 接口的 Python 1300C 攝像頭
AXI Python 1300C 接口模塊
AXI VDMA,從 DDR 內存讀取和向 DDR 內存寫入幀
AXI 彩色濾波器陣列
用于 AD7511 的 HDMI 輸出設備。該設備使用 I2C 進行配置
I2C 多路復用器及其連接的相關外設
用于控制 Python 1300C 設備電源軌的 I2C IO 擴展器
該 EVK 使用 Zynq PS I2C 控制器對 HDMI 輸出設備進行配置,來對 Python 設備供電。安富利還向我們提供了能用來控制 I2C 并進行如下配置的 API:
ADV7511 – 用于 HDMI 輸出的 API
CAT9554 – 用于位于攝像頭模塊上的 I2C I/O 擴展器的 API
TCA9548 – 用于位于 EVCC 上的 I2C 多路復用器的 API
PCA9534 – 用于位于 EVCC 上的 I2C IO 擴展器的 API
OnSemi_Python_SW – 用于 Python 1300C 的 API
XAXIVDMA_EXT – 用于配置 VDMA 的 API
XIICPS_EXT – 用于驅動外部 I2C 的 API
我們所需做的就是將這些 API 與賽靈思軟件 API 耦合,用于圖像處理鏈中的 IP,這樣我們就能快速創(chuàng)建軟件可執(zhí)行文件。要創(chuàng)建軟件應用,我們需要將硬件設計導入到 SDK 中,為硬件創(chuàng)建板級支持包 (BSP)。該 BSP 內置所有所需的賽靈思 API,在與安富利的 API 耦合后,就能夠驅動圖像處理鏈中的硬件和 Zynq。
軟件本身需要執(zhí)行下列步驟:
初始化所有的 AXI 外設
為圖像傳感器軌加電
對安森美 Python 1300C、彩色濾波器陣列和 VDMA 進行配置
完成這些步驟后,當軟件運行在 EVK 上您將看到圖像正被輸出到您所選定的 HDMI 監(jiān)控器上,如下圖所示。
圖4:使用演示系統(tǒng)抓取的居民區(qū)場景的一幀圖像
結論
在本文中我們介紹了嵌入式視覺系統(tǒng)的高級元素;如何簡便快捷地使用軟件 API 和 IP 庫構建嵌入式視覺系統(tǒng),如何把算法開發(fā)的增值部分添加到圖像處理鏈中。
評論