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中使用smtplib和email模块发送邮件实例
Apr 22 Python
Python的Flask框架的简介和安装方法
Nov 13 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python程序运行原理图文解析
Feb 10 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
python实现决策树分类
Aug 30 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Python中join()函数多种操作代码实例
Jan 13 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 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同时支持GIF、png、JPEG
2006/10/09 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
2016/05/17 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
设定php简写功能的方法
2019/11/28 PHP
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
Python中的jquery PyQuery库使用小结
2014/05/13 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
python中实现栈的三种方法
2020/12/19 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
申报职称专业技术个人的自我评价
2013/12/12 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
李白故里导游词
2015/02/12 职场文书
家长会主持词开场白
2015/05/29 职场文书
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL