漫談WinCE的手寫識(shí)別技術(shù)(一)
HwxALCValid(hrc,ALC_KANJI_ALL); //識(shí)別漢字
5.調(diào)用HwxSetContext()設(shè)置前文,提高文字識(shí)別率.如果沒有前文,可以不調(diào)用該函數(shù).
6.調(diào)用HwxInput()加入文字筆畫.如果文字是多筆畫,則應(yīng)多次調(diào)用該函數(shù).
函數(shù)原型是:

BOOL HwxInput(

HRC hrc,

POINT* lppnt,

UINT upoints,

DWORD timestamp

);
lppnt是輸入的筆畫坐標(biāo),upoints是坐標(biāo)的個(gè)數(shù),和HWXGUIDE的參數(shù)一樣,這里的坐標(biāo)也是屏幕坐標(biāo)系.timestamp是時(shí)間,一般情況下,我們可以設(shè)置為0.
需要注意的是,如果是多筆畫的文字,最好不要一次性將所有筆畫點(diǎn)陣通過HwxInput()輸入,否則最后的識(shí)別結(jié)果將會(huì)大相徑庭.因?yàn)樽R(shí)別引擎是一筆一劃進(jìn)行輸入識(shí)別的,如果多筆畫文字一次性輸入,引擎可能將所有筆畫當(dāng)成一個(gè)筆畫,從而導(dǎo)致識(shí)別結(jié)果異常不準(zhǔn)確.
7.調(diào)用HwxEndInput()告知引擎筆畫輸入結(jié)束,即將要進(jìn)行識(shí)別部分.
8.調(diào)用HwxProcess()讓引擎進(jìn)行識(shí)別處理.
9.調(diào)用HwxResultsAvailable()獲取識(shí)別的字符數(shù).
根據(jù)文檔,HwxResultsAvailable()返回識(shí)別的字符數(shù).然而在WinCE4.2中,調(diào)用hwxcht.dll的話,任何時(shí)候都是返回為0值,即使之后的函數(shù)能返回識(shí)別字符也依然如此.文檔中描述,該函數(shù)如果返回的是-1,則代表調(diào)用失敗,其它值代表可供使用的字符數(shù).也許是WinCE4.2下識(shí)別引擎不完善的緣故,該函數(shù)根本沒有發(fā)揮文檔所描述的作用.
10.調(diào)用HwxGetResults()獲取結(jié)果.

INT32 HwxGetResults(

HRC hrc,

UINT cAlt,

UINT iFirst,

UINT cBoxRes,

HWXRESULTS* rgBoxResults

);
初看起來,該函數(shù)形參似乎特別復(fù)雜,但實(shí)際上并非如此.
根據(jù)文檔,cAlt是期望的輪流返回的字符,iFirst是想要返回字符的索引,cBoxRes是返回的字符個(gè)數(shù).但實(shí)際上,cAlt起主導(dǎo)作用,比如說cBoxRes設(shè)置為1,而cAlt設(shè)置為10,則返回的字符個(gè)數(shù)依然為10.所以我在平常使用中,一般是將iFirst設(shè)為0,cBoxRes設(shè)為1,而cAlt設(shè)為所需返回的字符個(gè)數(shù).
rgBoxResults指向儲(chǔ)存字符的緩沖區(qū).不過,返回結(jié)果比較有意思,除了第一個(gè)rgBoxResults以外的所有結(jié)構(gòu)的indxBox成員都儲(chǔ)存了返回字符.
比如返回五個(gè)字符'與子于飛干',則rgBoxResults的數(shù)組列數(shù)值為:
rgBoxResults[0].indxBox : 0
rgBoxResults[0].rgChar[0] : '與'
rgBoxResults[1].indxBox : '子'
rgBoxResults[1].rgChar[0] : '于'
rgBoxResults[2].indxBox : '飛'
rgBoxResults[2].rgChar[0] : '干'
11.調(diào)用 HwxDestroy()銷毀引擎,本次識(shí)別過程結(jié)束.如果需要繼續(xù)識(shí)別文字,從步驟2重新開始.
評(píng)論