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