狠狠撸

狠狠撸Share a Scribd company logo
樣型識別
期末報告-手寫辨識系統
課堂教授:呂仁園 教授
學生:謝松樺 B0029013
目錄
1. 簡介
2. 使用環境
3. 程式碼
4. 成果展示
5. 結論
1.簡介
上次顏色辨識程式改進有些實現上的困難,所以
將 Project 實作改為手寫文字辨識,由於之前沒
有用 python 撰寫程式的經驗,所以藉由此次專
題機會練習 python。
使用者在手寫板上撰寫繁體中文,經過程式比對
資料,辨識並輸出中文字。
2.使用環境
? 使用語言:Python(Ver3.4)
? 下載繁體中文 model
handwriting-zh_TW.model
.
3.程式碼
*將 handwriting-zh_TW 轉換到 model.pickle 執行
from struct import unpack_from, calcsize
import sys
import pickle
from itertools import takewhile, starmap, repeat
from io import BytesIO
def binary_file_parser(fn):
get_next=lambdafmt:unpack_from(fmt,sio.read(calcsize(fmt)))
buf=open(fn,"rb").read()
sio=BytesIO(buf)
return buf,get_next
def main(fn, freq=None):
MAGIC=0xef71821
buf,get_next=binary_file_parser(fn)
(magic,version,nsize)=get_next("III")
assert magic^MAGIC==len(buf)
if freq:
freq_chars=set(open(freq,"r",encoding="big5").read())
model=[]
for i in range(nsize):
(cs,bias)=get_next("16sf")
character=cs.rstrip(b"x00").decode("utf8")
w=sorted(takewhile((-1, 0.0).__ne__,starmap(get_next,
repeat(("if",)))))
if not freq or character in freq_chars:
model.append((character,bias, w))
pickle.dump(model,open("model.pickle","wb"))
main("handwriting-zh_TW.model")
print("modelconverted")
--------------------------------------------------------
*製作手寫板並比對辨識輸出
# *encoding=utf-8
import sys
import pickle
from hwr import recognize
from tkinter import *
from tkinter.scrolledtextimport *
from itertools import chain
class WritePad:
def autorecog(self):
if self.strokes:
self.idle_count+=1
if self.idle_count>=5:
self.charlist=recognize(self.model,self.dim,
self.strokes)
self.listbox.delete(0,END)
self.listbox.insert(END,*(c for f,c in self.charlist))
self.text.insert(INSERT,self.charlist[0][1])
self.wa_reset()
self.write_area.after(100,self.autorecog)
def selc(self,event):
sel=self.listbox.curselection()
if sel:
c=self.charlist[int(sel[0])][1]
self.text.delete(INSERT+"-1c")
self.text.insert(INSERT,c)
self.text.focus_set()
def wa_reset(self):
self.write_area.delete(ALL)
w,h=self.dim[0]-1,self.dim[1]-1
vlines=((w*i//3+2,0,w*i//3+2,h) for i in range(4))
hlines=((0,h*i//3+2,w,h*i//3+2) for i in range(4))
for var in chain(vlines, hlines):
self.write_area.create_line(*var, fill="#e00000")
self.text.focus_set()
self.strokes,self.idle_count,self.s=[],0, None
def __init__(self,master, model,width=300, height=300):
self.model,self.dim=model,(width,height)
self.text=ScrolledText(master,height=4, width=24,
font=("defaultgui",40))
self.text.pack()
Frame(master, height=height//20).pack(fill="x",expand=1)
Frame(master, height=height,
width=width//3).pack(side=LEFT)
self.write_area=Canvas(master,width=width, height=height,
bg="#FFE")
self.write_area.pack(side=LEFT)
self.write_area.bind("<Motion>",self.motion)
self.write_area.bind("<1>",self.b1down)
self.write_area.bind("<ButtonRelease-1>",self.b1up)
Frame(master, height=height,
width=width//15).pack(side=LEFT)
self.listbox= Listbox(master,selectmode=SINGLE,
width=3, height=10, font=("default",22))
self.listbox.bind("<ButtonRelease-1>",self.selc)
self.listbox.pack(side=LEFT)
Frame(master, height=height,
width=width//15).pack(side=LEFT)
f=Frame(height=height)
f.pack(side=LEFT)
bstyle={"width":5, "font":("default",16)} #button style
Button(f, command=lambda :self.text.delete(INSERT+"-1c"),
text="del",**bstyle).pack()
insertf=lambdac: lambda :self.text.insert(INSERT,c)
for c in ",。?!「」n":
Button(f, text=repr(c)[1:-1], command=insertf(c),
**bstyle).pack()
self.charlist=[]
self.wa_reset()
self.write_area.after(200,self.autorecog)
def b1down(self,event):
self.s,self.idle_count=[(event.x,event.y)],0
def b1up(self,event):
if len(self.s)>1:
self.strokes.append(self.s)
self.s,self.idle_count=None,0
def motion(self,event):
if self.s:
event.widget.create_line(self.s[-1][0],self.s[-1][1],
event.x, event.y, width=5.0, smooth=True)
self.s.append((event.x,event.y))
self.idle_count=0
def main():
master = Tk()
WritePad(master,pickle.load(open("model.pickle","rb")))
master.mainloop()
if __name__ == "__main__":
main()
4.成果展示
5.結論
時做出手寫辨識最重要的當然就是辨識率!自
己實際手寫 100 次後的結果,辨識成功結果為
72%。
辨識成功的條件必須筆畫完全正確,並且在手寫
板上寫字工整,不然可能會辨識出"日"、"入"等
字體結果。

More Related Content

樣型識別 期末報告