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 正则式 概述及常用字符
May 07 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
Python定时器实例代码
Nov 01 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
Django 静态文件配置过程详解
Jul 23 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
详解anaconda安装步骤
Nov 23 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程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
php的socket编程详解
2016/11/20 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
豆瓣网的jquery代码实例
2008/06/15 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
Python入门篇之文件
2014/10/20 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python读写LMDB文件的方法
2018/07/02 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
最新个人职业生涯规划书
2014/01/22 职场文书
环境卫生倡议书
2014/08/29 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
加强作风建设心得体会
2014/10/22 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
先进党组织事迹材料
2014/12/26 职场文书
二审答辩状格式
2015/05/22 职场文书