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使用pil生成缩略图的方法
Mar 26 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
Python中pillow知识点学习
Apr 30 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
Django 反向生成url实例详解
Jul 30 Python
python定时任务 sched模块用法实例
Nov 04 Python
django 外键创建注意事项说明
May 20 Python
Python 使用office365邮箱的示例
Oct 29 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
python cv2图像质量压缩的算法示例
Jun 04 Python
详解pytorch创建tensor函数
Mar 22 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
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
extjs render 用法介绍
2013/09/11 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
使用Python开发windows GUI程序入门实例
2014/10/23 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
Django实现登录随机验证码的示例代码
2018/06/20 Python
详解python while 函数及while和for的区别
2018/09/07 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
自我查摆剖析材料
2014/10/11 职场文书
楚门的世界观后感
2015/06/03 职场文书
于丹论语心得观后感
2015/06/15 职场文书
离职信范本
2015/06/23 职场文书
环保守法证明
2015/06/24 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis