基于圖像傳感器的CPLD視覺系統(tǒng)設(shè)計(jì)與研究
時(shí)序邏輯部分主要完成對圖像傳感器時(shí)序信號的識別。如圖2所示,CPLD需要首先檢測VSYNc的下降沿,接著檢測HREF信號的上升沿,然后在PCLK信號的上升沿將圖像數(shù)據(jù)讀入。
在Verilog語言中,對上升沿的檢測是通過always語句來實(shí)現(xiàn)的。例如檢測時(shí)鐘信號cam_pclk的上升沿:always@(posedge cam_pclk)。但從上面的分析中可以看出,需要檢測的信號沿有3個(gè),可以都用always來檢測,但在Verilog的語法中always語句是不可以嵌套的。為了解決這個(gè)問題,本系統(tǒng)中采用了如下方式:整個(gè)模塊只有一個(gè)時(shí)序邏輯的always塊,其他的信號沿檢測用與al—ways等價(jià)的方式實(shí)現(xiàn)。例如對于cam_vsyn信號,設(shè)置2個(gè)臨時(shí)信號vsyn_0和vsyn_1,在每個(gè)時(shí)鐘信號的上升沿,進(jìn)行如下賦值:
這樣,當(dāng)每個(gè)時(shí)鐘沿到來時(shí)都會更新vsyn_0和vsyn_1的值。當(dāng)vsyn_O的值為O且vsyn_1的值為1時(shí),認(rèn)為是上升沿到來,同理也可以檢測下降沿。需要注意的是:這種方式下,時(shí)鐘信號的周期要遠(yuǎn)遠(yuǎn)小于被檢測信號的高電平和低電平的持續(xù)時(shí)間。如果信號脈沖過窄,在整個(gè)脈沖期間vsyn_O和vsyn_l的值都沒有更新,就會丟失邊沿的檢測。
數(shù)據(jù)寫入SRAM的過程是用Mealy狀態(tài)機(jī)來實(shí)現(xiàn)的,程序具有通用性。若使用其他型號的SRAM,只需要根據(jù)器件的讀寫時(shí)序在相應(yīng)的狀態(tài)中修改高低電平。狀態(tài)機(jī)使程序的結(jié)構(gòu)清晰,調(diào)試方便。
3.2 ARM部分程序設(shè)計(jì)
目前,基于PC機(jī)的視覺處理算法有很多,但在基于微處理器的嵌入式視覺系統(tǒng)中,系統(tǒng)在硬件資源和處理速度上都無法與PC機(jī)相比。特別是在有實(shí)時(shí)性要求的情況下,需要編寫適合嵌入式系統(tǒng)特點(diǎn)的快速有效的算法。下面編寫的算法都是根據(jù)這個(gè)思想來編寫的。
顏色跟蹤:顏色跟蹤的任務(wù)可以分解為顏色標(biāo)定和顏色分割兩個(gè)步驟。顏色標(biāo)定的任務(wù)是通過一個(gè)已知的顏色,找出其在顏色空間內(nèi)與之對應(yīng)的一個(gè)封閉區(qū)域。顏色分割則是通過比較器判斷圖像中像素點(diǎn)在顏色空間中是否落在標(biāo)定的空間內(nèi),若在已標(biāo)定的空間內(nèi),則認(rèn)為其顏色與已標(biāo)定的顏色一樣,這樣就可以根據(jù)標(biāo)定的封閉區(qū)域識別出圖像中具有與標(biāo)定顏色相同的物體。為了滿足不同情況下應(yīng)用的需求,顏色跟蹤設(shè)置了2種模式。
(1)幀處理模式
該模式需要用戶輸入要跟蹤的R、G、B三個(gè)顏色邊界,構(gòu)成一個(gè)RGB跟蹤的顏色空間。然后處理器從圖像的左上角開始,順序逐行逐點(diǎn)的檢查每一個(gè)像素。如果被檢查的像素正好落入用戶定義的顏色范圍,就將這個(gè)像素標(biāo)記為跟蹤的;同時(shí),需要記錄被跟蹤點(diǎn)中的最高點(diǎn)、最低點(diǎn)、最左點(diǎn)和最右點(diǎn)。如果檢測到的像素位置在當(dāng)前跟蹤區(qū)域的標(biāo)記框外,則需要增大標(biāo)記框來包含該像素;同時(shí),需要記錄符合要求的像素的數(shù)量,當(dāng)一幀圖像掃描完成后,可以分別用符合要求的點(diǎn)的橫縱坐標(biāo)和除以符合要求的像素點(diǎn)數(shù),得出被追蹤物體的中心坐標(biāo)。
這樣在對一幀圖像的一次掃描后,就可以得到被跟蹤物體的中心坐標(biāo),同時(shí)處理器只需記錄較少的全局變量,在時(shí)間復(fù)雜度和空間復(fù)雜度上都適合嵌入式系統(tǒng)。
上述方法中,只有一個(gè)跟蹤點(diǎn)就可以改變標(biāo)記框,因此如果在跟蹤過程中出現(xiàn)噪聲點(diǎn),就會對標(biāo)記框產(chǎn)生影響。去噪的思想是:如果一個(gè)像素點(diǎn)周圍的其他點(diǎn)也落在用戶輸入的RGB范圍內(nèi),那么這個(gè)點(diǎn)就被認(rèn)為是符合要求的。
(2)行處理模式
與幀處理模式不同的是,行處理模式在掃描完一行數(shù)據(jù)后就記錄下所在行中符合要求的連續(xù)點(diǎn)的最左端坐標(biāo)和最右端坐標(biāo),不妨分別記為(XnL,YnL)和(XnR,YnR)。在一幀圖像處理完成后,會得到圖3所示的圖形。
根據(jù)得到的結(jié)果,可以計(jì)算出更多關(guān)于跟蹤物體的信息:
?、儆?jì)算區(qū)域面積。計(jì)算每條線段的長度l(n),然后將l(n)進(jìn)行累積疊加,即可獲得跟蹤區(qū)域面積值S。
?、茏R別物體的形狀。根據(jù)得到的每行跟蹤點(diǎn)的長度,以及同一行中有幾段符合要求的連續(xù)跟蹤點(diǎn),可以得知物體從攝像頭角度看到的形狀。特別是在檢測平面上線條時(shí),可以識別是否有分支,這一點(diǎn)是幀處理模式無法做到的。
需要指出的是,行處理模式雖然會得到關(guān)于跟蹤目標(biāo)的更多信息,但是每行處理的方式增大了處理器的負(fù)擔(dān),處理速度也沒有幀處理快。
4 提高系統(tǒng)的工作速率
目前,系統(tǒng)工作在幀處理模式下的工作速率是25幀/s,作為系統(tǒng)功能的驗(yàn)證,這里采用的算法是顏色跟蹤。如果僅做純粹的圖像采集,而不做圖像處理,那么系統(tǒng)可以達(dá)到OV6620的最高工作速率,即60幀/s。而在圖像處理方面,不同的圖像處理程序效率對系統(tǒng)的工作頻率有較大的影響。下面給出在通用ARM處理器下提高程序效率的幾個(gè)建議:
?、賰?nèi)嵌(inline)可通過刪除子函數(shù)調(diào)用的開銷來提高性能。如果函數(shù)在別的模塊中不被調(diào)用,一個(gè)好的建議是用static標(biāo)識函數(shù);否則,編譯器將在內(nèi)嵌譯碼里把該函數(shù)編譯成非內(nèi)嵌的。
?、谠?a class="contentlabel" href="http://cafeforensic.com/news/listbylabel/label/ARM">ARM系統(tǒng)中,函數(shù)調(diào)用過程中參數(shù)個(gè)數(shù)≤4時(shí),通過R0~R3傳遞;參數(shù)個(gè)數(shù)>4時(shí),通過壓棧方式傳遞(需要額外的指令和慢速的存儲器操作)。通常限制參數(shù)的個(gè)數(shù),使它為4或更少。如果不可避免,則把常用的前4個(gè)參數(shù)放在R0~R3中。
第1種方式比較需要2條指令A(yù)DD和CMP,而第2種方式只需一條指令SUBS。
?、蹵RM核不含除法硬件,除法通常用一個(gè)運(yùn)行庫函數(shù)來實(shí)現(xiàn),運(yùn)行需要很多個(gè)周期。一些除法操作在編譯時(shí)作為特例來處理,例如除以2的操作用左移代替余數(shù)的操作符“%”,通常使用模算法。如果這個(gè)值的模不是2的n次冪,則將花費(fèi)大量的時(shí)間和代碼空間避免這種情況的發(fā)生。具體辦法是使用if()作狀態(tài)檢查。
比如,count的范圍是0~59;
count=(count+1)%60;
用下面語句代替:
if(++count>=60) count="0";
?、荼苊馐褂么蟮木植拷Y(jié)構(gòu)體或數(shù)組,可以考慮用malloc/free代替。
?、薇苊馐褂眠f歸。
結(jié) 語
本文介紹了一種基于ARM和CPLD的嵌入式視覺系統(tǒng),可以實(shí)現(xiàn)顏色跟蹤。在硬件設(shè)計(jì)上,圖像采集和圖像處理分離,更利于系統(tǒng)功能的升級。而視覺處理算法更注重處理的效率和實(shí)時(shí)性,同時(shí)根據(jù)不同的需要有兩種模式可供選擇。最后給出了提高程序效率的一些建議和方法。與基于PC機(jī)的視覺系統(tǒng)相比,該系統(tǒng)功耗低、體積小,適合應(yīng)用于移動(dòng)機(jī)器人等領(lǐng)域。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論