基于SPCA563B芯片的圖象識別系統設計
單片機spca563b是凌陽科技公司推出的一顆用于圖象識別領域的ic,不僅具有一般單片機的控制功能,而且具有圖象識別與處理能力,本圖象識別系統就是以它為核心進行數據處理與控制,該系統已實現的功能有:物體顏色和形狀識別,字符識別以及手勢識別等,利用這些識別的結果,可以開發游戲、趣味教學、智能玩具、文字輸入以及智能識別等應用系統。
本文通過介紹整個系統以及在整個系統上實現的簡單的手勢識別,使大家更好地了解此系統在圖象識別和文字識別方面的強大功能和易用性。
1 系統硬件架構
如圖1所示,圖象識別硬件系統主要由spca563b單片機、usb控制器、圖像傳感器、存儲器控制器和語音輸出控制器等組成。

1.1 spca563b單片機
spca563b單片機的硬件特征如下:提供320×320的8位cmos圖像傳感器接口,具有自動白平衡和獲得參數控制功能,具有圖像顏色校正和圖像gamma校正功能,具有7種顏色過濾功能,具有良好的減小噪聲和濾波器,能夠在一張圖片中檢測到21個目標物體的大小和位置,并將其結果存放于嵌入在cpu內部的ram中;16位μnsp
cpu內核,內嵌1k×16位的ram和32k×16位的rom;具有可選擇的外部ram和rom接口,具有usb1.1的接口;3.3v電壓供電,128/64腳lqfp封裝(其中128腳有可選擇的并行接口,48腳則沒有)。此系統采用48腳的lqfp封裝,其硬件電路如圖2所示。

1.2 usb控制器
spca563b內嵌usb1.1的控制器,利用usb接口可以與pc進行通信,結合pc端軟件來實現isp及在線調試程序,此外可以利用usb來為系統供電,其電路如圖3所示。

1.3 圖像傳感器
本系統采用spca3010a cmos圖像傳感器,圖像輸出為qvga(320×240)大小的rgb格式,spca563b通過i2s接口來控制spca3010a
cmos圖像傳感器,此cmos圖像傳感器支持stand by省電模式,其電路如圖4所示。

1.4 存儲器控制器
外擴spr4096a flash存儲器,主要用來存儲系統需要的語音數據,spr4096a flash具有如下特征:512k×8位的存儲空間;內嵌4k×8位的sram;外部cpu可以通過串行接口或8位并行接口來訪問flash/sram;i/o接口的電壓范圍為2.25-3.6v,并支持stand
by的省電模式,在數據存儲量比較小的情況下,用spr4096a可以大大降低系統的成本,電路如圖5所示。

2 系統軟件設計
本圖象識別系統的識別功能主要通過軟件系統來實現,為了提高程序的可移植性。為將來該系統功能擴展預留空間,整個軟件系統采用分模塊、分層次的方法編寫程序,采用匯編語言實現對寄存器的讀/寫以及對中斷的控制,并為上層的開發提供靈活的接口,上層采用c語言編寫,通過調用底層函數來間接對硬件資源進行操作,這樣編寫程序使整個系統結構清晰,程序可移植性和可擴展性增強,而且占用硬件資源少,為系統功能的擴展和進一步開發預留充分的空間。
整個軟件系統由主程序,圖象識別功能模塊子程序、中斷服務子程序和語音輸出子程序等組成,主程序負責整個系統的協調和控制工作,通過調用不同的子程序來實現不同的功能,主程序流程如圖7所示。


為突出系統的特點,下面通過手勢識別的實例來重點描述圖象識別原理,手勢識別包含兩個步驟:手形的輪廓跟蹤,提取其輪廓的相關數據,手勢的識別,在上一步得到的數據的基礎上進行分析判斷而得到結果。
2.1 輪廓跟蹤算法實現
輪廓跟蹤的目的是獲得圖像的外部輪廓特征(包括目標物體邊緣點的坐標和方向),為圖像的形狀分析做準備,spca563b的dsp針對膚色有一系列的顏色處理,這樣系統就可以方便圖像轉化為膚色與非膚色的二值圖像,通過對暫存在sram中的二值圖像進行數據分析,來提取手形的邊緣輪廓。
輪廓跟蹤算法步驟如下:
1)按從上到下,從左到右的順序掃描圖像,尋找第一個非白象素作為邊界起始點a[0],記錄a[0]點的坐標(a[0],x,a[0],y)。a[0]是具有最小行和列值的邊界點,再定義一個掃描方向變量dir。該變量用于記錄上一步中沿著前一個邊界點到當前邊界點的移動方向,其初始化取值為a[0],dir=7;掃描方向定義如圖8所示。

假設當前的坐標為(x,y,則其8個鄰域坐標如下:
方向0:(x+1,y);方向1:(x+1,y-1);
方向2:(x,y-1);方向3:(x-1,y-1);
方向4:(x-1,y);方向5:(x-1,y+1);
方向6:(x,y+1);方向7:(x+1,y+1)。
2)按逆時針方向搜索當前象素的3×3的鄰域,其起始搜索方向設定如下:
若a[n-1],dir為奇數,則取(a[n-1],dir+7)mod 8;
若a[n-1],dir為偶數,則取(a[n-1],dir+6)mod 8。
在3×3鄰域中搜索到的第一個與當前象素相同的象素便為新的邊界點a[n],同時更新記錄從上一點搜索到邊界點a[n]的方向變量a[n].dir,記錄新的邊界點的坐標(a[n],x,a[n],y)。
3)如果邊界點a[n]等于第一個邊界點a[0],即(a[n],x==a[0],x&&a[n],y==a[0],y)。停止搜索,結果跟蹤,否則重復步驟2。
由邊界點a[0]、a[1]、a[2]、…、a[n]構成的邊界便為要跟蹤的邊界。算法中步驟1的作用是找出第一個邊界點,步驟3的作用是找出所有的邊界點,如圖9所示,左邊為原始圖像,右邊是用該算法仿真的結果。
2.2 手勢識別算法實現
我們的主要目的是找出伸出手指的個數,開使用行掃描的方法通過行內從0→1或1→0黑白象素變化的次數來確定伸出手指的個數,但這種算法對于傾斜一定角度的手指數目判斷存在一定問題,因此轉而采用"提取指尖點算法"。
提取指尖點的方法著眼于從手勢輪廓中搜索出指尖點,一個指尖點對應于一根手指,最后根據得到指尖點的個數來判定手指數目,判斷是不是指尖;
分析手的形狀,手指的兩邊基本上是平行的,一直按逆時針方向前進,每經過一次指尖,手形輪廓的走向發生反向的變化,由于手形輪廓的邊緣存在一定的毛刺,因此可以用多點方向的平均來減小毛刺的影響,這里取36點方向的平均,表示為average_dir[i]。是否經過指尖的判斷條件1:126<=|average_dir[i-1]-average_dir[i+1]|<=162,(說明:兩點方向相反,其方向值差4,3.5×36=126,4.5×36=162。)
再分析手的形狀,兩手指之間邊緣輪廓的走向也滿足判斷條件1,故必須添加判斷條件,如圖10所示,當沿著一個方向搜索手的邊緣輪廓時,經過指尖走向一定與手指間缺口走向相反,因此,必須假設判定條件2:
is_fingervertex(dir0,dir1,dir2);
這個函數是用來通過連續3點的方向來判斷這3點是否為逆時針走向,由于是沿著逆時針方向搜索邊緣輪廓的,故在判定條件1成立的前提下加上
is_fingervertex(average_dir[i-1],average_dir[i],average_dir[i+1]就可以判斷是否為指尖,從而判定手指的數目,順序3點是否為逆時針走向,具體在程序中可以構造一個循環隊列來實現,測試結果表明這種算法非常穩定。
結語
spca563b內部嵌入功能強大的圖像顏色處理的dsp,用它來做圖象識別系統的主控芯片十分方便、快捷。同時該系統具有語音輸出提示功能,操作更加人性化,并且可以通過usb1.1接口與pc進行通信,配合pc端的調試工具,還可以大大縮短圖象識別功能開發的周期。
評論