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中的split()函数的使用方法
Apr 07 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 Python
python将unicode转为str的方法
Jun 21 Python
python中的set实现不重复的排序原理
Jan 24 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
Python简单处理坐标排序问题示例
Jul 11 Python
Django 1.10以上版本 url 配置注意事项详解
Aug 05 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
Mar 30 Python
python topk()函数求最大和最小值实例
Apr 02 Python
Python字符串格式化f-string多种功能实现
May 07 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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
提问的智慧(2)
2006/10/09 PHP
使用数据库保存session的方法
2006/10/09 PHP
php 破解防盗链图片函数
2008/12/09 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
分享Python字符串关键点
2015/12/13 Python
Python模拟登录验证码(代码简单)
2016/02/06 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
python 多进程队列数据处理详解
2019/12/23 Python
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
自荐信格式技巧有哪些呢
2013/11/19 职场文书
服装公司总经理岗位职责
2013/11/30 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
项目转让协议书
2014/10/27 职场文书
2014年保密工作总结
2014/11/22 职场文书
三下乡个人总结
2015/03/04 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
2015元旦感言
2015/12/09 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python