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 re正则表达式模块(Regular Expression)
Jul 16 Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
python执行shell获取硬件参数写入mysql的方法
Dec 29 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
CentOS7下python3.7.0安装教程
Jul 30 Python
Python3实现腾讯云OCR识别
Nov 27 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 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
西德产收音机
2021/03/01 无线电
PHP开发中常用的8个小技巧
2008/08/27 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
php实现购物车功能(上)
2020/07/23 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
异步加载script的代码
2011/01/12 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
Jquery attr("checked") 返回checked或undefined 获取选中失效
2013/10/10 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
js 开发之autocomplete="off"在chrom中失效的解决办法
2017/09/28 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
Python异常处理总结
2014/08/15 Python
python多进程操作实例
2014/11/21 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
Python入门学习指南分享
2018/04/11 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
python仿抖音表白神器
2019/04/08 Python
Python集合操作方法详解
2020/02/09 Python
Python版中国省市经纬度
2020/02/11 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
如何在django中实现分页功能
2020/04/22 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
售后服务承诺书
2014/03/26 职场文书
给孩子的新年寄语
2014/04/08 职场文书
在职证明范本
2015/06/15 职场文书
七夕情人节问候语
2015/11/11 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python