文章目录

  • 简介
  • 总结
    • 1. 介绍
    • 2. 流程
    • 3. 程序
    • 4. 知识点总结

简介

本节为《OpenCV计算机视觉实战(Python)》版第10讲,项目实战:文档扫描OCR识别,的总结。

总结

1. 介绍

识别图像中的所有的字符(汉字、英语等字体)。

2. 流程

边缘检测:
预处理 + 边缘检测

轮廓检测:
对检测到的轮廓进行排序,排序可以按照轮廓面积的大小,然后得到最大的轮廓(跟图像大小相同的轮廓),轮廓近似,得到四个点的轮廓。

透视变换:
将2维坐标值[x,y]转化为三维齐次坐标[x,y,1],新的坐标[X,Y,Z] ^T= M [x,y,1]^T,
而M=[M11,M12,M13; M21,M22,M23; M31,M32, 1],总共8个未知数,因此需要8个方程来求解。

八个方程:4个坐标点

字符识别:
OCR开源工具包:pytesseract

参考网址:

http://digi.bib.uni-mannheim.de/tesseract/

3. 程序


def resize(image, width=None, height=None, inter=cv2.INTER_AREA):dim = None(h,w) = image.shape[:2]if width is None and height is None:return imageif width is None:r = height / float(h)dim = (int(w*r), height)else:r = width / float(w)dim = (width, int(h*r))resized = cv2.resize(image, dim, interpoation = inter)return resizeddef order_points(pts):# 一共4个坐标点rect = np.zeros((4,2), dtype='float32')# 按顺序找到对应坐标0123,分别是:左上,右上,右下,左下# 计算左上,右下s = pts.sum(axis=1)rect[0] = pts[np.argmin(s)]rect[2] = pts[np.argmax(s)]# 计算右上和左下diff = np.diff(pts, axis = 1)rect[1] = pts[np.argmin(diff)]rect[3] = pts[np.argmax(diff)]return rectdef four_point_transform(image, pts):# 获取输入坐标点rect = order_points(pts)(tl, tr, br, bl) = rect# 计算输入的w 和 h 的值widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) **2))maxwidth = max(int(widthA), int(widthB))heightA = np.sqrt(((tr[0] - br[0]) ** 2 ) + ((tr[1] - br[1] ) ** 2))heigthB = np.sqrt(((tl[0] - bl[0]) **2) + ((tl[1] - bl[1]) **2))maxheigth = max(int(heightA), int(heigthB))# 变换后对应坐标的位置dst = np.array([[0,0],[maxwidth - 1,0],[maxwidth -1, maxheigth-1],[0,maxheight-1]], dtype='float32')# 计算变换矩阵M = cv2.getPerspectiveTransform(rect, dst)warped = cv2.warpPerspective(image, M, (maxwidth, maxheight))# 返回变换后结果return warped# 读取输入
image = cv2.imread('')
# resize后坐标变了,将比例求出,坐标也会相同变化
ratio = image.shape[0]/500.0
orig = image.copy()image = resize(orig, height = 500)# 预处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5,5), 0)  # 高斯滤波去除噪声点
edged = cv2.Canny(gray, 75, 200)  # 边缘检测# 展示预处理结果
print('STEP1:边缘检测')
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 轮廓检测
cnts = cv2.findContours(edged.copy(), cv2.RETE_LIST, cv2.CHAIN_APPROX_SIMPLE)[1]
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]# 遍历轮廓
for c in cnts:# 计算轮廓近似peri = cv2.arcLength(c, TRUE)# C表示输入的点集# epsilon表示从原始轮廓到近似轮廓的最大距离,它是一个准确度参考,越小越接近原始图形,越大越接近矩形;一般跟周长有关系# TRUE表示封闭的approx = cv2.approxPolyDP(c, 0.02 * peri, True)# 4个点的时间就拿出来:此时就是矩形if len(approx) == 4:screeCnt = approxbreak# 显示结果
print('STEP 2 : 获取轮廓')
cv2.drawContours(image, [screenCnt], -1, (0,255,0), 2)
cv2.imshow('OutLine', image)
cv2.waitKey(0)
cv2.destoryAllWindows()# 透视变换
warped = four_point_transform(orig, screenCnt.reshape(4,2)*ratio) # orig原始图像,因此图像必须要*ratio还原坐标点# 二值处理
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)
ref = cv2.threshold(warped, 100, 255, cv2.THRESH_BINARY)[1]
cv2.imwrite('scan.jpg', ref)# 显示结果
print('STEP3:透视变换')
cv2.imshow('Original', resize(orig, height = 650)
cv2.imshow('Scanned', resize(ref, height == 650)
cv2.waitKey(0)
cv2.destroyAllWindows()

由于字符识别不是我主要的研究方向,这里略过字符识别的程序。有需要的同学可以从这里学习。

4. 知识点总结

  • 轮廓近似:如何用四个点近似轮廓,而非矩形近似
  • 四个点排序:左上,右上,右下,左上
  • 透视变换:M矩阵的计算
  • resize:正向和逆向操作
  • 字符识别工具包:tesseract

OpenCV计算机视觉实战(Python)| 10、项目实战:文档扫描OCR识别相关推荐

  1. 文档扫描OCR识别-2

    凯哥英语视频 文档扫描OCR识别-2 凯哥英语视频 1.现有资源梳理 2.实现方案规划 预处理 预测 3.代码实现 注意点 模型安装和其他 结语 1.现有资源梳理 文档扫描OCR识别-1 中处理好的图 ...

  2. opencv项目实战(2)——文档扫描OCR识别

    文章目录 思路 文档扫描 代码 运行结果 文字识别 预处理 代码 运行结果 Debug 记录 思路 STEP 1: 边缘检测 STEP 2: 获取轮廓 STEP 3: 变换 文档扫描 代码 scan. ...

  3. 项目实战——文档扫描OCR识别

    扫描全能王的实现,maybe 目录 一.文档扫描 1.引入所需要的库 2.图像的读取与预处理 读取图像 图像reszie, 图像灰度化.滤波.边缘检测. 3.轮廓检测 4.透视与二值变换 二.文字识别 ...

  4. 计算机视觉-OpenCV(文档扫描OCR识别)

    一.边缘检测 二.获取轮廓 三.变换 四.OCR识别 import cv2 import numpy as np import argparse import pytesseract import o ...

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

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

  6. 【实战】OpenCV+Python项目实战--文档扫描OCR识别

    文章目录 1 准备工作(python) 1.1 np.diff用法 1.2 tesseract和pytesseract安装 2代码实现 2.1 文档提取与摆正 2.2 OCR扫描 1 准备工作(pyt ...

  7. opencv项目实战(二)——文档扫描OCR识别

    一.项目描述 二.代码详解 2.1 预定义参数 2.2 辅助函数 2.3 文档矫正 2.4 文档识别 三.项目完整代码 一.项目描述 目的 将图片中的文档矫正,并识别文档内容 输入与输出 方法流程 核 ...

  8. opencv图像处理—项目实战:文档扫描OCR识别

    目录 1.边缘检测 2.获取轮廓 3.变换 4.tesseract-OCR安装配置 5.使用pycharm运行检测 出现错误 1 出现错误2 出现错误3 出现问题4 完整代码 # 导入工具包 impo ...

  9. 计算机视觉项目-文档扫描OCR识别

最新文章

  1. Struts2工作原理和框架扩展点
  2. json字符串中key值下划线命名转换为驼峰命名
  3. Oauth2.0和1.0区别
  4. RocketMQ常见面试题
  5. python浙江大学城市学院_GitHub - teribsandy/zjcs-tf-code: 浙江大学城市学院的tensorflow项目教学代码(部分)...
  6. 打码(C语言)常见粗心小错误 (前方高能,一定要点)
  7. python输入姓名年龄输出年龄最大的_输入姓名打印年龄练习
  8. 语音识别哪个软件好,教你三种不同的识别方法
  9. 74cms v5.0.1漏洞
  10. catia 快捷键 激活零件_CATIA常用快捷键
  11. Intel Core系列CPU架构演变
  12. python数据处理-整理表格数据
  13. 四柱排盘系统--阳历转农历
  14. Xftp5 安装教程
  15. 关于坐标系(大地坐标、平面坐标、投影、北京54、西安80、WGS84)的一些理解
  16. Python的运行环境
  17. SpringMVC条件查询+分页时下一页丢失查询条件
  18. 攻防世界-MISC-练习区12题解
  19. python实现中文数字转为阿拉伯数字
  20. Arthas-thread命令定位线程死锁

热门文章

  1. python诗歌文件格式处理_Python文件基本操作
  2. R语言求拟合函数图形的交点坐标
  3. mysql5.7固态硬盘查询速度_使用ssd硬盘加速 mysql index查询
  4. 360桌面与QQWEB桌面体验对比
  5. 《LeetCode刷题》804. 唯一摩尔斯密码词(java篇)
  6. Linux C实现用户态协作式多线程!
  7. android ui头像圆角化,APP界面设计当中,为什么喜欢把头像设计成圆形
  8. win2008r2 惠普g160鼠标_惠普电脑装win7键盘鼠标不能用解决方法全集(支持8/9/10代cpu usb)...
  9. 【数据结构与算法】之深入解析“摘樱桃II”的求解思路与算法示例
  10. LPC11U3x系列IAP升级 BootLoader分析