搭建一種低成本的嵌入式視覺(jué)系統(tǒng),系統(tǒng)由CMOS圖像傳感器,、CPLD,、ARM7微處理器以及SRAM構(gòu)成。其中,,CPLD識(shí)別時(shí)序,,解決了圖像采集系統(tǒng)存在的嚴(yán)格時(shí)序同步和雙CPU共享一片SRAM的總線(xiàn)競(jìng)爭(zhēng)問(wèn)題;用Verilog語(yǔ)言編寫(xiě)Mealy狀態(tài)機(jī)控制圖像數(shù)據(jù)寫(xiě)入SRAM,,多路數(shù)據(jù)選擇器實(shí)現(xiàn)總線(xiàn)切換,,避免了總線(xiàn)沖突。圖像處理算法注重效率,基于ARM實(shí)現(xiàn),,系統(tǒng)最終工作速率為25幀/s,。
目前,關(guān)于視覺(jué)系統(tǒng)的研究已經(jīng)成為熱點(diǎn),,也有開(kāi)發(fā)出的系統(tǒng)可供參考,。但這些系統(tǒng)大多是基于PC機(jī)的,由于算法和硬件結(jié)構(gòu)的復(fù)雜性而使其在小型嵌入式系統(tǒng)中的應(yīng)用受到了限制,。上述系統(tǒng)將圖像數(shù)據(jù)采集后,,視覺(jué)處理算法是在PC機(jī)上實(shí)現(xiàn)的。隨著嵌入式微處理器技術(shù)的進(jìn)步,,32位ARM處理器系統(tǒng)擁有很高的運(yùn)算速度和很強(qiáng)的信號(hào)處理能力,,可以作為視覺(jué)系統(tǒng)的處理器,代替PC機(jī)來(lái)實(shí)現(xiàn)簡(jiǎn)單的視覺(jué)處理算法,。下面介紹一種基于ARM和CPLD的嵌入式視覺(jué)系統(tǒng),,希望能分享嵌入式視覺(jué)開(kāi)發(fā)過(guò)程中的一些經(jīng)驗(yàn)。
1 系統(tǒng)方案與原理
在嵌入式視覺(jué)的設(shè)計(jì)中,,目前主流的有以下2種方案:
方案1 圖像傳感器+微處理器(ARM或DSP)+SRAM
方案2 圖像傳感器+CPLD/FPGA+微處理器+SRAM
方案1系統(tǒng)結(jié)構(gòu)緊湊,,功耗低。在圖像采集時(shí),,圖像傳感器輸出的同步時(shí)序信號(hào)的識(shí)別需要借助ARM的中斷,,而中斷處理時(shí),微處理器需要完成程序跳轉(zhuǎn),、保存上下文等工作[1],,降低了圖像采集的速度,適合對(duì)采集速度要求不高,、功耗低的場(chǎng)合,。
方案2借助CPLD來(lái)識(shí)別圖像傳感器的同步時(shí)序信號(hào),不必經(jīng)過(guò)微處理器的中斷,,因而系統(tǒng)的采集速度提高,,但CPLD的介入會(huì)使系統(tǒng)的功耗提高。
為了綜合以上2種方案的優(yōu)勢(shì),,在硬件上采用“ARM+CPLD+圖像傳感器+SRAM”,。該方案充分利用了CPLD的可編程性,通過(guò)軟件編程來(lái)兼有方案1的優(yōu)勢(shì),,具體體現(xiàn)在以下方面:
①功耗的高低可以控制,。對(duì)于功耗有嚴(yán)格要求的場(chǎng)合,通過(guò)CPLD的可編程性將時(shí)序部分的接口與ARM的中斷端口相連,,僅僅是組合邏輯的總線(xiàn)相連,,可以降低CPLD的功耗從而達(dá)到方案1的效果,;對(duì)于采集速度要求高而功耗要求不高的情況,可以充分發(fā)揮CPLD的優(yōu)勢(shì),,利用組合與時(shí)序邏輯來(lái)實(shí)現(xiàn)圖像傳感器輸出同步信號(hào)的識(shí)別,,并將圖像數(shù)據(jù)寫(xiě)入SRAM中。
②器件的選擇可以多樣,。在硬件設(shè)計(jì)上,,所有總線(xiàn)均與CPLD相連;在軟件設(shè)計(jì)上,,不同的模塊單獨(dú)按功能封裝,。這樣以CPLD為中心,系統(tǒng)的其他器件均可更換而無(wú)需對(duì)CPLD部分程序進(jìn)行改動(dòng),,有利于系統(tǒng)的功能升級(jí),。
作為本系統(tǒng)的一種應(yīng)用,開(kāi)發(fā)了視覺(jué)跟蹤的程序,,可以在目標(biāo)和背景顏色對(duì)比強(qiáng)烈的情況下對(duì)物體進(jìn)行跟蹤,。通過(guò)對(duì)CMOS攝像頭采集來(lái)的數(shù)據(jù)進(jìn)行實(shí)時(shí)處理,根據(jù)物體的顏色計(jì)算出被追蹤物體的質(zhì)心坐標(biāo),。下面分別描述系統(tǒng)各部分的功能,。
2 系統(tǒng)硬件
2.1 硬件組成及連接
系統(tǒng)的硬件主要有4部分:CMOS圖像傳感器OV6620、可編程器件CPLD,、512 KB的SRAM和32位微處理器LPC2214,。
OV6620是美國(guó)OmniVision公司生產(chǎn)的CMOS圖像傳感器,以其高性能,、低功耗適合應(yīng)用在嵌入式圖像采集系統(tǒng)中,本系統(tǒng)圖像數(shù)據(jù)的輸入都是通過(guò)OV6620采集進(jìn)來(lái)的,;可編程器件CPLD采用Altera公司的EPM7128S,,用Verilog硬件編程語(yǔ)言在QuartusII下編寫(xiě)程序;作為系統(tǒng)的數(shù)據(jù)緩沖,,SRAM選用的是IS61LV5128,,其隨機(jī)訪(fǎng)問(wèn)的特性為圖像處理程序提供了便利;而LPC2214在PLL(鎖相環(huán))的支持下最高可以運(yùn)行在60 MHz的頻率下,,為圖像的快速處理提供了硬件支持,。
OV6620集成在一個(gè)板卡上,有獨(dú)立的17 MHz晶振,。輸出3個(gè)圖像同步的時(shí)序信號(hào):像素時(shí)鐘PCLK,、幀同步VSYNC和行同步HREF。同時(shí),,還可以通過(guò)8位或16位的數(shù)據(jù)總線(xiàn)輸出RGB或YCrCb格式的圖像數(shù)據(jù),。
在硬件設(shè)計(jì)上,,有2個(gè)問(wèn)題需要解決:
①圖像采集的嚴(yán)格時(shí)序同步;
②雙CPU共享SRAM的總線(xiàn)仲裁,。
解決第一個(gè)問(wèn)題的關(guān)鍵在于如何實(shí)時(shí),、準(zhǔn)確地讀取OV6620的時(shí)序輸出信號(hào),據(jù)此將圖像數(shù)據(jù)寫(xiě)入SRAM中,。這里采用的解決方案是用CPLD來(lái)實(shí)現(xiàn)時(shí)序信號(hào)的識(shí)別以及圖像數(shù)據(jù)的寫(xiě)入,。CPLD在硬件上可以識(shí)別信號(hào)的邊沿,速度更快,,通過(guò)Verilog語(yǔ)言編寫(xiě)Mealy狀態(tài)機(jī)來(lái)實(shí)現(xiàn)圖像數(shù)據(jù)的SRAM寫(xiě)入,,更加穩(wěn)定。
對(duì)于雙CPU共享SRAM,,可以通過(guò)合理的連接方式來(lái)解決,。考慮到CPLD的可編程性,,將OV6620的數(shù)據(jù)總線(xiàn),,LPC2214的地址、數(shù)據(jù)總線(xiàn)以及SRAM的總線(xiàn)都連接到CPLD上,。通過(guò)編程來(lái)控制總線(xiàn)之間的連接,,只要在軟件上保證總線(xiàn)的互斥性,即在同一時(shí)刻有且僅有一個(gè)控制器(CPLD或者LPC2214)來(lái)操作SRAM的總線(xiàn),,就可以有效地避免總線(xiàn)沖突,。這樣,硬件上的仲裁就可以通過(guò)軟件來(lái)保證,,該過(guò)程可以通過(guò)在CPLD中編寫(xiě)多路數(shù)據(jù)選擇器來(lái)實(shí)現(xiàn),。
各器件之間的連接關(guān)系如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)框圖
由圖1可見(jiàn),,微處理器的總線(xiàn)接在CPLD上,,在對(duì)功耗有嚴(yán)格要求的場(chǎng)合中,只需要在CPLD中,,將OV6620的同步時(shí)序信號(hào)所對(duì)應(yīng)的引腳與LPC2214連接在CPLD上的中斷引腳相連,,系統(tǒng)就可以轉(zhuǎn)換成方案1的形式。對(duì)CPLD而言,,引腳相連的僅僅是組合邏輯,,降低了功耗。方案1的具體工作過(guò)程可見(jiàn)參考文獻(xiàn)[1],。而對(duì)于采集速度要求較高的場(chǎng)合,,CPLD部分的程序源代碼見(jiàn)本刊網(wǎng)站www.mesnet.com.cn——編者注。下面重點(diǎn)介紹這種情況下的應(yīng)用,。
2.2 工作過(guò)程
系統(tǒng)上電后,,首先由LPC2214通過(guò)I2C總線(xiàn)配置攝像頭的工作狀態(tài),,需要配置的主要有輸出圖像的數(shù)據(jù)格式、速率,、是否白平衡,,以及自動(dòng)增益是否打開(kāi)。配置完成后,,LPC2214發(fā)出圖像采集的信號(hào)給CPLD,,此時(shí)CPLD操作SRAM的總線(xiàn),并通過(guò)對(duì)OV6620輸出時(shí)序的檢測(cè)將圖像數(shù)據(jù)寫(xiě)入SRAM,。當(dāng)然,,寫(xiě)入SRAM需要嚴(yán)格符合SRAM的操作時(shí)序。一幀圖像采集完成后,,CPLD置位標(biāo)志位來(lái)通知LPC2214,,如果LPC2214處于空閑狀態(tài),則通知CPLD將總線(xiàn)使用權(quán)切換至LPC2214,,由LPC2214讀取SRAM中的數(shù)據(jù)并進(jìn)行圖像處理,。同時(shí),發(fā)送信號(hào)給CPLD進(jìn)行數(shù)據(jù)采集,,圖像的采集和處理將并行執(zhí)行,,提高了系統(tǒng)的工作效率。當(dāng)再次采集完一幀數(shù)據(jù)后,,重復(fù)上述過(guò)程,。
2.3 硬件方案的特點(diǎn)
LPC2214負(fù)責(zé)圖像處理,CPLD負(fù)責(zé)圖像數(shù)據(jù)的采集,,很好地實(shí)現(xiàn)了功能上的封裝,。可以看到,,CPLD將與硬件時(shí)序相關(guān)的程序封裝,,與外界的接口僅為標(biāo)志狀態(tài)線(xiàn)以及數(shù)據(jù)采集總線(xiàn),極大地方便了系統(tǒng)的升級(jí)而無(wú)需改動(dòng)圖像采集部分的硬件和軟件,。甚至更換為其他型號(hào)功能更為強(qiáng)大的微處理器,,只要按照上述標(biāo)志狀態(tài)線(xiàn)的約定來(lái)操作,,系統(tǒng)仍然可以正常工作,,增強(qiáng)了系統(tǒng)的兼容性和可移植性。
3 系統(tǒng)軟件
系統(tǒng)軟件主要由ARM微處理器和CPLD兩部分程序構(gòu)成,。ARM部分的代碼使用C語(yǔ)言在ADS1.2環(huán)境下開(kāi)發(fā),,而CPLD部分則使用Verilog硬件語(yǔ)言在QuartusII下開(kāi)發(fā)。
3.1 CPLD部分程序設(shè)計(jì)
CPLD的程序主要分為2部分:組合邏輯和時(shí)序邏輯,。組合邏輯主要完成總線(xiàn)仲裁,,程序并不依賴(lài)CPLD的全局時(shí)鐘,;時(shí)序邏輯完成對(duì)信號(hào)的檢測(cè),根據(jù)SRAM的操作時(shí)序?qū)D像數(shù)據(jù)寫(xiě)入,。
在總線(xiàn)仲裁部分,,需要注意的是: 對(duì)CPLD而言,不同的時(shí)刻同一總線(xiàn)的數(shù)據(jù)流入方向是不同的,。因而在Verilog中,,需要聲明總線(xiàn)為雙向端口。具體的總線(xiàn)仲裁程序如下:
對(duì)雙向端口的總線(xiàn)操作總結(jié)如下:
①需要控制信號(hào)指明端口在某一時(shí)刻的方向,;
②輸出高阻即代表該雙向端口是輸入狀態(tài),,此時(shí)可以作為普通的輸入端口來(lái)使用。
時(shí)序邏輯部分主要完成對(duì)圖像傳感器時(shí)序信號(hào)的識(shí)別,。如圖2所示,,CPLD需要首先檢測(cè)VSYNC的下降沿,接著檢測(cè)HREF信號(hào)的上升沿,,然后在PCLK信號(hào)的上升沿將圖像數(shù)據(jù)讀入,。
圖2 OV6620輸出時(shí)序圖
在Verilog語(yǔ)言中,對(duì)上升沿的檢測(cè)是通過(guò)always語(yǔ)句來(lái)實(shí)現(xiàn)的,。例如檢測(cè)時(shí)鐘信號(hào)cam_pclk的上升沿:always@(posedge cam_pclk),。但從上面的分析中可以看出,需要檢測(cè)的信號(hào)沿有3個(gè),,可以都用always來(lái)檢測(cè),,但在Verilog的語(yǔ)法中always語(yǔ)句是不可以嵌套的。為了解決這個(gè)問(wèn)題,,本系統(tǒng)中采用了如下方式:整個(gè)模塊只有一個(gè)時(shí)序邏輯的always塊,,其他的信號(hào)沿檢測(cè)用與always等價(jià)的方式實(shí)現(xiàn)。例如對(duì)于cam_vsyn信號(hào),,設(shè)置2個(gè)臨時(shí)信號(hào)vsyn_0和vsyn_1,,在每個(gè)時(shí)鐘信號(hào)的上升沿,進(jìn)行如下賦值:
vsyn_1 <= cam_vsyn,;//臨時(shí)信號(hào)賦值
vsyn_0 <= vsyn_1,;
這樣,當(dāng)每個(gè)時(shí)鐘沿到來(lái)時(shí)都會(huì)更新vsyn_0和vsyn_1的值,。當(dāng)vsyn_0的值為0且vsyn_1的值為1時(shí),,認(rèn)為是上升沿到來(lái),同理也可以檢測(cè)下降沿,。需要注意的是:這種方式下,,時(shí)鐘信號(hào)的周期要遠(yuǎn)遠(yuǎn)小于被檢測(cè)信號(hào)的高電平和低電平的持續(xù)時(shí)間。如果信號(hào)脈沖過(guò)窄,,在整個(gè)脈沖期間vsyn_0和vsyn_1的值都沒(méi)有更新,,就會(huì)丟失邊沿的檢測(cè),。
數(shù)據(jù)寫(xiě)入SRAM的過(guò)程是用Mealy狀態(tài)機(jī)來(lái)實(shí)現(xiàn)的,程序具有通用性,。若使用其他型號(hào)的SRAM,,只需要根據(jù)器件的讀寫(xiě)時(shí)序在相應(yīng)的狀態(tài)中修改高低電平。狀態(tài)機(jī)使程序的結(jié)構(gòu)清晰,,調(diào)試方便,。
3.2 ARM部分程序設(shè)計(jì)
目前,基于PC機(jī)的視覺(jué)處理算法有很多,,但在基于微處理器的嵌入式視覺(jué)系統(tǒng)中,,系統(tǒng)在硬件資源和處理速度上都無(wú)法與PC機(jī)相比。特別是在有實(shí)時(shí)性要求的情況下,,需要編寫(xiě)適合嵌入式系統(tǒng)特點(diǎn)的快速有效的算法,。下面編寫(xiě)的算法都是根據(jù)這個(gè)思想來(lái)編寫(xiě)的。
顏色跟蹤:顏色跟蹤的任務(wù)可以分解為顏色標(biāo)定和顏色分割兩個(gè)步驟,。顏色標(biāo)定的任務(wù)是通過(guò)一個(gè)已知的顏色,,找出其在顏色空間內(nèi)與之對(duì)應(yīng)的一個(gè)封閉區(qū)域。顏色分割則是通過(guò)比較器判斷圖像中像素點(diǎn)在顏色空間中是否落在標(biāo)定的空間內(nèi),,若在已標(biāo)定的空間內(nèi),,則認(rèn)為其顏色與已標(biāo)定的顏色一樣,這樣就可以根據(jù)標(biāo)定的封閉區(qū)域識(shí)別出圖像中具有與標(biāo)定顏色相同的物體,。
為了滿(mǎn)足不同情況下應(yīng)用的需求,,顏色跟蹤設(shè)置了2種模式。
(1)幀處理模式
該模式需要用戶(hù)輸入要跟蹤的R,、G,、B三個(gè)顏色邊界,構(gòu)成一個(gè)RGB跟蹤的顏色空間,。然后處理器從圖像的左上角開(kāi)始,,順序逐行逐點(diǎn)的檢查每一個(gè)像素。如果被檢查的像素正好落入用戶(hù)定義的顏色范圍,,就將這個(gè)像素標(biāo)記為跟蹤的,;同時(shí),需要記錄被跟蹤點(diǎn)中的最高點(diǎn),、最低點(diǎn),、最左點(diǎn)和最右點(diǎn)。如果檢測(cè)到的像素位置在當(dāng)前跟蹤區(qū)域的標(biāo)記框外,,則需要增大標(biāo)記框來(lái)包含該像素,;同時(shí),,需要記錄符合要求的像素的數(shù)量,,當(dāng)一幀圖像掃描完成后,,可以分別用符合要求的點(diǎn)的橫縱坐標(biāo)和除以符合要求的像素點(diǎn)數(shù),得出被追蹤物體的中心坐標(biāo)[3],。
這樣在對(duì)一幀圖像的一次掃描后,,就可以得到被跟蹤物體的中心坐標(biāo),同時(shí)處理器只需記錄較少的全局變量,,在時(shí)間復(fù)雜度和空間復(fù)雜度上都適合嵌入式系統(tǒng),。
上述方法中,只有一個(gè)跟蹤點(diǎn)就可以改變標(biāo)記框,,因此如果在跟蹤過(guò)程中出現(xiàn)噪聲點(diǎn),,就會(huì)對(duì)標(biāo)記框產(chǎn)生影響。去噪的思想是:如果一個(gè)像素點(diǎn)周?chē)钠渌c(diǎn)也落在用戶(hù)輸入的RGB范圍內(nèi),,那么這個(gè)點(diǎn)就被認(rèn)為是符合要求的,。
(2)行處理模式
與幀處理模式不同的是,行處理模式在掃描完一行數(shù)據(jù)后就記錄下所在行中符合要求的連續(xù)點(diǎn)的最左端坐標(biāo)和最右端坐標(biāo),,不妨分別記為(XnL,,YnL)和(XnR,YnR),。在一幀圖像處理完成后,,會(huì)得到圖3所示的圖形。
圖3 行處理得到的線(xiàn)形圖
根據(jù)得到的結(jié)果,,可以計(jì)算出更多關(guān)于跟蹤物體的信息:
①計(jì)算區(qū)域面積,。計(jì)算每條線(xiàn)段的長(zhǎng)度l(n),然后將l(n)進(jìn)行累積疊加,,即可獲得跟蹤區(qū)域面積值S,。
②計(jì)算質(zhì)心橫坐標(biāo)。
③計(jì)算質(zhì)心縱坐標(biāo),。
④識(shí)別物體的形狀,。根據(jù)得到的每行跟蹤點(diǎn)的長(zhǎng)度,以及同一行中有幾段符合要求的連續(xù)跟蹤點(diǎn),,可以得知物體從攝像頭角度看到的形狀,。特別是在檢測(cè)平面上線(xiàn)條時(shí),可以識(shí)別是否有分支,,這一點(diǎn)是幀處理模式無(wú)法做到的,。
需要指出的是,行處理模式雖然會(huì)得到關(guān)于跟蹤目標(biāo)的更多信息,,但是每行處理的方式增大了處理器的負(fù)擔(dān),,處理速度也沒(méi)有幀處理快。
4 提高系統(tǒng)的工作速率
目前,系統(tǒng)工作在幀處理模式下的工作速率是25幀/s,,作為系統(tǒng)功能的驗(yàn)證,,這里采用的算法是顏色跟蹤。如果僅做純粹的圖像采集,,而不做圖像處理,,那么系統(tǒng)可以達(dá)到OV6620的最高工作速率,即60幀/s,。而在圖像處理方面,,不同的圖像處理程序效率對(duì)系統(tǒng)的工作頻率有較大的影響。下面給出在通用ARM處理器下提高程序效率的幾個(gè)建議:
①內(nèi)嵌(inline)可通過(guò)刪除子函數(shù)調(diào)用的開(kāi)銷(xiāo)來(lái)提高性能,。如果函數(shù)在別的模塊中不被調(diào)用,,一個(gè)好的建議是用static標(biāo)識(shí)函數(shù);否則,,編譯器將在內(nèi)嵌譯碼里把該函數(shù)編譯成非內(nèi)嵌的,。
②在ARM系統(tǒng)中,函數(shù)調(diào)用過(guò)程中參數(shù)個(gè)數(shù)≤4時(shí),,通過(guò)R0~R3傳遞,;參數(shù)個(gè)數(shù)>4時(shí),通過(guò)壓棧方式傳遞(需要額外的指令和慢速的存儲(chǔ)器操作),。通常限制參數(shù)的個(gè)數(shù),,使它為4或更少。如果不可避免,,則把常用的前4個(gè)參數(shù)放在R0~R3中,。
③在for(),while() do…while()的循環(huán)中,,用“減到0”代替“加到某個(gè)值”,。比如:
for (loop = 1;loop <= total,;loop++) //ADD和CMP
替換為:for (loop = total,;loop != 0;loop--) //SUBS
第1種方式比較需要2條指令A(yù)DD和CMP,,而第2種方式只需一條指令SUBS,。
④ARM核不含除法硬件,除法通常用一個(gè)運(yùn)行庫(kù)函數(shù)來(lái)實(shí)現(xiàn),,運(yùn)行需要很多個(gè)周期,。一些除法操作在編譯時(shí)作為特例來(lái)處理,例如除以2的操作用左移代替余數(shù)的操作符“%”,,通常使用模算法,。如果這個(gè)值的模不是2的n次冪,,則將花費(fèi)大量的時(shí)間和代碼空間避免這種情況的發(fā)生。具體辦法是使用if()作狀態(tài)檢查,。
比如,,count的范圍是0~59:
count = (count+1) % 60;
用下面語(yǔ)句代替:
if (++count >= 60)
count = 0,;
⑤避免使用大的局部結(jié)構(gòu)體或數(shù)組,可以考慮用malloc/free代替,。
⑥避免使用遞歸,。
結(jié)語(yǔ)
本文介紹了一種基于ARM和CPLD的嵌入式視覺(jué)系統(tǒng),可以實(shí)現(xiàn)顏色跟蹤,。在硬件設(shè)計(jì)上,,圖像采集和圖像處理分離,更利于系統(tǒng)功能的升級(jí),。而視覺(jué)處理算法更注重處理的效率和實(shí)時(shí)性,,同時(shí)根據(jù)不同的需要有兩種模式可供選擇。最后給出了提高程序效率的一些建議和方法,。與基于PC機(jī)的視覺(jué)系統(tǒng)相比,,該系統(tǒng)功耗低、體積小,,適合應(yīng)用于移動(dòng)機(jī)器人等領(lǐng)域,。