当前位置:首页 > 资讯 > 正文

【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】

本实验的目的主要是实现诸如发票,pdf扫描成的图片,如何可以实现找到发票(这里都用发票指代了)外轮廓,把桌面等信息消除,直接将发票清晰摆正呈现,方便后续的OCR识别。 2.本次实验的重点在于预处理-找到外轮廓外接矩形-透视变换摆正图片,最终的OCR扫描可以参考我的博客【Python】图像文字识别:从图片中识别出文字(Pytesseract安装配置与使用),以前已经实现过,就不赘述。用百度API也可以,效果会更好,也已经实现。

主要想讲的是图1到图2过程: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】

 

原图太大,现需要resize: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 灰度: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 高斯: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 !!!!这里需要注意Resize时候:!!!! resize图片时候比例不要用设置好的一个值,比如定好h是500,则:

 

这样可以,但是在后面轮廓划定,透视变化摆正图像时(如下面代码),会出现倾斜情况:

 

【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 因此resize图片时候比例我们直接设置比例,不用ratio值:

 

后面透视变换摆正图像时候直接乘以1/fx即可(此处5倍):

 

重点是近似计算找轮廓!!! approx=cv2.approxPolyDP(c, 0.02* peri, True) # 检测出来的轮廓可能是离散的点,故因在此做近似计算,使其形成一个矩形。做精度控制,原始轮廓到近似轮廓的最大的距离,较小时可能为多边形;较大时可能为矩形。 这里的值如果太小,比如0.0002等,可能近似轮廓是多边形,不是矩形,因此选择0,02即可。 注意:对于findContours: cnts可能有几百个轮廓,里面的各种字都会被圈出来,一般外围轮廓是最大,所以直接进行排序,再从里面找,会更简单。

 

刚开始不知道,所有的在一起找,由于精度问题没太懂,就浪费了很多时间找外围轮廓。

上代码:

 

【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】

重点是:four_point_transform(resize_image, screenCnt.reshape(4, 2)) 这个函数导入包即可

 

代码:

 

这里需要注意:如果是在resize后的图上操作可能最终会出现摆正后图像也不清楚的状态,如下所示。 在resize图上对检测后轮廓进行透视变换: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】

因此我们需要对原图进行处理,前面说过,我们已经对原图进行resize时fx=0.2,fy=0.2,缩小了5倍,这里只需要(在原图上,后面对选中轮廓区域点进行乘以1/fx倍)即可: four_point_transform(original_image, screenCnt.reshape(4, 2)5)* 最终效果好,如下图。 在原图上对检测后轮廓进行透视变换: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 原图完胜!!!ヽ(・ω・´メ)

灰度: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 二值后即可用于识别: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】

十分简单,但pytesseract的安装可能会有各种问题,参照这篇博客即可。

 

resize后的原图: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】

结果: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】

效果也可,记得把原图右旋转一下再做。 原图: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 resize后的图: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 找到轮廓: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 结果: 在原图上做的透视变换: 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】 效果还可! 【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】【Opencv】基于python-opencv的CV2实现图片OCR前的扫描摆正OCR识别【代码实现】