openCV实战-系列教程11:文档扫描OCR识别上(轮廓检测/轮廓近似/透视变换/OCR识别)项目实战、源码解读

news2024/7/6 17:51:05

🧡💛💚💙💜OpenCV实战系列总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传

下篇内容:
openCV实战-系列教程13:文档扫描OCR识别下(图像轮廓/模版匹配)项目实战、源码解读

1、运行效果演示

项目界面:
在这里插入图片描述

如果还没有安装openCV,请看这篇安装教程

1.1 输入参数

在运行参数配置界面输入以下指令即可运行

--image ./images/receipt.jpg

2023版pycharm配置运行参数教程
新版本openCV中的cv2.findContours返回值从3个变成了两个
通过修改参数receipt.jpg,可以处理其他的图像数据。

1.2 整体流程与效果

运行打印结果:

C:\Users\Alex\anaconda3\envs\CV\python.exe A:\2_gupao\ocr\scan.py --image ./images/receipt.jpg
STEP 1: 边缘检测
STEP 2: 获取轮廓
STEP 3: 变换
进程已结束,退出代码为 0

原始图像是一张购物小票,是从任意角度拍摄的,需要把这个小票调整到一个正确的角度,然后才能进行文字识别。第一步需要进行边缘检测,得到这个小票。

第二步框出这个小票,这个框起来的过程就是一个轮廓检测。

第三张就需要把这个小票放正了,整齐的排列出来,才能识别出里面的文字,做字符识别的操作。

第四步将这个小票的内容的文字识别出来,即OCR文字识别。

2、图像读取与处理

2.1 数据读取

读取输入

image = cv2.imread(args["image"])
ratio = image.shape[0] / 500.0
orig = image.copy()
image = resize(orig, height=500)
  1. 读取图像
  2. image.shape[0]是原始图像高,500是等下需要resize的高,保存这个比例,因为后续需要对原始图像进行处理,这个时候需要获取这个比例值
  3. 深度复制原始图像
  4. resize原始图像,设置高为500,宽会自动根据比例计算给出,这里的resize函数是我自己写的,主要是通过给定的h,安装原始的长宽比例计算出宽,再用openCV的resize函数(cv2.resize)

2.2 预处理

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 75, 200)
print("STEP 1: 边缘检测")
cv2.imshow("Image", image)
cv2.imshow("Edged", edged)
cv2.waitKey(0)
cv2.destroyAllWindows()
  1. 原始图像灰度处理
  2. 高斯滤波,过滤一些干扰噪声
  3. 边缘检测
  4. 打印文字
  5. 打印原始图像
  6. 打印边缘检测图像
  7. 等待按任意键
  8. 关闭所有窗口

打印结果:

STEP 1: 边缘检测

3、轮廓检测

3.1 获取轮廓

cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:5]
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    if len(approx) == 4:
        screenCnt = approx
        break
  1. 获取轮廓,edged.copy()深度复制图像,RETR_LIST检索所有的轮廓,并将其保存到一条链表当中,CHAIN_APPROX_SIMPLE轮廓逼近方法,获取第一个返回值,全部轮廓
  2. 排序轮廓,这个函数是我自己写的(解析参考这个教程3.3),取出前5个轮廓,因为根据任务不同可能有多个复合的轮廓,比如有三张小票
  3. 遍历每一个轮廓
  4. 计算当前轮廓周长
  5. 计算近似轮廓,实际中的轮廓可能是一些点组成的,因为不规则的轮廓即拟合出大量的点,根据周长百分比0.02 * peri来近似轮廓,这个值设置的大近似出的轮廓可能就是多边形,小可能就是矩形或者三角形
  6. 如果点数是四就是矩形
  7. 如果是矩形,就是我们想要的轮廓,因为小票的轮廓最好是一个矩形,保存这个轮廓
  8. break

3.2 画出轮廓

print("STEP 2: 获取轮廓")
cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2)
cv2.imshow("Outline", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

  1. 打印文字
  2. 画出轮廓,参数分别是原始图像、轮廓信息、全部轮廓、轮廓颜色、轮廓线条粗细
  3. 打印轮廓图像

STEP 2: 获取轮廓

在这里插入图片描述

4 顶点排序函数

我们有A、B、C、D四个点,组成一个不规整的四边形,现在通过下面这个函数,将这四个点的顺序调整到合适的顺序,调整后的结果方便我们把四个点映射成规整的矩形的四个点

def order_points(pts):
    rect = np.zeros((4, 2), dtype="float32")
    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 rect
  1. pts是一个存放原始数据的二维list,一共有4个元素,分别对应ABCD四个点,然后每个元素对应两个值,分别是横坐标和纵坐标。
  2. 构造一个名为rect 结构和pts一样的二维list,里面全部存放0
  3. pts的每个点的横纵坐标加起来,保存一个名为s的有4个元素的list,每个元素分别为A、B、C、D四个点的坐标之和
  4. 求出s最小数对应的索引对应在pts的点的两个坐标值,作为rect 的第1个点的两个坐标
  5. 求出s最大数对应的索引对应在pts的点的两个坐标值,作为rect 的第3个点的两个坐标
  6. 把pts的每个点的纵坐标减去横坐标,保存一个名为diff 的有4个元素的list,每个元素分别为A、B、C、D四个点的坐标之差
  7. 求出diff最小数对应的索引对应在pts的点的两个坐标值,作为rect 的第2个点的两个坐标
  8. 求出diff最大数对应的索引对应在pts的点的两个坐标值,作为rect 的第4个点的两个坐标
  9. 返回rect

下篇内容:

openCV实战-系列教程13:文档扫描OCR识别下(图像轮廓/模版匹配)项目实战、源码解读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李跳跳下载-《告别广告困扰,让李跳跳助力打造清爽浏览体验》

大家好,👋今天我想向大家介绍一款非常好用的应用程序——李跳跳 App 🚀。 随着智能手机的普及,应用程序已经成为了我们日常生活中必不可少的一部分。但是,随之而来的是各种各样的广告,这些广告不仅浪费我们…

【C++】输入输出及格式控制

在各类算法竞赛和机试中,对测试数据和输出格式往往会有明确的规定,笔者结合个人刷题经历,得到了以下C语言输入输出控制的方法。 cin:从缓冲区中读取数据 cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格…

PXE网络批量装机

目录 一、什么是PXE? 二、PXE(Preboot Execution Environment)的主要组件 1、PXE服务器(PXE Server) 2、DHCP服务器(Dynamic Host Configuration Protocol Server) 3、TFTP服务器&#xff…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(四):有损传输线建模

传输线中信号衰减的两个损耗过程是通过信号和返回路径导体的串联电阻以及通过有损耗介电材料的分流电阻。这两个电阻器的电阻都与频率相关。 值得注意的是,理想电阻器的电阻随频率恒定。我们已经证明,在理想的有损传输线中,用于描述损耗的两个…

CAD 中Spline(样条曲线)的创建

我把自己研究的流程留下,读者需慢慢探索: Polyline pl new Polyline(); pl.AddVertexAt(0, new Point2d(2, 2), 0, 0, 0); pl.AddVertexAt(1, new Point2d(5, 5), 0, 0, 0); pl.AddVertexAt(2, new Point2d(10, 3), 0, 0, 0); pl.AddVertexAt(3, new Point2d(15, …

uniapp 布局(自定义导航栏加固定高度的主要内容)

不想让整体页面出现滚动条 页面大致分为三部分,导航栏、主题内容、tabbar,不想让整个页面出现滚动条,只想让主要内容滚动。 我这里是直接用了uni.getSystemInfoSync(),整体分为两部分,自定义头部和滚动内容&#xff…

UE5- c++ websocket客户端写法

# 实现目标 ue5 c 实现socket客户端,读取服务端数据,并进行解析 #实现步骤 {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息,最终输出如下: using UnrealBuildTool;…

【SpringSecurity】九、Base64与JWT

文章目录 1、base64编码2、Base64Url3、JWT的产生背景4、JWT介绍5、JWT组成5.1 Header5.2 Payload5.3 Signature 6、JWT的使用方式7、JWT的几个特点 1、base64编码 base64是一种编码方式,不是加密方式。 所谓Base64,就是说选出64个字符:小写…

LNMP 平台搭建(四十)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 搭建LNMP 一、安装Nginx 二、安装Mysql 三、安装PHP 四、部署应用 前言 LNMP平台指的是将Linux、Nginx、MySQL和PHP(或者其他的编程语言,如…

【Apollo学习笔记】——规划模块TASK之SPEED_BOUNDS_PRIORI_DECIDER

文章目录 前言SPEED_BOUNDS_PRIORI_DECIDER功能简介SPEED_BOUNDS_PRIORI_DECIDER相关配置SPEED_BOUNDS_PRIORI_DECIDER流程将障碍物映射到ST图中ComputeSTBoundary(PathDecision* path_decision)ComputeSTBoundary(Obstacle* obstacle)GetOverlapBoundaryPointsComputeSTBounda…

视觉化洞察:为什么我们需要数据可视化?

为什么我们需要数据可视化?这个问题在信息时代变得愈发重要。数据,如今已成为生活的一部分,我们每天都在产生大量的数据,从社交媒体到购物记录,从健康数据到工作表现,数据无处不在。然而,数据本…

uniapp项目实践总结(五)自定义底部导航栏

在底部导航栏这个模块,很多时候默认的样式不符合我们的设计规范和需求,因此需要自定义底部导航栏,这样可以满足我们的需求,也可以更加个性化,增加用户体验,下面就介绍如何自定义底部导航栏。 目录 准备导航素材配置页面导航自定义导航栏准备导航素材 要自定义底部导航栏…

HTML基础--标签

目录 列表标签 有序列表 type属性 有序列表嵌套 无序列表 type属性 无序列表嵌套 常见应用场景 表格标签 表格展示效果 表格属性 表格单元格合并 单元格合并属性 列表标签 HTL作为构建网页内容的标记语言,提供了多种列表标签,用于在网页中展…

栈和队列(优先级队列)

一)删除字符串中所有相邻字符的重复项 1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode) 算法原理:栈结构模拟,只是需要遍历所有字符串中的字符,一次存放到栈里面即可,也是可以使用数组来模拟一个栈结构的: class…

工厂人员作业行为动作识别检测算法

工厂人员作业行为动作识别检测算法通过yolov7python深度学习算法框架模型,工厂人员作业行为动作识别检测算法实时识别并分析现场人员操作动作行为是否符合SOP安全规范流程作业标准,如果不符合则立即抓拍告警提醒。Python是一种由Guido van Rossum开发的通…

2023-08-31 打印IEEE标准的 float 符号位, 阶码位, 尾数位

老林的C语言新课, 想快速入门点此 <C 语言编程核心突破> 打印IEEE标准的float符号位, 阶码位, 尾数位 前言一、实现算法二、实现代码总结 前言 学过深入理解计算机系统的同学, 都知道float的实现方式, 按照IEEE标准, 由符号位, 阶码位, 尾数位组成, 本文给出一个代码, …

山海炮性能版售价25.88万元,越来越野

8月25日&#xff0c;长城炮全性能家族霸屏成都车展。作为领衔车型、长城炮旗下大型高性能豪华皮卡——山海炮性能版&#xff0c;全球首秀&#xff0c;以“更大、更强、更豪华”的极致实力&#xff0c;携光而至&#xff0c;成就中国最强硬派越野皮卡。 个性化定制共创新品2023款…

【Linux】0基础从获取docker,一步一步到部署PaddleSpeech

一、利用VMware安装ubuntu 1.安装VMware 具体操作详细安装VMware的方式 另外附部分VMware密匙 4A4RR-813DK-M81A9-4U35H-06KND NZ4RR-FTK5H-H81C1-Q30QH-1V2LA JU090-6039P-08409-8J0QH-2YR7F 4Y09U-AJK97-089Z0-A3054-83KLA 4C21U-2KK9Q-M8130-4V2QH-CF810 MC60H-DWH…

机场数据安全三步走战略|盾见

2021年9月1日&#xff0c;《数据安全法》正式实施&#xff0c;标志着数据安全上升到国家层面&#xff0c;自此数据安全建设有法可依&#xff0c;规定了包括数据安全处理、建立健全各项制度、促进数据安全和发展、满足电子政务数据合理需求、保障国家安全等。 同一天&#xff0…

力扣奇遇记 [第二章]

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…