opencv python 基于KNN的手写体识别的实例
OCRofHand-writtenDatausingkNN
OCRofHand-writtenDigits
我们的目标是构建一个可以读取手写数字的应用程序,为此,我们需要一些train_data和test_data.OpenCV附带一个imagesdigits.png(在文件夹opencv\sources\samples\data\中),它有5000个手写数字(每个数字500个,每个数字是20x20图像).所以首先要将图片切割成5000个不同图片,每个数字变成一个单行400像素.前面的250个数字作为训练数据,后250个作为测试数据.
importnumpyasnp
importcv2
importmatplotlib.pyplotasplt
img=cv2.imread('digits.png')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#Nowwesplittheimageto5000cells,each20x20size
cells=[np.hsplit(row,100)forrowinnp.vsplit(gray,50)]
#MakeitintoaNumpyarray.Itsizewillbe(50,100,20,20)
x=np.array(cells)
#Nowwepreparetrain_dataandtest_data.
train=x[:,:50].reshape(-1,400).astype(np.float32)#Size=(2500,400)
test=x[:,50:100].reshape(-1,400).astype(np.float32)#Size=(2500,400)
#Createlabelsfortrainandtestdata
k=np.arange(10)
train_labels=np.repeat(k,250)[:,np.newaxis]
test_labels=train_labels.copy()
#InitiatekNN,trainthedata,thentestitwithtestdatafork=1
knn=cv2.ml.KNearest_create()
knn.train(train,cv2.ml.ROW_SAMPLE,train_labels)
ret,result,neighbours,dist=knn.findNearest(test,k=5)
#Nowwechecktheaccuracyofclassification
#Forthat,comparetheresultwithtest_labelsandcheckwhicharewrong
matches=result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print(accuracy)
输出:91.76
进一步提高准确率的方法是增加训练数据,特别是错误的数据.每次训练时最好是保存训练数据,以便下次使用.
#savethedata
np.savez('knn_data.npz',train=train,train_labels=train_labels)
#Nowloadthedata
withnp.load('knn_data.npz')asdata:
print(data.files)
train=data['train']
train_labels=data['train_labels']
OCRofEnglishAlphabets
在opencv/samples/data/文件夹中附带一个数据文件letter-recognition.data.在每一行中,第一列是一个字母表,它是我们的标签.接下来的16个数字是它的不同特征.
importnumpyasnp
importcv2
importmatplotlib.pyplotasplt
#Loadthedata,convertersconvertthelettertoanumber
data=np.loadtxt('letter-recognition.data',dtype='float32',delimiter=',',
converters={0:lambdach:ord(ch)-ord('A')})
#splitthedatatotwo,10000eachfortrainandtest
train,test=np.vsplit(data,2)
#splittrainDataandtestDatatofeaturesandresponses
responses,trainData=np.hsplit(train,[1])
labels,testData=np.hsplit(test,[1])
#InitiatethekNN,classify,measureaccuracy.
knn=cv2.ml.KNearest_create()
knn.train(trainData,cv2.ml.ROW_SAMPLE,responses)
ret,result,neighbours,dist=knn.findNearest(testData,k=5)
correct=np.count_nonzero(result==labels)
accuracy=correct*100.0/10000
print(accuracy)
输出:93.06
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。