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写的图片蜘蛛人代码
Aug 27 Python
python实现的阳历转阴历(农历)算法
Apr 25 Python
Python中的ceil()方法使用教程
May 14 Python
在Django中创建动态视图的教程
Jul 15 Python
python实现图书管理系统
Mar 12 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
Django中ORM的基本使用教程
Dec 22 Python
分享一个python的aes加密代码
Dec 22 Python
用python制作个视频下载器
Feb 01 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安全配置 如何配置使其更安全
2011/12/16 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
python将ip地址转换成整数的方法
2015/03/17 Python
python发送邮件实例分享
2017/07/28 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
python实现人脸签到系统
2020/04/13 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
Linux常见面试题
2016/10/04 面试题
12.4法制宣传日活动总结
2014/08/26 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
2014年调度员工作总结
2014/11/19 职场文书
就业推荐表导师评语
2014/12/31 职场文书
学雷锋团日活动总结
2015/05/06 职场文书
golang正则之命名分组方式
2021/04/25 Golang
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python