十五天掌握OpenCV——使用kNN对手写数字OCR

魏老师学生——Cecil:学习OpenCV-机器视觉之旅

手写数字的OCR

  1. OpenCV安装包中提供一张图片,上面有5000个手写数字,每个数字重复500次。把图片拆分为20×20的单独数字。这就是特征集。
  2. 每个数字的前250个样本做训练数据,剩余250个样本做测试数据。测试准确率高于90%
  3. 改善准确率:提供更多训练数据。
  4. 保留分类器:避免每次运行程序都需要准备。
  5. 降低内存:将灰度值(uint8)特征转为np.uint8格式。加载数据时转回float32。

代码演示

#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('.image2/classification.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

cells=[np.hsplit(row,100) for row in np.vsplit(gray,50)]

x=np.array(cells)

train=x[:,:50].reshape(-1,400).astype(np.float32)
test=x[:,50:100].reshape(-1,400).astype(np.float32)

k=np.arange(10)
train_labels=np.repeat(k,250)[:,np.newaxis]
test_labels=train_labels.copy()

knn=cv2.KNearest()
knn.train(train,train_labels)
ret,result,neighbours,dist=knn.find_nearest(test,k=5)

matches=result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print(accuracy)

np.savez('knn_data.npz',train=train,train_labels=train_labels)

with np.load('knn_data.npz') as data:
    print(data.files)
    train=data['train']
    train_labels=data['train_labels']

英文字母的OCR

  1. 一部分作为训练样本,一部分作为测试样本。先把字母表转换为ASC码,因为无法直接处理字母。

代码演示

#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt

data=np.loadtxt('letter_recognition.data',dtype='float32',delimiter=',',converters={0:lambda ch:ord(ch)-ord('A')})

train,test=np.vsplit(data,2)

responses,trainData=np.hsplit(train,[1])
labels,testData=np.hsplit(test,[1])

knn=cv2.KNearset()
knn.train=(trainData,responses)
ret,result,neighbours,dist=knn.find_nearset(testData,k=5)

correct=np.count_nonzero(result==labels)
accuracy=correct*100.0/10000
print(accuracy)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值