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自动化测试之setUp与tearDown实例
Sep 28 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
Python依赖包迁移到断网环境操作
Jul 13 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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&mysql(六)
2006/10/09 PHP
利用PHP和AJAX创建RSS聚合器的代码
2007/03/13 PHP
php启动时候提示PHP startup的解决方法
2013/05/07 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
Python urlopen 使用小示例
2008/09/06 Python
Python深入学习之内存管理
2014/08/31 Python
Python实现的简单发送邮件脚本分享
2014/11/07 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
应用电子专业学生的自我评价
2013/10/16 职场文书
研讨会主持词
2014/04/02 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
十八大标语口号
2014/10/09 职场文书
公司年会主持词范文!
2019/05/07 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript