首页 > 编程知识 正文

基于python的手写体数字识别,python实现手写数字识别

时间:2023-05-06 00:01:53 阅读:8982 作者:2805

好了,我决定锻炼我的问题来解决上述问题。 我想要的是使用OpenCV的KNearest或SVM功能实现简单的OCR。 以下是我的工作方法。 (这只是为了学习如何将KNearest用于简单的OCR目的。

1 )我的第一个问题涉及OpenCV示例附带的letter_recognition.data文件。 我想知道这份文件的内容。

包含文字和该文字的16个功能。

2 )因为我知道如果不了解所有这些功能,就很难实现。 我试过其他几篇论文,对初学者来说有点难。

soijustdecidedtotakeallthepixelvaluesasmyfeatures.((我并不担心准确性或性能。 我只是希望至少能以最低限度的准确性工作。 ) ) )

我为训练数据拍摄了下图:

我知道训练数据的数量很少。 但是所有文字的字体和大小都一样,所以我决定试试)。

为了准备训练数据,我用OpenCV写了一个小代码。 执行以下操作:

加载图像。

选择数字。 通过明显搜索轮廓,对文字的面积和高度施加限制,避免错误检测。

在文字周围绘制边界矩形,然后等待key press manually。 这次是自己按框中文字对应的数字键。

按相应的数字键将框调整为10x10,在一个数组(这里是示例)中存储100个像素值,在另一个数组(这里是响应)中存储手动输入的数字。

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

手动数字分类结束后,列车数据(train.png )中的所有数字都是我们自己手动标记的。 图像如下。

以下是我用于上述目的的代码(当然,不干净)。

importsysimportnumpyasnpimportcv2im=cv2.im read (' pi train.png ' ) im3=im.copy ) (gray=cv2.cvtcolor ),im,cvtcolor 2 ) # # # # # # nowfindingcontours # # cv2.retr _ list,cv2.CHAIN_APPROX_SIMPLE ) samples=NP.empty((0, 100 ) ) responses=[ ] keys=[ iforiinrances ] 58 ) forcntincontours : ifcv2. contour area (CNT ) 50:[x,y,w, h]=cv2.boundingrect ) CNT ) ifh283360cv2.即2 ) roi=thresh[y:y h,x : xw ] ROI small=cv2.resize (ROI,) im ) key=cv2.waitkey(0) ifkey==27:# (escapetoquit ) sys.exit ) ) elifkeyinkeys 3360 responses.append (int ) ) elifkeys360responses.ap 100 ) samples=NP . 0 ) responses=NP.array ) responses,np.float32 ) responses=responses 1) print ' training complete ' NP.savetxt (gent )

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

为了测试零件,我使用了下面的照片。 这张照片和我训练的文字是同一类型。

在培训方面,我们将:

加载以前保存的txt文件

创建我们正在使用的分类器的实例。 这里是KNearest

然后,使用KNearest.train函数训练数据

为了测试目的,请执行以下操作:

加载用于测试的图像

早期处理图像,使用轮廓法提取每个数字

绘制边框,将大小调整为10x10,然后像以前那样将像素值存储在数组中。

然后,使用KNearest.find_nearest ()函数查找与给定项目最接近的项目。 运气好的话,会识别正确的数字。 )

在下面的一个代码中包含了最后两个步骤“培训和测试”。

导入c v2导入端口numpyasnp # # # # training部件# # # # # # # # # samples=NP.load txt (general samples.) ) general samples NP.float 32 (responses=NP.load txt (general responses.data 1 ) model=cv2.KNearest () model.train ) samples, responses ) # # # # # # # # # # # # # # # # # # testing part # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # cv2.COLOR_BGR2GRAY ) thresh=cv2.adaptivethreshold ) gray,255,1,1,11 cv2.retr _ list,cv2.chain _ approx y () x w,y h ),0,255,0 ),2 ) roi=thresh[y:y h,x : xw ] ROI small=cv2.resize (ROI,((10,10 ) ) ) 1110 dists=model.find_nearest ) ROIsmall,k string,(x,y h ),0,1,(0,255,0 ) ) cv2.imshow ),im ) cv2.y

有效果了。 以下是我得到的结果。

在这里,以100%的精度动作。 我想这是因为所有的数字都是相同的种类和大小。

但是,无论如何,这对初学者来说是个好的开始。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。