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统计日志中每个IP出现次数的方法
Jul 06 Python
python导入时小括号大作用
Jan 10 Python
python 内置函数filter
Jun 01 Python
Python计算斗牛游戏概率算法实例分析
Sep 26 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
Python跳出多重循环的方法示例
Jul 03 Python
opencv python如何实现图像二值化
Feb 03 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
php中的比较运算符详解
2013/10/28 PHP
prototype 中文参数乱码解决方案
2009/11/09 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
jquery遍历json对象集合详解
2016/05/18 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
JavaScript基础之流程控制语句的用法
2017/08/31 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
Python中getpass模块无回显输入源码解析
2018/01/11 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
如何理解python对象
2020/06/21 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
前台文员岗位职责
2013/12/28 职场文书
2014的自我评价
2014/01/13 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
2016新年慰问信范文
2015/03/25 职场文书
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android