分別存放在數(shù)組1';11^[12]的成員變量02?011^181111;[即0;[111:[200]和11〇中。數(shù)組1';[1^[12] 的類型為結(jié)構(gòu)體CircleRing。該結(jié)構(gòu)體類型的定義為:structCircleRing{D2P0INT shixinpoint[200] ;//圓環(huán)內(nèi)的點(diǎn)坐標(biāo)intno;//圓環(huán)內(nèi)點(diǎn)的數(shù)目D2P0INTavg;//圓環(huán)中 心點(diǎn)坐標(biāo)};
[0127] ⑤在第四步的基礎(chǔ)上,計(jì)算每個(gè)圓環(huán)的中心點(diǎn)。若該圓環(huán)內(nèi)點(diǎn)的個(gè)數(shù)即no的值 不為0,則通過落在該圓環(huán)內(nèi)的點(diǎn)計(jì)算該圓環(huán)的中心點(diǎn),存儲(chǔ)在數(shù)組ring[12]的成員變量 D2P0INTavg中。若no的值為0則將該圓環(huán)中心點(diǎn)的x、y坐標(biāo)均置為0。
[0128] ⑤將每個(gè)圓環(huán)的中心點(diǎn)復(fù)制到數(shù)組featuredot□中,作為手勢(shì)特征點(diǎn)。將圓環(huán)中 心點(diǎn)和手勢(shì)點(diǎn)復(fù)制到數(shù)組sumpoints□中,為之后的形狀上下文特征提取做準(zhǔn)備。
[0129]形狀上下文特征提取函數(shù)voidShapeContext(intFeatureNo[] [60],D2P0INTfe aturedots[],D2P0INTsumpoints[],intHandpointsN0,intcircleno)該函數(shù)的主要功 能是求取手勢(shì)特征點(diǎn)的形狀上下文特征。
[0130] 輸入:featuredots□為手勢(shì)特征點(diǎn)即圓環(huán)中心點(diǎn),sumpoints□為手勢(shì)特征點(diǎn)和 手勢(shì)點(diǎn)的集合,HandpointsNO為手勢(shì)點(diǎn)的個(gè)數(shù),circleno為圓環(huán)份數(shù)。
[0131] 輸出:用來存儲(chǔ)每個(gè)手勢(shì)特征點(diǎn)的形狀上下文特征的數(shù)組FeatureNo[] [60]。
[0132] 具體步驟:
[0133] 對(duì)每個(gè)手勢(shì)特征點(diǎn)進(jìn)行如下的操作。
[0134] ①求當(dāng)前手勢(shì)特征點(diǎn)到數(shù)組sumpoints□中點(diǎn)的最大距離maxdistance。
[0135] ②若該手勢(shì)特征點(diǎn)的x、y坐標(biāo)均不為0,則執(zhí)行下面的算法。
[0136] 以當(dāng)前手勢(shì)特征點(diǎn)為極點(diǎn),最大距離maxdistance為半徑,將平面空間劃分為60 個(gè)區(qū)域。具體劃分方法如下:以當(dāng)前手勢(shì)特征點(diǎn)為極點(diǎn)構(gòu)造極坐標(biāo)系,將整個(gè)平面空間從方 向上平均劃分出12個(gè)方向,同時(shí)在半徑上則均勻劃分5份。所以,整個(gè)平面空間就自然被 劃分為60個(gè)區(qū)域。在相同的環(huán)上,每個(gè)區(qū)域的面積是相等的,然后統(tǒng)計(jì)數(shù)組sump〇ints[] 中的點(diǎn)落在每一個(gè)區(qū)域中的個(gè)數(shù)。
[0137] 第i個(gè)手勢(shì)特征點(diǎn)的60個(gè)屬性值能夠構(gòu)成一個(gè)序列(aiil,ali2,...,ali6。),所以可 以用一個(gè)n*60形狀矩陣來對(duì)圖像形狀進(jìn)行描述:
[0138]
:矩陣的含義為:對(duì)于每個(gè)矩陣元素a^,i代表第i個(gè) 特征點(diǎn),j代表60個(gè)區(qū)域中的第j個(gè)區(qū)域,' ,的含義為:以第i個(gè)特征點(diǎn)為極點(diǎn),建立極坐 標(biāo)系,落在第j個(gè)區(qū)域內(nèi)點(diǎn)的個(gè)數(shù)。n的值為特征點(diǎn)的總個(gè)數(shù),這里n的值為12,因?yàn)楣灿?12個(gè)圓環(huán)中心點(diǎn),即手勢(shì)特征點(diǎn)。該矩陣即代表該圖像的形狀的上下文特征。將此矩陣的 值保存在二維數(shù)組FeatureNo[] [60]中。若該手勢(shì)特征點(diǎn)的x、y坐標(biāo)均為0,則將該特征 點(diǎn)的60個(gè)屬性值全置為0。
[0139] 然后進(jìn)行手勢(shì)識(shí)別。
[0140] (1)順序讀取50個(gè)手勢(shì)數(shù)據(jù)庫(kù)文件并將其保存在數(shù)組中。
[0141] (2)從視頻流中連續(xù)選取F幀待識(shí)別手勢(shì)圖像,F(xiàn)取10,從第十幀開始,從視頻流 中連續(xù)取10幀圖像,作為待識(shí)別手勢(shì)圖像。
[0142] (3)采用與上述相同的方法實(shí)時(shí)計(jì)算出每幀待識(shí)別圖像的形狀上下文特征;
[0143] (4)計(jì)算每幀待識(shí)別手勢(shì)圖像的形狀上下文特征分別與手勢(shì)數(shù)據(jù)庫(kù)中m*n幅手勢(shì) 圖像的形狀上下文特征之間的x2距離,然后將手勢(shì)數(shù)據(jù)庫(kù)中每幅手勢(shì)圖像參與計(jì)算得出 的所有x2距離加起來保存在一個(gè)數(shù)組中,每幀待識(shí)別手勢(shì)圖像共對(duì)應(yīng)保存m*n個(gè)x2距離 和數(shù)組,采用Sort函數(shù)求取m*n個(gè)x2距離和數(shù)組的最小值A(chǔ);
[0144] (5)按照上述方法,分別計(jì)算得出F幀待識(shí)別手勢(shì)圖像對(duì)應(yīng)的F個(gè)x2距離和數(shù)組 的最小值A(chǔ),然后采用Sort函數(shù)對(duì)F個(gè)x2距離和數(shù)組的最小值A(chǔ)再求最小值B,該最小值 B所對(duì)應(yīng)存儲(chǔ)在手勢(shì)數(shù)據(jù)庫(kù)中的手勢(shì)即為識(shí)別出來的手勢(shì)。
[0145]讀手勢(shì)模板庫(kù)文件函數(shù)voidreadfile(inttemplet[50] [20] [60])
[0146] 該函數(shù)的功能是讀取已經(jīng)建好的手勢(shì)數(shù)據(jù)庫(kù)文件,并將其保存在數(shù)組 templet[50] [20] [60]中。其中第一維數(shù)值的大小為文件標(biāo)號(hào),共有5種手勢(shì),每種手勢(shì)共 10個(gè)手勢(shì)庫(kù)文件;第二維數(shù)值的大小代表手勢(shì)特征點(diǎn)的個(gè)數(shù);第三維數(shù)值的大小代表每個(gè) 手勢(shì)特征點(diǎn)所對(duì)應(yīng)的60個(gè)特征的值。
[0147] 輸出:保存所有模板庫(kù)文件的數(shù)組templet[50] [20] [60]。
[0148] 具體步驟:
[0149] ①共有5種手勢(shì),每種手勢(shì)10個(gè)文件,所以共有50個(gè)手勢(shì)庫(kù)文件。按照順序依次 將每個(gè)文件讀進(jìn)數(shù)組templet[50] [20] [60]中。數(shù)組templet[50] [20] [60]第一維的數(shù)值 代表不同的手勢(shì)。其中0-9為包袱,10-19為剪刀,20-29為ok手勢(shì),30-39為拳頭,40-49 為大拇指。
[0150] ②順序讀取每個(gè)文件。若讀出來的值為-1,則認(rèn)為是該文件讀取結(jié)束,將flag置 為1,作為該文件讀取結(jié)束標(biāo)志。
[0151]手勢(shì)識(shí)別函數(shù)voidIdensitify(intfeaturecon[] [60],floatchengben[],int n,inttemplet[50][20][60],intcircleno)
[0152] 此函數(shù)的功能是將待識(shí)別手勢(shì)幀圖像的形狀上下文特征與手勢(shì)庫(kù)中某種手勢(shì)的 10個(gè)庫(kù)文件中的某個(gè)文件中的形狀上下文特征進(jìn)行比較,求匹配代價(jià)。
[0153] 輸入:featurecon[] [60]是求得的待識(shí)別手勢(shì)幀圖像的形狀上下文特征, templet[50][20][60]用來存儲(chǔ)從手勢(shì)庫(kù)文件中讀取的形狀上下文特征的值。n為文件的 標(biāo)號(hào),代表待識(shí)別手勢(shì)與第n個(gè)手勢(shì)庫(kù)文件進(jìn)行比較。因?yàn)楣灿?0個(gè)文件所以n的值取 0_49。circleno為圓環(huán)的個(gè)數(shù)。
[0154] 輸出:返回存儲(chǔ)匹配代價(jià)的數(shù)組chengben□。因?yàn)楣灿?2個(gè)手勢(shì)特征點(diǎn),所以該 數(shù)組共有12個(gè)值。
[0155] 具體步驟:
[0156]①按行遍歷指向待識(shí)別手勢(shì)形狀上下文特征的數(shù)組featurecon[] [60],同時(shí)遍歷 存儲(chǔ)手勢(shì)庫(kù)形狀上下文特征的數(shù)組templet[50] [20] [60]。
[0157] ②若該手勢(shì)特征點(diǎn)的60個(gè)屬性值全為0,則將該手勢(shì)庫(kù)文件中對(duì)應(yīng)手勢(shì)特征點(diǎn)的 60個(gè)屬性值賦值予它。然后將該手勢(shì)特征點(diǎn)的60個(gè)屬性值與該手勢(shì)庫(kù)文件中每個(gè)特征點(diǎn) 的形狀上下文特征進(jìn)行比較,因?yàn)樵撎卣鼽c(diǎn)與手勢(shì)庫(kù)中每個(gè)特征點(diǎn)的特征之間都有一個(gè)匹 配代價(jià),所以共得到12個(gè)匹配代價(jià)值,然后在這12個(gè)值中取最小值,作為數(shù)組chengben[] 的某個(gè)元素值。匹配代價(jià)用X2距離來定義。x2距離的定義為:
[0158]
[0159] 公式中的h (k)為待識(shí)別手勢(shì)中第i個(gè)手勢(shì)特征點(diǎn)的形狀上下文特征值,hj(k)為 某個(gè)手勢(shì)庫(kù)文件中第j個(gè)手勢(shì)特征點(diǎn)的形狀上下文特征值,這里k的值為1-60,代表60個(gè) 屬性值中的某一個(gè)。經(jīng)過此公式得到匹配代價(jià)值,即i、j兩個(gè)特征點(diǎn)之間的匹配代價(jià)。
[0160] ③按照以上方法對(duì)每個(gè)手勢(shì)特征點(diǎn)進(jìn)行遍歷,所以最終得到12個(gè)匹配代價(jià)值,存 放在數(shù)組chengben□中。
[0161]排序函數(shù)IdensityFlagSort(IdensityFlaggross[],intn)
[0162] 該函數(shù)的功能是對(duì)求得的x2距離和求取最小值。
[0163] IdensityFlag為結(jié)構(gòu)體類型,定義如下:
[0164] truct IdensityFlag {floa