張秀清,趙世祺,王曉君
(河北科技大學(xué) 信息科學(xué)與工程學(xué)院,河北石家莊,050000)
可見光成像技術(shù)能夠?qū)鼍暗牟煌庹諒?qiáng)度映射成相應(yīng)的圖像灰度,獲取的圖像包含了豐富的場景形貌信息,因此被廣泛應(yīng)用于關(guān)鍵參數(shù)檢測[1]、目標(biāo)識別與分類[2]、設(shè)備狀態(tài)監(jiān)控[3]和公共安防監(jiān)視[4]等領(lǐng)域[5]??梢姽獬上窦夹g(shù)離不開自動曝光算法,自動曝光算法用于在相機(jī)景物亮度發(fā)生變換時(shí)實(shí)時(shí)調(diào)整相機(jī)曝光時(shí)間,使圖像亮度值保持在一個(gè)合適的范圍內(nèi)[6]。當(dāng)前的自動曝光技術(shù)主要基于測光系統(tǒng),通過感光元件(如光電二極管)對光線進(jìn)行測量,并根據(jù)預(yù)設(shè)的曝光模式(如中央重點(diǎn)測光、點(diǎn)測光、評價(jià)測光等)來調(diào)整曝光參數(shù)。這種技術(shù)相對簡單易用,廣泛應(yīng)用于各類相機(jī)設(shè)備中。然而,現(xiàn)有的自動曝光技術(shù)仍然存在一些問題,由于光線條件的復(fù)雜多變性,自動曝光系統(tǒng)往往難以準(zhǔn)確判斷正確的曝光值,導(dǎo)致過度曝光或欠曝光的情況。對此,本文提出了一種基于FPGA 的自動曝光算法與設(shè)計(jì)。
如圖1 所示,系統(tǒng)由三個(gè)模塊組成,分別為圖像接收模塊、圖像緩存模塊和自動曝光模塊。其中,圖像接收模塊負(fù)責(zé)接收從傳感器傳來的圖像數(shù)據(jù),并在內(nèi)部對圖像數(shù)據(jù)進(jìn)行處理,包括數(shù)據(jù)對齊、數(shù)據(jù)采集、串并轉(zhuǎn)換等,最終輸出并行的圖像數(shù)據(jù)以及后續(xù)傳輸,并轉(zhuǎn)換了寫和讀的時(shí)鐘域,最終給出以讀取地址起始的連續(xù)的4 個(gè)圖像數(shù)據(jù)和讀時(shí)鐘域下的幀起始等信號;自動曝光模塊首先根據(jù)行間隔緩存一行圖像數(shù)據(jù),然后根據(jù)設(shè)置的起始列和列間隔進(jìn)行像元抽樣,輸出抽樣的采樣點(diǎn)數(shù)據(jù)和抽樣數(shù)量,并依此計(jì)算出當(dāng)前的圖像灰度均值,連續(xù)進(jìn)行采樣時(shí)需要的幀起始等信號;圖像緩存模塊中利用兩組雙口SRAM 進(jìn)行乒乓緩存的處理,以確保圖像灰度均值連續(xù)與目標(biāo)灰度閾值進(jìn)行比較,不斷調(diào)整曝光時(shí)間,最終將曝光時(shí)間輸出給傳感器。
圖1 整體框圖
模塊采用Xilinx 公司ZYNQ 系列的FPGA 芯片作為核心芯片,通過對傳感器輸出的圖像數(shù)據(jù)信號進(jìn)行邏輯處理和時(shí)序調(diào)整,計(jì)算曝光時(shí)間,完成了自動曝光功能。根據(jù)模塊功能需求分為圖像接收模塊、圖像緩存模塊和自動曝光模塊三部分。
圖像接收模塊分為三個(gè)部分,分別為數(shù)據(jù)采樣模塊、串并轉(zhuǎn)換模塊和標(biāo)志生成模塊。其結(jié)構(gòu)框圖如圖2 所示。
圖2 圖像接收模塊結(jié)構(gòu)框圖
2.1.1 數(shù)據(jù)采樣模塊
數(shù)據(jù)采樣模塊負(fù)責(zé)接收傳感器發(fā)送來的圖像數(shù)據(jù)pic_data,并對數(shù)據(jù)進(jìn)行延時(shí)以及采樣,此采樣為DDR 采樣,輸出pic_sam_data_0 為上升沿采集的數(shù)據(jù),輸出pic_sam_data_1 為下降沿采集的數(shù)據(jù)。由于9 位采樣數(shù)據(jù)為串行輸出,所以對應(yīng)連接9 組串并轉(zhuǎn)換模塊。
2.1.2 串并轉(zhuǎn)換模塊
每組串并轉(zhuǎn)換模塊負(fù)責(zé)接收數(shù)據(jù)采樣模塊發(fā)送來的兩組數(shù)據(jù),并對數(shù)據(jù)進(jìn)行串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)的處理,最終輸出12 位的data_out 并行數(shù)據(jù)。
2.1.3 標(biāo)志生成模塊
標(biāo)志生成模塊負(fù)責(zé)接收格式整理模塊發(fā)送來的9 組圖像數(shù)據(jù),在其中經(jīng)過一系列處理之后輸出圖像數(shù)據(jù)和一系列標(biāo)志位發(fā)送給圖像緩存模塊。具體實(shí)現(xiàn)方式如下:輸入的9組圖像數(shù)據(jù)中,前8 組為圖像數(shù)據(jù)通道、第9 組為控制數(shù)據(jù)通道。對應(yīng)數(shù)據(jù)采樣模塊的9 位圖像數(shù)據(jù)輸入,前8 位為圖像數(shù)據(jù)通道,第9 位為控制數(shù)據(jù)通道。
根據(jù)控制通道低3 位的變化,可以得到幀起始標(biāo)志s_fs、像素點(diǎn)完成標(biāo)志s_pd、行完成標(biāo)志s_ld、幀完成標(biāo)志s_fd、行計(jì)數(shù)標(biāo)志s_lowc、列計(jì)數(shù)標(biāo)志s_colc,圖像數(shù)據(jù)經(jīng)過延時(shí)與標(biāo)志數(shù)據(jù)同時(shí)輸出。其中,幀起始標(biāo)志s_fs、行完成標(biāo)志s_ld 和幀完成標(biāo)志s_fd 均為脈沖信號。
當(dāng)檢測到控制通道低3 位為“111”時(shí),產(chǎn)生幀起始標(biāo)志s_fs;當(dāng)控制通道低3 位為“111”時(shí),持續(xù)輸出像素點(diǎn)完成標(biāo)志s_pd 和并行圖像數(shù)據(jù)pic_data,同時(shí)累加并輸出列計(jì)數(shù)s_colc。當(dāng)列計(jì)數(shù)s_colc 達(dá)到一行的像素?cái)?shù)量并且檢測到控制通道低3 位由“111”變?yōu)椤?00”時(shí),產(chǎn)生行完成標(biāo)志s_ld,列計(jì)數(shù)清零,同時(shí)累加并輸出行計(jì)數(shù)s_lowc。
圖像緩存模塊負(fù)責(zé)接收圖像接收模塊發(fā)送過來的8 組圖像數(shù)據(jù)和標(biāo)志位,以行為單位,采用乒乓的方式對接收的圖像進(jìn)行緩存,首先將一行的圖像數(shù)據(jù)存入乒緩存中,緩存完成后將下一行圖像數(shù)據(jù)存入乓緩存中,同時(shí)將乒緩存中的圖像數(shù)據(jù)讀出后發(fā)給自動曝光模塊;當(dāng)乓緩存完成后,將下一行圖像數(shù)據(jù)存入乒緩存中,同時(shí)將乓緩存中的圖像數(shù)據(jù)讀出后發(fā)給自動曝光模塊。圖像緩存模塊框圖如圖3 所示。
圖3 圖像緩存模塊結(jié)構(gòu)框圖
2.2.1 乒乓緩存
乒乓操作是一種用于數(shù)據(jù)流控制的處理技巧。典型的乒乓操作方法如圖4 所示[7]。數(shù)據(jù)緩存模塊可以為任何存儲模塊,在本文中使用的是雙口SRAM(TPSRAM)。
圖4 乒乓的典型操作框圖
2.2.2 實(shí)現(xiàn)方法
在測度基本公共服務(wù)水平的前提下,進(jìn)一步計(jì)算出不均等程度的指標(biāo)。對于各個(gè)省份和直轄市,同樣也建立基本公共服務(wù)水平測度指標(biāo),如表2所示。
圖像緩存模塊采用兩個(gè)緩存塊進(jìn)行乒乓操作,分別稱為TPSRAM-1 和TPSRAM-2,每個(gè)緩存塊包含2 個(gè)雙口SRAM共同進(jìn)行讀寫操作,每個(gè)雙口SRAM 緩存4 組圖像數(shù)據(jù),所以每個(gè)緩存塊可以緩存進(jìn)輸入的8 組圖像數(shù)據(jù)。
當(dāng)輸入像素點(diǎn)完成標(biāo)志W(wǎng)_s_pd 為“1”時(shí),累加寫入數(shù)據(jù)標(biāo)志。當(dāng)輸入行完成標(biāo)志W(wǎng)_s_ld 為“1”時(shí),如果緩存的數(shù)據(jù)開始且是需要緩存的行,則緩存完成4 個(gè)數(shù)據(jù),開始一次寫入,將列計(jì)數(shù)的高位作為寫入地址,并將該行標(biāo)為緩存行,同時(shí)切換寫入緩存塊,并且更新當(dāng)前需要緩存的行,即加上預(yù)設(shè)行間隔,將行完成標(biāo)志取反。檢測行完成標(biāo)志信號的電平變化,一旦出現(xiàn)變化則將輸出行完成標(biāo)志R_s_ld 置為“1”,并切換讀取緩存塊。同時(shí),讀取列地址R_addr 的最高位用于切換同一個(gè)緩存塊中的2 個(gè)雙口SRAM。R_en 用作緩存塊的讀使能。以此實(shí)現(xiàn)圖像緩存和讀取的乒乓操作,能夠使圖像數(shù)據(jù)不間斷進(jìn)行傳輸。
自動曝光模塊分為兩個(gè)部分,分別為像素采樣模塊和曝光時(shí)間計(jì)算模塊。其結(jié)構(gòu)框圖如圖5 所示。
圖5 自動曝光模塊結(jié)構(gòu)框圖
2.3.1 采樣模塊
自動曝光算法最重要的判據(jù)就是目標(biāo)景物的圖像亮度均值[8]。像素采樣模塊負(fù)責(zé)對抽樣緩存的每一行圖像數(shù)據(jù)按照設(shè)置好的起始列和列間隔進(jìn)行像素采樣,直至一幀圖像結(jié)束,輸出采樣的像素?cái)?shù)據(jù)和像素計(jì)數(shù)給曝光時(shí)間計(jì)算模塊。具體實(shí)現(xiàn)方式如下:如果圖像行完成標(biāo)志s_lowd 有效,表明一行的緩存完成,則啟動一行的讀取,并置讀使能R_en為高電平,讀取列地址R_addr 清零,而后每讀取一組并行圖像數(shù)據(jù),讀取列地址R_addr 加一,直至此行的全部列讀完,啟動下一行的讀取。而后可以開始處理符合要求的一行圖像數(shù)據(jù),如果行計(jì)數(shù)s_lowc 等于設(shè)定好的起始行,則開始進(jìn)行采樣,根據(jù)設(shè)定好的起始列和列間隔對像素?cái)?shù)據(jù)進(jìn)行抽樣,輸出給采樣數(shù)據(jù)sam_data,同時(shí)每輸出一個(gè)數(shù)據(jù),采樣計(jì)數(shù)sam_cnt 加一,像素采樣完成信號pix_done 起一個(gè)脈沖。而后根據(jù)設(shè)定好的行間隔依次對每一行圖像數(shù)據(jù)進(jìn)行采樣輸出,最終一幀圖像全部采樣完成時(shí),采樣完成信號sam_done 起一個(gè)脈沖。
2.3.2 曝光時(shí)間計(jì)算模塊
曝光時(shí)間計(jì)算模塊負(fù)責(zé)根據(jù)采樣模塊發(fā)送過來的采樣數(shù)據(jù)和采樣計(jì)數(shù)計(jì)算出當(dāng)前圖像的圖像灰度均值gray_average,并據(jù)此計(jì)算出自動曝光時(shí)間輸出給傳感器。具體實(shí)現(xiàn)方式如圖6 所示。
圖6 曝光時(shí)間計(jì)算模塊流程圖
其中,計(jì)算圖像灰度均值公式為:
式(1)中:M為圖像灰度均值gray_average;D為采樣數(shù)據(jù)sam_data;n為采樣計(jì)數(shù)sam_cnt。當(dāng)計(jì)算出來的圖像灰度均值處于提前設(shè)定好的最小值和最大值之間時(shí)即可輸出自動曝光時(shí)間,此次自動曝光成功。如果計(jì)算出來的圖像灰度均值偏大或者偏小則需進(jìn)一步調(diào)整曝光時(shí)間。
計(jì)算曝光時(shí)間的公式為:
式(2)中:cT為計(jì)算所得曝光時(shí)間;T為當(dāng)前曝光時(shí)間;G為目標(biāo)圖像灰度均值;Mc為計(jì)算所得圖像灰度均值;M為圖像灰度均值。其中Mc為M將最高位替換為0 的結(jié)果。
每調(diào)整一次曝光時(shí)間,曝光計(jì)數(shù)exposure_cnt 加1,如 果exposure_cnt計(jì)數(shù)到10 依然沒有曝光成功,則輸出自動曝光失??;如果exposure_cnt 計(jì)數(shù)尚未到10 但是計(jì)算所得曝光時(shí)間 已經(jīng)達(dá)到了預(yù)設(shè)的最大值,則輸出自動曝光失敗。若曝光成功則輸出自動曝光開始信號auto_exp_start 再開始一次曝光,同時(shí)更新自動曝光時(shí)間信號auto_exp_time 為當(dāng)前的曝光時(shí)間 。曝光結(jié)束之后置auto_exp_done 為“1”。當(dāng)正在自動曝光時(shí),自動曝光狀態(tài)auto_exp_status 輸出X“11”;當(dāng)自動曝光成功時(shí),自動曝光狀態(tài)auto_exp_status 輸出X“22”;當(dāng)自動曝光失敗時(shí),自動曝光狀態(tài)auto_exp_status 輸出X“FB”。
ModelSim 是由Mentor Graphics 公司開發(fā)的一種集成開發(fā)環(huán)境(IDE),專門用于數(shù)字和混合信號系統(tǒng)的硬件設(shè)計(jì)仿真和驗(yàn)證。它基于Event-driven 模擬技術(shù),使用硬件描述語言(如VHDL 和Verilog)來描述和模擬電路行為。使用Xilinx 的集成開發(fā)環(huán)境Vivado 2019.1 聯(lián)合ModelSim進(jìn)行邏輯功能實(shí)現(xiàn)以及相應(yīng)的仿真測試。本次模塊設(shè)計(jì)采用層次化設(shè)計(jì)思想,將復(fù)雜的設(shè)計(jì)簡化為模塊化設(shè)計(jì)。由于FPGA 的縱隔實(shí)現(xiàn)周期較長,設(shè)計(jì)使用Testbench 模型提供系統(tǒng)激勵(lì)來進(jìn)行功能仿真測試。
使用自定義的傳感器作為數(shù)據(jù)源,接收自動曝光模塊發(fā)來的輸出8 位圖像數(shù)據(jù)和1 位控制數(shù)據(jù)共9 位,發(fā)送給圖像接收模塊。根據(jù)不同的原始圖像數(shù)據(jù),對回路中各個(gè)模塊進(jìn)行仿真實(shí)驗(yàn)。系統(tǒng)時(shí)鐘設(shè)置為40MHz,Testbench 例化自定義傳感器給入圖像數(shù)據(jù)流。
圖7 為圖像緩存模塊的仿真圖,兩個(gè)緩存塊讀寫數(shù)據(jù)交替進(jìn)行,實(shí)現(xiàn)了乒乓操作,圖像數(shù)據(jù)可以連續(xù)不間斷進(jìn)行傳輸。
圖7 圖像緩存模塊仿真結(jié)果
如圖8 所示,當(dāng)輸入正常的圖像數(shù)據(jù)時(shí),最終自動曝光成功,置自動曝光完成信號auto_exp_done 為“1”,自動曝光狀態(tài)由X“11”變?yōu)閄“22”,輸出自動曝光開始信號auto_exp_start,并輸出自動曝光時(shí)間auto_exp_time;如圖9 所示,當(dāng)輸入全黑的圖像數(shù)據(jù)時(shí),在曝光計(jì)數(shù)exp_cnt 達(dá)到10 次后,自動曝光失敗,置自動曝光完成信號auto_exp_done 為“1”,自動曝光狀態(tài)由X“11”變?yōu)閄“FB”。
圖8 自動曝光成功
圖9 自動曝光失敗
由圖8、圖9 可以看出,兩種情況自動曝光成功和自動曝光失敗輸出的信號時(shí)序完全正確,由輸入的圖像數(shù)據(jù)可以實(shí)現(xiàn)對自動曝光的控制,可充分驗(yàn)證本算法的正確性。
本模塊設(shè)計(jì)在基于FPGA 的環(huán)境下,采用VHDL 和Verilog 硬件描述語言進(jìn)行編程設(shè)計(jì)。對此種自動曝光的算法設(shè)計(jì)進(jìn)行了詳細(xì)介紹,將圖像灰度采樣、乒乓緩存等運(yùn)用到系統(tǒng)中,給出模塊設(shè)計(jì)方案。對模塊功能進(jìn)行仿真驗(yàn)證,實(shí)現(xiàn)了一種基于FPGA 的自動曝光算法設(shè)計(jì),具有很實(shí)用的參考和工程價(jià)值。