上一期我们通过对实验:银行卡识别 加深了对前面所学openCV图像处理的一些理解
openCV实践项目:银行卡识别_老师我作业忘带了的博客-CSDN博客
本次图片文本检测相对于要容易一些,内容如下:
把一个这样的图片,通过仿射变换转换成那样的图片。
然后再通过 pytesseract 读取图片内容得到图片中的文本就好了。
所用到的知识同样大部分来源于入门opencv的第三篇文章: 第三篇文章
新增知识:仿射变换、ocr识别,下面代码处会有讲解。
注:本文使用现成图片,轮廓检测较为明显,若是自己拍照,建议让轮廓/边缘清晰一些。
在开始前,我们需要去 下载(连接) 一下tesseract-ocr,建议选择一个稳定点的版本下载。
现在完成之后安装的时候点下一步下一步就行了,记得记一下安装路径,下一步要配置环境变量(不配置也可以)
注:即使不配置环境变量也不影响后面在代码中的操作,即这一步可以跳过。不理解环境变量意义的可以看一下这篇文章: 这篇文章
上一步安装完成后,把路径加进去:
打开cmd,输入tesseract -v 得到版本信息,没报错就说明环境变量配置成功。
进行测试,比如我桌面上有这样一张图片:
在cmd中输入:tesseract 图片路径 输出路径 如:
注:这个路径不用手打,直接把图片拖进去。默认的话路径就是C:Userssuichu
然后我的桌面上出现了一个叫result.txt的文本文件:
下载完成之后,有一件事要记得注意一下,我们打开对应的python环境的文件,比如我下载在anaconda中,那我的路径就是:C:Anaconda01Libsite-packagespytesseract 总之,打开它:
这里原本是相对路径,把它手动设置成绝对路径,以防报错。
当然 也可以不管,报错了再回来看。
这一步是用来识别中文的,其实安装的时候有一个选项会问你是否下载中文包,不过比较慢还是自己下载吧。
github下载中文包:下载连接
下载完成后放到tessdata里就好
我们识别下方这句诗:
前者是为了方便代码执行过程中图片处理得如何了,方便我们观察。
后者是为了方便我们管理图的大小,比如resize(img, width=500) 或 resize(img, height=500) 可以把大大小小的图片转换成相应比例的统一宽高的图片,方便我们观察。
由于我们后面仿射变换需要的只是图片中对象的四个角的坐标,因此轮廓检测时把面积最大的轮廓拿出来就行。
此时,第一个轮廓也有可能与第二个轮廓很像或者基本表示同一个轮廓,毕竟图片中的对象不够平整。 我们先一步进行边缘检测,后一步进行轮廓检测。本例中排序完成后,cnts[0]与cnts[1]都是我们想要的那部分。即下一步绿色框中的图片:
由于我们上一步取出好几组(基本上第一组就是了)可能的轮廓(每个轮廓是一组点集,因为图像并不平整,所以我们接下来进行轮廓近似,我们对这几组进行遍历,确定它有四个点就说明是我们想要的答案。 不明白轮廓近似的建议去了解一下。
解释一下这一步和上一步:其实就是我们边缘检测后的图片进行轮廓检测,取出轮廓面积最大的n组轮廓,每个轮廓是一组点集,不一定就是四个点,也可能是100个构成一个轮廓,我们按顺序进行轮廓近似,一般循环到第一遍的时候就可以近似成我们想要的上图的这个轮廓了,我们也就得到了这四个顶点。
我们上一步拿到了那四个点的坐标,那个对应的轮廓也不是平行的,我们要做的就是把“它正过来”,平铺在图片上。
我们首先要确定四个的位置,左上、右上、右下、左上。
两点间距离公式,我们计算最长的宽高,知道宽和高了我们就可以自己规定个矩阵,根据变换矩阵
把原图转换为“铺平 铺满”后的图片:
我们执行上方函数:
对上一步获得的warped进行二值处理,使用pytesseract.image_to_string()即可。
得到结果
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.dbeile.cn/news/2123.html