SPCA563B實(shí)現(xiàn)圖像識(shí)別系統(tǒng)
若A[n-1].dir為奇數(shù),則取(A[n-1].dir+7)rood 8;
若A[n-1].dir為偶數(shù),則取(A[n-1].dir+6)mod 8。
在3×3鄰域中搜索到的第一個(gè)與當(dāng)前像素相同的像素便為新的邊界點(diǎn)A[n],同時(shí)更新記錄從上一點(diǎn)搜索到邊界點(diǎn)A[n]的方向變量A[n].dir,記錄新的邊界點(diǎn)的坐標(biāo)(A[n].x,A[n].y)。
③如果邊界點(diǎn)A[n]等于第一個(gè)邊界點(diǎn)A[0],即(A[n].x==A[O].xA[n].y==A[0].y)。停止搜索。結(jié)束跟蹤。否則重復(fù)步驟②。
由邊界點(diǎn)A[O]、A[1]、A[2]、…、A[n]構(gòu)成的邊界便為要跟蹤的邊界。算法中步驟①的作用足找出第一個(gè)邊界點(diǎn),步驟③的作用是找出所有的邊界點(diǎn)。如圖9所示,左邊為原始圖像,右邊是用該算法仿真的結(jié)果。
2.2 手勢(shì)識(shí)別算法實(shí)現(xiàn)
我們的主要目的是找出伸出手指的個(gè)數(shù)。開始用行掃描的方法通過行內(nèi)從O→1或1→O黑白像素變化的次數(shù)來確定伸出手指的個(gè)數(shù),但這種算法對(duì)于傾斜一定角度的手指數(shù)目判斷存在一定問題,因此轉(zhuǎn)而采用“提取指尖點(diǎn)算法”。
提取指尖點(diǎn)的方法著眼于從手勢(shì)輪廓中搜索出指尖點(diǎn),一個(gè)指尖點(diǎn)對(duì)應(yīng)于一根手指,最后根據(jù)得到指尖點(diǎn)的個(gè)數(shù)來判定手指數(shù)目。判斷是不是指尖:分析手的形狀,手指的兩邊基本上是平行的。一直按逆時(shí)針方向前進(jìn),每經(jīng)過一次指尖,手形輪廓的走向發(fā)生反向的變化。由于手形輪廓的邊緣存在一定的毛刺,因此可以用多點(diǎn)方向的平均來減小毛刺的影響。這里取36點(diǎn)方向的平均,表示為Average_dix[i]。是否經(jīng)過指尖的判斷條件1:126=|Average_dir[i-1]一Average_dir[i+1]|=162。(說明:兩點(diǎn)方向相反,其方向值差4,3.5×36=126,4.5×36=162。)
再分析手的形狀,兩手指之間邊緣輪廓的走向也滿足判斷條件l,故必須添加判斷條件。如圖10所示,當(dāng)沿著一個(gè)方向搜索手的邊緣輪廓時(shí),經(jīng)過指尖走向一定與手指間缺口走向相反。因此,必須假設(shè)判定條件2:
Is_FingerVertex(dir0,dirl,dir2);
這個(gè)函數(shù)是用來通過連續(xù)3點(diǎn)的方向來判斷這3點(diǎn)是否為逆時(shí)針走向。由于是沿著逆時(shí)針方向搜索邊緣輪廓的,故在判定條件1成立的前提下加上Is_FingerVertex(Average_dir[i-1],Average_dir[i],Average_dir[i+1])就可以判斷是否為指尖,從而判定手指的數(shù)目。順序3點(diǎn)是否為逆時(shí)針走向,具體在程序中可以構(gòu)造一個(gè)循環(huán)隊(duì)列來實(shí)現(xiàn)。測(cè)試結(jié)果表明這種算法非常穩(wěn)定。
結(jié)語
該系統(tǒng)具有語音輸出提示功能,操作更加人性化,并且可以通過USBl.1接口與PC進(jìn)行通信;配合PC端的調(diào)試工具,還可以大大縮短圖像識(shí)別功能開發(fā)的周期。
評(píng)論