如何寫一個簡單的手寫識別算法?


 gesture recognizer 是比較好的解法。

灑家也有一個類似的算法,借鑒了原始手寫ocr的思路來實現的。其實是寫在 $1 gesture recognizer 之前的,但沒有 $1 gesture recognizer 歸納得好,作者jacob還是我偶像。

Realtime Gesture recognition

把所有的筆畫定義了個8個方向,然后將B的筆畫可以分解成一個字符串。然后當人在觸摸屏上畫出一個符號時,也將它分解成8個方向的字符串,最后比較兩個字符串的距離就能判斷出和不同符號的近似度。

實現起來也很簡單,第一步去噪,因為不同觸摸屏的采樣頻率不同。


第二步把去噪后的數據轉換成方向序列,把之前得到的點換成方向序列,並把方向序列歸納到之前定義的8個方向中去。

第三步把連續一致的方向合並。

第四步把小片段的移動略去,最后就能得出其實是畫了一個凹的形狀。

這個算法的厲害之處是可以實時識別,畫到一半也能判斷出來。
Realtime Gesture recognition 源代碼和demo都在上面了。



===============
吐槽時間。。。。
剛寫完論文累死了,來吐槽。。。。
原來大家都覺得第一名不靠譜,怎么木有人把我頂上去!我眼紅着那300多票呢!

我來告訴你為什么第一名不靠譜,

首先ocr拿來做gesture recognition是不對滴!
ocr是一個比gesture recognition更難的問題,因為ocr得到的是一張圖片,所有點並沒有時間戳,而手勢識別時,每一下移動是有時間戳的,所以是知道“怎么畫出來”這個額外信息的。

其次ocr不是這么解釋的。
ocr問題的重點是怎么選擇特征,比如知名的uci 數據集就有以下這些特征量:

     1.	lettr	capital letter	(26 values from A to Z)
     2.	x-box	horizontal position of box	(integer)
     3.	y-box	vertical position of box	(integer)
     4.	width	width of box			(integer)
     5.	high 	height of box			(integer)
     6.	onpix	total # on pixels		(integer)
     7.	x-bar	mean x of on pixels in box	(integer)
     8.	y-bar	mean y of on pixels in box	(integer)
     9.	x2bar	mean x variance			(integer)
    10.	y2bar	mean y variance			(integer)
    11.	xybar	mean x y correlation		(integer)
    12.	x2ybr	mean of x * x * y		(integer)
    13.	xy2br	mean of x * y * y		(integer)
    14.	x-ege	mean edge count left to right	(integer)
    15.	xegvy	correlation of x-ege with y	(integer)
    16.	y-ege	mean edge count bottom to top	(integer)
    17.	yegvx	correlation of y-ege with x	(integer)

我不懂deep learning,別和我講什么ocropus....

 

********************************************************************************************

 

移動設備多用手勢進行輸入,用戶通過手指在屏幕上畫出一個特定符號,計算機識別出來后給予響應的反應,要比讓用戶點擊繁瑣的按鈕為直接和有趣,而如果為每種手勢編寫一段識別代碼的話是件得不償失的事情。如何設計一種通用的手勢識別算法來完成上面的事情呢?

我們可以模仿筆記識別方法,實現一個簡單的筆畫識別模塊,流程如下:

第一步:手勢歸一化

1. 手指按下時開始記錄軌跡點,每划過一個新的點就記錄到手勢描述數組guesture中,直到手指離開屏幕。

2. 將gesture數組里每個點的x,y坐標最大值與最小值求出中上下左右的邊緣,求出該手勢路徑點的覆蓋面積。

3. 手勢坐標歸一化:以手勢中心點為原點,將gesture里頂點歸一化到-1<=x<=1, -1<=y<=1空間中。

4. 數組長度歸一化:將手勢路徑按照長度均勻划分成32段,用共32個新頂點替換guestue里的老頂點。

第二步:手勢相似度

1. 手勢點乘:g1 * g2 = g1.x1*g2.x1 + g1.y1*g2.y1 + … + g1.x32*g2.x32 + g1.y32*g2.y32

2. 手勢相似:相似度(g1, g2)=g1*g2/sqrt(g1*g1 + g2*g2)

由此我們可以根據兩個手勢的相似度算成一個分數score。用戶輸入了一個手勢g,我們回合手勢樣本中的所有樣本g1-gn打一次相似度分數,然后求出相似度最大的那個樣本gm並且該分數大於某個特定閥值(比如0.8),即可以判斷用戶輸入g相似於手勢樣本 gm !

--------------------------------------------------------------------------------------------------------------------------------------------

可以玩我5年前寫的手勢識別 Flash 游戲:

Figer Motion Game

 

***************************************************************************************************************************************************

 

$1 Unistroke Recognizer,不用謝~代碼非常簡單,各種編程語言都有開源的庫

我擦,排名第一的在說什么,我完全看不懂……

 

$1 Recognizer

 

Search · dollar gesture recognizer · GitHub




 

 

******************************************************************************************************************************

 

ioccc 2013 年的一段代碼可以一戰。

Best of show

Adrian Cable - OCR in quick brown fox ASCII art
US


這段鬼畜的代碼 (cable2.c) 可以做到識別手寫的 ascii 字符,

識別不同的顏色,

兼容不同的尺寸,

識別一段代碼,


排版字體,

以及一個笑臉 :)

執行效果:

 

references:

http://www.zhihu.com/question/29238666

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM