学习opencv——手写数字识别(1)
来源:互联网 发布:干扰摄像头软件下载 编辑:程序博客网 时间:2024/04/29 20:48
OCR(Optical Character Recognition,光学字符识别),如今已经广泛的运用到了各种领域。本次创建一个识别手写数字的程序,使用的是knn算法,属于机器学习中的监督学习,需要大量的训练数据样本进行训练,然后根据训练结果进行识别。
图中绿色的点会根据k的值取值,再根据取到值颜色的多少来判断绿色的点是属于红色还是蓝色。把这个过程就叫做分类。
OpenCV安装包里有一张图片digits.png(如下图),图片上是5000个手写数字,每个数字重复500遍,分别是0-9。每个数字都是20x20的小图。我们将这个图片在重新排成一行含有400个像素点的新图像。以这个为特征集,所有像素的灰度值。
1.运行环境
操作系统:win7 64位
python3.5.2
opencv3.2
2.主要方法
cv2.ml.KNearest_create()
创建一个K-Nearest Neighbour分类器
3.代码
import numpy as npimport cv2#读取图片转为灰度图img = cv2.imread('digits.png')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#把图片分隔成5000个,每个20x20大小cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]#再转成numpy数组x = np.array(cells)#一半用来训练的数组,一半用来测试的数组train = x[:,:50].reshape(-1,400).astype(np.float32)test = x[:,50:100].reshape(-1,400).astype(np.float32)#创建训练和测试的标签k = np.arange(10)train_labels = np.repeat(k,250)[:,np.newaxis]test_labels = train_labels.copy()#创建一个K-Nearest Neighbour分类器,训练数据,然后用测试数据测试它knn = cv2.ml.KNearest_create()knn.train(train,cv2.ml.ROW_SAMPLE,train_labels)ret,result,neighbours,dist = knn.findNearest(test,k=5)#最终检查测试的精确度,比较结果,检查哪些是错误的,最终输出正确率matches = result == test_labelscorrect = np.count_nonzero(matches)accuracy = correct*100.0 / result.sizeprint(accuracy)
跑一遍程序,最终得到准确率为91.76%。
4.优化
在运行的过程中每次都会去读取图片,准备训练分类器,我们可以运行一次后把它保留下来,下次运行的时候,直接读取这些数据,大大提高运行的效率。
#保存数据np.savez('data.npz',train=train, train_labels=train_labels)
#下次运行时读取with np.load('data.npz') as data: print data.files train = data['train'] train_labels = data['train_labels']
想要提高手写数字识别率,只有不断的增加训练的样本。
0 0
- 学习opencv——手写数字识别(1)
- 学习opencv——手写数字识别(2)
- 机器学习xgboost实战—手写数字识别 (DMatrix)
- 手写数字识别【QT+OpenCV】
- 机器学习实战——手写数字识别
- 《学习Tensorflow》——MNIST手写数字识别
- 机器学习-tensorflow入门教程二——识别手写数字
- Python scikit-learn 学习笔记—手写数字识别
- 机器学习xgboost实战—手写数字识别
- 机器学习xgboost实战—手写数字识别
- 学习KNN(二)KNN算法手写数字识别的OpenCV实现
- 学习OpenCV——SVM 手写数字检测
- 学习OpenCV——SVM 手写数字检测
- 学习OpenCV——SVM 手写数字检测
- 学习OpenCV——SVM 手写数字检测
- Opencv手写数字识别(Opencv3.0+KNN+HOG特征)
- 基于贝叶斯变换的手写识别数字(MFC+Opencv)
- 基于opencv的手写数字识别(MFC,HOG,SVM)
- 拿状态栏高度
- JS 计算两个日期之间的相差天数
- 由微信指数联想到大数据的两种应用方式
- Linux 内核时钟之触发local timer
- Intellij IDEA 快捷键整理
- 学习opencv——手写数字识别(1)
- 递推递归练习E
- Spring Boot Admin 的使用
- spring boot LoginInterceptor(登录拦截器)无法注入bean
- 奇怪的问题的记录
- 基于字典的图像超分辨率实现
- maven基础
- leetcode解题之374. Guess Number Higher or Lower Java版 (猜数字大小二分查找)
- 反素数