我使用OpenCV中的KNearest来实现简单的文字识别OCR。下面是我实现的步骤,学习学习

以下是我的训练数据图:

(训练数据量较少。所有的字母都是相同的字体和大小)。

我用OpenCV编写了一个小代码处理数据:

a)加载图像。

(B)选择数字(是通过轮廓查找并对字母的面积和高度施加约束来避免错误检测)。

(C)给字母绘制边框,并自己按数字键与图中一致

(D)一旦按下相应的数字键,它将该框调整为10x10,并在一个数组中保存100个像素值(此处为示例),并在另一个数组中保存相应的手动输入数字

然后将两个数组保存在单独的txt文件中。

在手动数字分类结束时,训练数据(TRAIN.png)中的所有数字都由我们手工标记,图像如下所示:

下面是用于上述处理的代码:

import sysimport numpy as np
import cv2im = cv2.imread('pitrain.png')
im3 = im.copy()gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)#################      Now finding Contours         ###################contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)samples =  np.empty((0,100))
responses = []
keys = [i for i in range(48,58)]for cnt in contours:if cv2.contourArea(cnt)>50:[x,y,w,h] = cv2.boundingRect(cnt)if  h>28:cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),2)roi = thresh[y:y+h,x:x+w]roismall = cv2.resize(roi,(10,10))cv2.imshow('norm',im)key = cv2.waitKey(0)if key == 27:  # (escape to quit)sys.exit()elif key in keys:responses.append(int(chr(key)))sample = roismall.reshape((1,100))samples = np.append(samples,sample,0)responses = np.array(responses,np.float32)
responses = responses.reshape((responses.size,1))
print "training complete"np.savetxt('generalsamples.data',samples)
np.savetxt('generalresponses.data',responses)

现在进入训练和测试部分。

在测试部分,我使用了下面的图像,它的字母类型是一样的

关于训练

(A)加载我们前面已经保存的txt文件

(B)创建分类器实例(在这里,它是KNeest)

(C)然后使用KNearest.TRANS函数对数据进行训练。

关于测试

(A)我们加载用于测试的图像

(B)像以前一样处理图像,并使用轮廓法提取每一个数字。

c)为其绘制边框,然后调整大小为10x10,并像前面所做的那样将其像素值存储在数组中。

(D)然后我们使用 KNearest.find_nearest()函数的查找最近项,以找到与我们提供的项最接近的项。

我将最后两个步骤(训练和测试)放在下面的代码中:

import cv2
import numpy as np#######   training part    ###############
samples = np.loadtxt('generalsamples.data',np.float32)
responses = np.loadtxt('generalresponses.data',np.float32)
responses = responses.reshape((responses.size,1))model = cv2.KNearest()
model.train(samples,responses)############################# testing part  #########################im = cv2.imread('pi.png')
out = np.zeros(im.shape,np.uint8)
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)for cnt in contours:if cv2.contourArea(cnt)>50:[x,y,w,h] = cv2.boundingRect(cnt)if  h>28:cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)roi = thresh[y:y+h,x:x+w]roismall = cv2.resize(roi,(10,10))roismall = roismall.reshape((1,100))roismall = np.float32(roismall)retval, results, neigh_resp, dists = model.find_nearest(roismall, k = 1)string = str(int((results[0][0])))cv2.putText(out,string,(x,y+h),0,1,(0,255,0))cv2.imshow('im',im)
cv2.imshow('out',out)
cv2.waitKey(0)

得到结果:

这里,精度为100%

OpenCV Python 2 数字识别(K近邻)相关推荐

  1. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  2. Java基于opencv实现图像数字识别(一),java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  3. java图片降噪_Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

  4. 基于 OpenCV + Python 的人脸识别上课签到系统

    目录 前言 安装第三方库 第一步:采集人脸图像 (1)修改姓名学号 (2)运行capture_face.py (3)采集人脸图像 (4)查看采集到的人脸图像 第二步:训练模型 第三步:识别签到 (1) ...

  5. Java基于opencv实现图像数字识别(一)

    Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...

  6. 【项目实战】基于python+pycharm+OpenCV的信用卡数字识别

    一.pycharm实现参数配置 直接运行程序会报错: usage: ocr_template_match.py [-h] -i IMAGE -t TEMPLATE ocr_template_match ...

  7. opencv手写数字识别(未完待续...)

    1. 准备工作 下载MNIST数字集 : http://yann.lecun.com/exdb/mnist/ 使用python将数据集提取出来,转换成图片,转化后图片像这样的 数据集解读和保存如下(代 ...

  8. python 仪表数字识别,利用Python进行数字识别

    思路 通过Python实现KNN算法.而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一 ...

  9. python数字识别_利用Python进行数字识别

    思路 通过Python实现KNN算法.而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一 ...

最新文章

  1. python工控怎么样_搞工控不了解python,好比雄鹰断了翅膀,理由在这里!
  2. SpringBoot的MyBatis generator 注解方式和xml方式 (四)
  3. [转载]上善若水,厚德载物
  4. 第4章 神经网络和误差反向传播法
  5. 【TDA4系列】硬件分析与刷写程序的几种方式
  6. 老男孩Linux运维决心书
  7. 一起来做一个 c++ 单项选择题标准化考试系统
  8. MOS管、IGBT、BJT的区别
  9. html求视频的原尺寸,PR怎样导出原尺寸视频?
  10. cad里面f命令用不了_cad命令_CAD命令中 F 命令是什么作用?
  11. 《秘密》BY东野圭吾
  12. 当乐app官方下载android,当乐下载安卓最新版_手机官方版免费安装下载_豌豆荚
  13. S32K144调试记录(一)
  14. 用C语言对一元二次方程求解
  15. 网页简单整合Skype
  16. Excel效率手册:早做完,不加班(套装共3册)
  17. 【Distill 系列:二】CVPR 2019 Distilling Object Detectors with Fine-grained Feature Imitation
  18. Apache的JK插件
  19. ncm 汇集 matlab,ncm-solutions 压缩包中的文件主要是基于matlab的数值计算以及分析功能学习的很好的例程 266万源代码下载- www.pudn.com...
  20. 淘宝虚拟物品自动发货---DiPiPi网店自动发货助手免费版

热门文章

  1. TypeError: Total() missing 1 required positional argument: ‘self‘
  2. CountDownTimer 实现验证码倒计时
  3. Oracle ORA-03137: TTC protocol internal error : [12333] 故障分析
  4. Java之Spring mvc详解(非原创)
  5. thymeleaf+layui 展示table 报500
  6. Chain of Responsibility 责任链模式 MD
  7. OC中的NSArray和NSMutableArray、NSDictionary和NSMutableDictionary用法
  8. 一个apk多个ICON执行入口
  9. solr 3.5 配置及服务器设置
  10. Oracle10g客户端远程连接数据库全过程[转]