【opencv学习】基于透视变换和OCR识别的小票识别
本文基于之前学习的透视变换、和OCR识别,做了个简单的小票识别,如下:
import cv2
import numpy as np
from PIL import Image
import pytesseract as tessdsize = (55, 88) # 统一尺度# 展示图像,封装成函数
def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0) # 等待时间,单位是毫秒,0代表任意键终止cv2.destroyAllWindows()# =========================================================
# ================读取图像进行预处理=========================
# =========================================================# 读取原始的彩色图像
ocr_img = cv2.imread('images/ocr_qr_code.PNG')
h_src, w_src, c_src = ocr_img.shape# 进行灰度值和二值化转换
ocr_img_gray = cv2.cvtColor(ocr_img, cv2.COLOR_BGR2GRAY)
# cv_show_image('template_gray', template_gray)# 高斯滤波
ocr_img_gray = cv2.GaussianBlur(ocr_img_gray, (3, 3), 1)# 二值化
ret, ocr_img_thresh = cv2.threshold(ocr_img_gray, 200, 255, cv2.THRESH_BINARY)
cv_show_image('template_thresh', ocr_img_thresh)# 找到所有的轮廓。只需要外轮廓
ocr_img_contours, hierarchy = cv2.findContours(ocr_img_thresh,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# =========================================================
# ================找到最大面积的那个轮廓=========================
# =========================================================
# 找到最大面积的那个轮廓
draw_img = ocr_img.copy() # 阶段性测试查看使用
# 最后的参数可以控制找到前几个最大的。比如哈,0表示最大的,2表示前三大的。
cont_max = sorted(ocr_img_contours, key=cv2.contourArea, reverse=True)[0] # 按照面积来排序,找到最大的,倒序。# 画出这个轮廓,红色线条
x, y, w, h = cv2.boundingRect(cont_max)
draw_img = cv2.drawContours(draw_img, [cont_max], -1, color=(0, 0, 255), thickness=2) # 画出这个轮廓,会在原图上画
arcLength = cv2.arcLength(cont_max, True) # 求最大的轮廓的周长# 这个原始轮廓可能是很多歌点哈,但是我们只需要四个点的四边形的轮廓就行了。这里需要进行轮廓近似运算。
# 不断的尝试提升阈值,增大近似范围,减少边数目。
rate = 0.01
approx_max = None
while len(cont_max) != 4:# epsilon是原始轮廓到近似轮廓的最大距离,也是近似的判断阈值。 closed 是表示是个封闭的轮廓approx_max = cv2.approxPolyDP(cont_max, epsilon=rate * arcLength, closed=True)if len(approx_max) == 4:print("rate={}, epsilon={}".format(rate, rate * arcLength))breakrate += 0.01print("approx: ", approx_max)
# 画出这个轮廓,绿色线条
draw_img = cv2.drawContours(draw_img, [approx_max], -1, color=(0, 255, 0), thickness=2) # 画出这个轮廓,会在原图上画cv_show_image('rectangle_contours_img', draw_img)
del draw_img# =========================================================
# ================得到了四个顶点,进行透视变换=========================
# =========================================================# 先排序这个四个顶点,按照((左上),(右上),(右下),(坐下))的顺序来定义
# 最终这四个点将转成((0,0), (w,0), (w,h), (h,w)) + 平移(左上)的形式。def sort_dotCnt(kps):rect = np.zeros((4, 2), dtype='float32')s = kps.sum(axis=1)# 找出左上和右下rect[0] = kps[np.argmin(s)]rect[2] = kps[np.argmax(s)]# 找出右上和左下diff = np.diff(kps, axis=1)rect[1] = kps[np.argmin(diff)]rect[3] = kps[np.argmax(diff)]return rectprint(approx_max.shape)
print(approx_max.reshape(4, 2))
rect_ordered = sort_dotCnt(approx_max.reshape(4, 2))
(top_left, top_right, bottom_right, bottom_left) = rect_ordered# 原始图像中物体的四个顶点的信息
pts_src = np.array([top_left, top_right, bottom_right, bottom_left], dtype="float32")
# 目标物体中的物体的四个顶点信息
pts_dst = np.array([(0 + top_left[0], 0 + top_left[1]),(w + top_left[0], 0 + top_left[1]),(w + top_left[0], h + top_left[1]),(0 + top_left[0], h + top_left[1])], dtype="float32")# 是一个3x3的矩阵,根据对应的两个点,计算出变换矩阵,由此将原始图像进行转换。
M = cv2.getPerspectiveTransform(pts_src, pts_dst)
# 基于单应性矩阵,将原始图像转换成目标图像
im_out = cv2.warpPerspective(ocr_img_thresh, M, (w_src, h_src))
cv_show_image('im_out', im_out)# =========================================================
# ================识别其数字=========================
# =========================================================textInImage = Image.fromarray(im_out)
text = tess.image_to_string(textInImage)
print("\nocr detect result:%s" % text)
原图经过预处理后:
经过轮廓检测后,得到一个四个顶点的轮廓用绿色线画出
经过透视变换得到:
最后用过OCR识别得到:
目前智能识别到数字,下一次,我将去看看学习下怎么识别简体汉字
【opencv学习】基于透视变换和OCR识别的小票识别相关推荐
- OpenCV学习记录之视频中的火焰检测识别
主要完成两个视频中火焰的检测,主要结合RGB判据和HIS判据,设定合适的阈值条件,检测出火焰对应像素的区域,将原图二值化,经过中值滤波以及数学形态学的膨胀运算等图像处理,消除一些噪声及离散点,连通一些 ...
- Opencv学习笔记 透视变换/单应性变换
1.透视变换概述 透视变换(Perspective Transformation),又称Homography Transformation. 在计算机视觉领域,空间中同一平面的任意两幅图像通过单应性关 ...
- 解决:基于翔云OCR云平台人脸识别结果报错:产品类型错误
根据官方提供的API文档,人脸识别的识别类型为:21,我的代码中设定的识别类型(typeId)也为21,但却出现"产品类型错误"的提示: 看了代码好久都觉得没错..最后看到官方AP ...
- 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)
人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...
- opencv学习笔记五--文件扫描+OCR文字识别
opencv学习笔记五--文件扫描+OCR文字识别 文件扫描 定义函数 边缘检测 获取轮廓 变换 OCR文字识别 环境配置 代码 文件扫描 # 导入工具包 import numpy as np imp ...
- 银行卡号识别python_银行卡号识别 基于 OpenCV 光学字符识别(OCR)
银行卡号识别 基于 OpenCV 光学字符识别(OCR) 今天的博客文章是我们最近关于光学字符识别(OCR)和计算机视觉的系列的延续. 在之前的博客文章中,我们学习了如何安装Tesseract二进制文 ...
- Ocr 图文识别技术——基于百度云OCR技术学习与总结
Ocr 图文识别技术--基于百度云OCR技术学习与总结 1.百度智能云 控制台 ...
- python opencv 文字识别_文本识别 使用 Tesseract 进行 OpenCV OCR 和 文本识别
文本识别 用 Tesseract 进行 OpenCV OCR 和 文本识 在本教程中,您将学习如何应用OpenCV OCR(光学字符识别).我们将使用OpenCV,Python和Tesseract 执 ...
- 利用OpenCV实现基于深度学习的超分辨率处理
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 OpenCV是一个非常强大的计算机视觉处理的工具库.很多小伙伴在入 ...
最新文章
- SQL Server使用侦听器IP访问时遇到The target principal name is incorrect. Cannot generate SSPI context...
- Powershell RESTAPI 访问Office365
- linux 子网和广播地址异常
- Java 使用List集合实现图书增删改查
- LeetCode 145 ——二叉树的后序遍历
- 【剑指offer】面试题38:字符串的排列(Java)
- CTF-Crypto密码学
- /usr/bin/python^M: 解释器错误: 没有那个文件或目录
- 内核参数 linux dd,Linux dd命令使用示例
- 机器学习之判别/生成模型小结
- MyBatis 一级缓存二级缓存详解
- 2003系统企业版镜像服务器,Windows Server 2003 R2/SP2简体中文企业版原版镜像
- PC端/电脑端有没有识别二维码并分类的工具
- darknet测试voc数据集精度
- codeforces 645 D Robot Rapping Results Report 【树形dp】
- 新手指南:顶象验证码如何接入微信小程序?
- 【战神引擎】修复物品叠加防刷又不影响叠加的使用的教程
- Thread详解一(interrupt)
- 《夏洛的网》思维导图读书笔记
- QTextToSpeech 文本转语音输出
热门文章
- Webview中无法触发手势方法(ontouchevent,onfling...)的解决方法
- 设置android:sharedUserId=android.uid.system 支持 sdcard读写
- 【编程好习惯】避免使用魔数
- 无盘XP系统全套安装说明
- 2019国内某知名科技公司技术资料
- linux下svn(subversion)服务端添加工程及配置权限
- 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互
- java 课后习题 删除奇数元素下标 然后再删除值为奇数的下标
- 十大经典排序算法动画演示
- C#LeetCode刷题-多线程