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编程效率
Feb 16 Python
使用Python对Csv文件操作实例代码
May 12 Python
Python实现判断字符串中包含某个字符的判断函数示例
Jan 08 Python
python多进程提取处理大量文本的关键词方法
Jun 05 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
Python中函数参数匹配模型详解
Jun 09 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
详解python网络进程
Jun 15 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中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
javascript下数值型比较难点说明
2010/06/07 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
Python 私有函数的实例详解
2017/09/11 Python
遗传算法之Python实现代码
2017/10/10 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python实现数据库跨服务器迁移
2018/04/12 Python
django初始化数据库的实例
2018/05/27 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
期末学生评语大全
2014/04/24 职场文书
大学生工作求职信
2014/06/23 职场文书
宣传活动总结范文
2014/07/01 职场文书
小学校长汇报材料
2014/08/20 职场文书
会计人员岗位职责
2015/02/03 职场文书
排球赛新闻稿
2015/07/17 职场文书