OpenCV-Python中的简单数字识别OCR?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (2518)

我试图在OpenCV-Python(CV2)中实现一个“数字识别OCR”。。我想知道OpenCV中的KNeest和SVM特性。

我有每一个数字的100个样本(图像)。我想训练它们。

有一个样本letter_recog.py这是OpenCV样本提供的。但我不知道怎么使用它。

import numpy as np
import cv2

fn = 'letter-recognition.data'
a = np.loadtxt(fn, np.float32, delimiter=',', converters={ 0 : lambda ch : ord(ch)-ord('A') })
samples, responses = a[:,1:], a[:,0]

model = cv2.KNearest()
retval = model.train(samples,responses)
retval, results, neigh_resp, dists = model.find_nearest(samples, k = 10)
print results.ravel()

它创建了一个20000纬度的数组,我不知道它的用途是什么。

问题:

1)什么是 letter_recognition.data数据文件?如何使用我的数据构造这个文件?

2)results.reval()是什么?

3)如何编写一个简单的数字识别工具(用KNest还是SVM)?

提问于
用户回答回答于

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

1)我的第一个问题是关于OpenCV示例附带的数据文件。我想知道文件里有什么。

它包含一个字母,以及该字母的16个特征。

this SOF帮我找到了。本文对这16个特征进行了说明。使用Holland分类器进行字母识别

2)如果不了解这些特性,就很难做。所以能实现就好,我没有太关注性能

以下是我的训练数据图:

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

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

a)加载图像。

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

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

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

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

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

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

import sys

import numpy as np
import cv2

im = 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%

热门问答

怎么使用rsa?

Tina

腾讯云 · 产品经理 (已认证)

Go Serverless!
推荐
您好,可以在在本地安装rsa module后,将依赖一起打zip包上传SCF运行。https://pypi.org/project/rsa/ 在本地做SCF项目的编辑和部署,推荐您使用tcf cli,更加方便高效。 https://github.com/tencentyun/tc...... 展开详请

5.17 更新的备案材料下载是怎么回事?

为了减少下载错误的核验单模板,官网文档中《网站真实性核验单》下载入口已经下掉,可以按照如下方式操作: 1、在备案流程中——上传资料——核验单环节下载 2、在了解备案的省份、单位性质后,可在工单中提供对应省份的核验单模板给到你。 ... 展开详请

域名在腾讯备的案,解析的腾讯云,现在想把域名解析到别商家的服务器,腾讯云会把备案注销吗?

software微软、谷歌、腾讯、阿里、百度……
推荐

接入商都是有责任对备案进行定期核查的,核查中如果客户在腾讯云进行了备案未解析腾讯云服务器是需要重新解析腾讯云服务器的,否则会被取消接入,反之解析了服务器未进行备案各家接入商也是有相应的限制的,比如:腾讯云对未在腾讯云备案的域名会进行未备案阻断。

对象存储COS有没有日志功能?

Hyman Wang

腾讯云 · 高级产品经理 (已认证)

推荐已采纳

你的cos 是否开通了 CDN 加速,如果开通了CDN 加速,可以去 CDN 的控制台下: (统计分析 --- 监控 )页面下拉到底部,可以通过 URL 查看流量情况。

对象存储里的视频能在线播放么?

Jinqn

腾讯 · 高级工程师 (已认证)

腾讯云COS前端开发
推荐

购买的云数据库里面有什么类型的数据库?有SQLserver吗?可以自己安装SQLserver吗?

帅的惊动我国计算机大神
推荐已采纳
云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服...... 展开详请

所属标签

扫码关注云+社区