opencv python 基于KNN的手写体识别的实例


Posted in Python onAugust 03, 2018

OCR of Hand-written Data using kNN

OCR of Hand-written Digits

我们的目标是构建一个可以读取手写数字的应用程序, 为此,我们需要一些train_data和test_data. OpenCV附带一个images digits.png(在文件夹opencv\sources\samples\data\中),它有5000个手写数字(每个数字500个,每个数字是20x20图像).所以首先要将图片切割成5000个不同图片,每个数字变成一个单行400像素.前面的250个数字作为训练数据,后250个作为测试数据.

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('digits.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Now we split the image to 5000 cells, each 20x20 size
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]

# Make it into a Numpy array. It size will be (50,100,20,20)
x = np.array(cells)

# Now we prepare train_data and test_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)

# Create labels for train and test data
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()

# Initiate kNN, train the data, then test it with test data for k=1
knn = cv2.ml.KNearest_create()
knn.train(train, cv2.ml.ROW_SAMPLE, train_labels)
ret,result,neighbours,dist = knn.findNearest(test,k=5)

# Now we check the accuracy of classification
# For that, compare the result with test_labels and check which are wrong
matches = result==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/result.size
print( accuracy )

输出:91.76

进一步提高准确率的方法是增加训练数据,特别是错误的数据.每次训练时最好是保存训练数据,以便下次使用.

# save the data
np.savez('knn_data.npz',train=train, train_labels=train_labels)

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

OCR of English Alphabets

在opencv / samples / data /文件夹中附带一个数据文件letter-recognition.data.在每一行中,第一列是一个字母表,它是我们的标签. 接下来的16个数字是它的不同特征.

import numpy as np
import cv2
import matplotlib.pyplot as plt


# Load the data, converters convert the letter to a number
data= np.loadtxt('letter-recognition.data', dtype= 'float32', delimiter = ',',
          converters= {0: lambda ch: ord(ch)-ord('A')})

# split the data to two, 10000 each for train and test
train, test = np.vsplit(data,2)

# split trainData and testData to features and responses
responses, trainData = np.hsplit(train,[1])
labels, testData = np.hsplit(test,[1])

# Initiate the kNN, classify, measure accuracy.
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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入理解Python 代码优化详解
Oct 27 Python
python使用calendar输出指定年份全年日历的方法
Apr 04 Python
Python实现决策树C4.5算法的示例
May 30 Python
python 以16进制打印输出的方法
Jul 09 Python
Python中捕获键盘的方式详解
Mar 28 Python
python处理“
Jun 10 Python
python 采用paramiko 远程执行命令及报错解决
Oct 21 Python
python实现淘宝购物系统
Oct 25 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Python实现的扫码工具居然这么好用!
Jun 07 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 #Python
python使用opencv驱动摄像头的方法
Aug 03 #Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 #Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 #Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 #Python
python中copy()与deepcopy()的区别小结
Aug 03 #Python
Python爬取个人微信朋友信息操作示例
Aug 03 #Python
You might like
php查询ip所在地的方法
2014/12/05 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
JS高级笔记
2011/07/13 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
python计算圆周率pi的方法
2015/07/11 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
互动出版网:专业书籍
2017/03/21 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
管理学专业个人求职信范文
2013/09/21 职场文书
烹饪自我鉴定
2014/03/01 职场文书
节能减耗标语
2014/06/21 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
个人求职意向书
2015/05/11 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
mysql的Buffer Pool存储及原理
2022/04/02 MySQL