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网络编程学习笔记(10):webpy框架
Jun 09 Python
Python判断操作系统类型代码分享
Nov 22 Python
Python实现设置windows桌面壁纸代码分享
Mar 28 Python
使用Python的Django框架实现事务交易管理的教程
Apr 20 Python
Python多线程下载文件的方法
Jul 10 Python
django之session与分页(实例讲解)
Nov 13 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
redis之django-redis的简单缓存使用
Jun 07 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 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中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
php中使用GD库做验证码
2016/03/31 PHP
Jquery 的扩展方法总结
2011/10/01 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
Python 常用模块 re 使用方法详解
2019/06/06 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
市场营销专业毕业生自荐信
2013/11/02 职场文书
大学生写自荐信的技巧
2014/01/08 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
幽默导游词开场白
2015/05/29 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
初二英语教学反思
2016/02/15 职场文书
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android