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编写脚本使IE实现代理上网的教程
Apr 23 Python
浅析Python中的多重继承
Apr 28 Python
python写入xml文件的方法
May 08 Python
python实现识别相似图片小结
Feb 22 Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 Python
Python列表解析配合if else的方法
Jun 23 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
Python模块相关知识点小结
Mar 09 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
Python中快速掌握Data Frame的常用操作
Mar 31 Python
Python机器学习三大件之一numpy
May 10 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+ajax 无刷新删除数据
2010/02/20 PHP
php学习笔记 PHP面向对象的程序设计
2011/06/13 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
javascript实现的listview效果
2007/04/28 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
JS前端笔试题分析
2016/12/19 Javascript
js实现无缝滚动图
2017/02/22 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
Python中实现的RC4算法
2015/02/14 Python
Python找出9个连续的空闲端口
2016/02/01 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
python实现图片转字符小工具
2019/04/30 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
学校社会实践活动总结
2014/07/03 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
个人向公司借款协议书
2014/10/09 职场文书
英文自荐信范文
2015/03/25 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书