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解决鸡兔同笼问题的方法
Dec 20 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
使用python绘制常用的图表
Aug 27 Python
python编程嵌套函数实例代码
Feb 11 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
Django 创建/删除用户的示例代码
Jul 24 Python
python 字典的打印实现
Sep 26 Python
Python读取表格类型文件代码实例
Feb 17 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
Python爬虫之Selenium实现键盘事件
Dec 04 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 检查电子邮件函数(自写)
2014/01/16 PHP
浅谈php自定义错误日志
2015/02/13 PHP
XHProf报告字段含义的解析
2016/05/17 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
跟老齐学Python之再深点,更懂list
2014/09/20 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
python常见的格式化输出小结
2016/12/15 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
python 下载文件的几种方法汇总
2021/01/06 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
医院护士求职自荐信格式
2013/09/21 职场文书
法定代表人身份证明书
2014/09/10 职场文书
聘任合同书
2015/09/21 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
MSSQL基本语法操作
2022/04/11 SQL Server