本文基于之前学习的透视变换、和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识别的小票识别相关推荐

  1. OpenCV学习记录之视频中的火焰检测识别

    主要完成两个视频中火焰的检测,主要结合RGB判据和HIS判据,设定合适的阈值条件,检测出火焰对应像素的区域,将原图二值化,经过中值滤波以及数学形态学的膨胀运算等图像处理,消除一些噪声及离散点,连通一些 ...

  2. Opencv学习笔记 透视变换/单应性变换

    1.透视变换概述 透视变换(Perspective Transformation),又称Homography Transformation. 在计算机视觉领域,空间中同一平面的任意两幅图像通过单应性关 ...

  3. 解决:基于翔云OCR云平台人脸识别结果报错:产品类型错误

    根据官方提供的API文档,人脸识别的识别类型为:21,我的代码中设定的识别类型(typeId)也为21,但却出现"产品类型错误"的提示: 看了代码好久都觉得没错..最后看到官方AP ...

  4. 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)

    人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...

  5. opencv学习笔记五--文件扫描+OCR文字识别

    opencv学习笔记五--文件扫描+OCR文字识别 文件扫描 定义函数 边缘检测 获取轮廓 变换 OCR文字识别 环境配置 代码 文件扫描 # 导入工具包 import numpy as np imp ...

  6. 银行卡号识别python_银行卡号识别 基于 OpenCV 光学字符识别(OCR)

    银行卡号识别 基于 OpenCV 光学字符识别(OCR) 今天的博客文章是我们最近关于光学字符识别(OCR)和计算机视觉的系列的延续. 在之前的博客文章中,我们学习了如何安装Tesseract二进制文 ...

  7. Ocr 图文识别技术——基于百度云OCR技术学习与总结

                                                               Ocr 图文识别技术--基于百度云OCR技术学习与总结 1.百度智能云 控制台   ...

  8. python opencv 文字识别_文本识别 使用 Tesseract 进行 OpenCV OCR 和 文本识别

    文本识别 用 Tesseract 进行 OpenCV OCR 和 文本识 在本教程中,您将学习如何应用OpenCV OCR(光学字符识别).我们将使用OpenCV,Python和Tesseract 执 ...

  9. 利用OpenCV实现基于深度学习的超分辨率处理

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 OpenCV是一个非常强大的计算机视觉处理的工具库.很多小伙伴在入 ...

最新文章

  1. SQL Server使用侦听器IP访问时遇到The target principal name is incorrect. Cannot generate SSPI context...
  2. Powershell RESTAPI 访问Office365
  3. linux 子网和广播地址异常
  4. Java 使用List集合实现图书增删改查
  5. LeetCode 145 ——二叉树的后序遍历
  6. 【剑指offer】面试题38:字符串的排列(Java)
  7. CTF-Crypto密码学
  8. /usr/bin/python^M: 解释器错误: 没有那个文件或目录
  9. 内核参数 linux dd,Linux dd命令使用示例
  10. 机器学习之判别/生成模型小结
  11. MyBatis 一级缓存二级缓存详解
  12. 2003系统企业版镜像服务器,Windows Server 2003 R2/SP2简体中文企业版原版镜像
  13. PC端/电脑端有没有识别二维码并分类的工具
  14. darknet测试voc数据集精度
  15. codeforces 645 D Robot Rapping Results Report 【树形dp】
  16. 新手指南:顶象验证码如何接入微信小程序?
  17. 【战神引擎】修复物品叠加防刷又不影响叠加的使用的教程
  18. Thread详解一(interrupt)
  19. 《夏洛的网》思维导图读书笔记
  20. QTextToSpeech 文本转语音输出

热门文章

  1. Webview中无法触发手势方法(ontouchevent,onfling...)的解决方法
  2. 设置android:sharedUserId=android.uid.system 支持 sdcard读写
  3. 【编程好习惯】避免使用魔数
  4. 无盘XP系统全套安装说明
  5. 2019国内某知名科技公司技术资料
  6. linux下svn(subversion)服务端添加工程及配置权限
  7. 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互
  8. java 课后习题 删除奇数元素下标 然后再删除值为奇数的下标
  9. 十大经典排序算法动画演示
  10. C#LeetCode刷题-多线程