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 heapq使用详解及实例代码
Jan 25 Python
python re模块findall()函数实例解析
Jan 19 Python
python实现windows下文件备份脚本
May 27 Python
django ajax json的实例代码
May 29 Python
python 移除字符串尾部的数字方法
Jul 17 Python
python实现dijkstra最短路由算法
Jan 17 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
Apr 30 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
python关于变量名的基础知识点
Mar 03 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 Python
Python基本的内置数据类型及使用方法
Apr 13 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版(3)
2006/10/09 PHP
require(),include(),require_once()和include_once()的异同
2007/01/02 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
PHP单态模式简单用法示例
2016/11/16 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
JSONP之我见
2015/03/24 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
基于python select.select模块通信的实例讲解
2017/09/21 Python
Python numpy 常用函数总结
2017/12/07 Python
Python中的self用法详解
2019/08/06 Python
python统计文章中单词出现次数实例
2020/02/27 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
农村改厕实施方案
2014/03/22 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技