Opencv项目——信用卡数字识别Python代码实现

news/2024/5/2 22:06:34/文章来源:https://blog.csdn.net/m0_72662900/article/details/126909642

一、模板图像处理

(1)灰度图、二值图转化

template = cv2.imread('C:/Users/bwy/Desktop/number.png')
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
cv_show('template_gray', template_gray)# 形成二值图像,因为要做轮廓检测
ret, template_thresh = cv2.threshold(template_gray, 127, 255, cv2.THRESH_BINARY_INV)
cv_show('template_thresh', template_thresh)

结果如图所示:

(2)进行轮廓提取接受参数为二值图像,得到数字的信息,RETR_EXTERNAL 就是只是需要外轮廓,cv2.CHAIN_APPROX_SIMPLE只保留终点坐标。 

template_contours, hierarchy = cv2.findContours(template_thresh,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(template,template_contours,-1,(0,0,255),2)
cv_show('template',template)

-1:代表所的轮廓,我们这里画出来10个轮廓。(可以用代码验证一下)

print(np.array(refCnts,-1,(0,0,255),3)

结果:10

结果如图所示:

 (3)我们需要将轮廓进行大小排序(我们拿到的数据模板不一定向我们前面所展示的从0-9按顺序的,所以我们需要进行排序、resize。

def contours_sort(contours, method=0):if method == 0:contours = sorted(contours, key=lambda x: cv2.boundingRect(x)[0])else:contours = sorted(contours, key=lambda x: cv2.boundingRect(x)[0], reverse=True)return contours

 我们调用函数#将轮廓排序,位置从小到大就是数字的信息。然后我们遍历模板,使用cv2.boudingRect获得轮廓的位置,提取位置对应的图片,与数字结合构造成模板字典,dsize = (55, 88),统一大小。

dict_template = {}
for i, contour in enumerate(template_contours):# 画出其外接矩阵,获得其位置信息x, y, w, h = cv2.boundingRect(contour)template_img = template_thresh[y:y + h, x:x + w]# 使用cv2.resize变化模板的大小template_img = cv2.resize(template_img, dsize)cv_show('template_img{}'.format(i), template_img)dict_template[i] = template_img 

 结果如图所示:

。。。。。。。。。。

 二、信用卡图片预处理

(1)进行灰度值

card_gray = cv2.cvtColor(card, cv2.COLOR_BGR2GRAY)
cv_show('card_gray',card_gray)

(2)形成二值图像,因为要做轮廓检测,解释参数:THRESH_OTSU会自动寻找合适的阈值,适合双峰,需要阈值参数设置为零 二值化

card_thresh =cv2.threshold(card_gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
cv_show('card_thresh',card_thresh)

结果如图所示:

 

 (3) 我们观察一下图片,我们识别图片上的数字但也会存在黄框和红框中的干扰,这时候我们可以想到前面所学到的形态学操作礼帽,闭运算...

 先进行礼帽操作,突出更明亮的区域:

kernel=np.ones((9,3),np.uint8)
card_tophat=cv2.morphologyEx(card_gray,cv2.MORPH_TOPHAT,kernel)
cv_show('card_tophat',card_tophat)

结果如图:

(4)我们进行图像的轮廓检测只取外轮廓。在这个图上有不同的区域,我们如何区分呢,我们可以用h的大小进行估计,这个数据根据项目而定

bankcard_contours, hierarchy = cv2.findContours(card_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
banck_card_cnts = []
draw_img = card.copy() 
for i, contour in enumerate(bankcard_contours):x, y, w, h = cv2.boundingRect(contour)# 数字的x 坐标在 一定的位置范围if 0.5 * card_h < y < 0.6 * card_h: banck_card_cnts.append((x, y, w, h))draw_img = cv2.rectangle(draw_img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255),thickness=2)  # 画出这个矩形,会在原图上画
cv_show_image('rectangle_contours_img', draw_img)

 结果如图:

 (5)模板匹配,读出图像。

for i, locs in enumerate(banck_card_cnts):x, y, w, h = locs[:]  # 保留了在原始图像的位置信息dst_img = card_thresh[y:y + h, x:x + w]  # 获得当前图像的位置和区域dst_img = cv2.resize(dst_img, dsize)cv_show('rectangle_contours_img', dst_img)tm_vals = {}for number, temp_img in dict_template.items():# 模板匹配,采用计算相关性系数,值越大越相关res = cv2.matchTemplate(dst_img, temp_img, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)tm_vals[number] = max_valnumber_tm = max(tm_vals, key=tm_vals.get)# 在图像上画出结果来draw_img = cv2.rectangle(draw_img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255),thickness=2)  cv2.putText(draw_img, str(number_tm), (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.65,color=(0, 0, 255), thickness=2)cv_show_image('final_result', draw_img)

结果如图所示: 

 只是展示一部分(倒序输出)

 ​​

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

doris环境部署(小白上手+部署适用)

重要:doris不支持单机部署,至少三副本 集群部署策略: 节点1配置FE(Leader):192.168.30.37节点2配置 BE:192.168.30.40节点4配置BE:192.168.30.41节点3配置BE:192.168.30.42 环境部署开始 1、需要安装 Java 运行环境(JDK最低版本要求是8),要检查你所安装的 Java 版本安…

机器学习入门一

应用领域监督学习和无监督学习监督学习回归问题分类问题无穷的处理无监督学习概念聚类算法鸡尾酒会算法模型描述代价函数代价函数是什么简化代价函数进行可视化理解完整代数函数图像&#xff08;高线图表示&#xff09;梯度下降算法过程梯度函数表达式梯度下降函数的更新规则线…

Android修行手册 - TabLayout全解析(上)-常用方法

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

BP神经网络简单应用实例,bp神经网络的应用案例

BP神经网络在地面沉降预测中的应用 地面沉降是多种自然和人为因素共同作用的结果。 各种要素发生作用的时空序列、影响强度和方向以及它们之间的关系处于不断变化之中&#xff0c;同时各因素的变化及其影响并不是单方面的&#xff0c;各变量之间相互形成制约关系&#xff0c;…

牛掰!完美诠释Netty!腾讯强推599页Netty进阶神技

Netty 作为一个学Java的&#xff0c;如果没有研究过Netty&#xff0c;那么你只能算一个初等Java程序员。如果你想知道Nginx是怎么写出来的&#xff0c;如果你想知道Tomcat和Jetty是如何实现的&#xff0c;如果你想实现一个简单的Redis服务器&#xff0c;那都应该好好理解一下Ne…

[需求管理-3]:什么是需求分析?常用的需求分析的流程与方法

作者主页(文火冰糖的硅基工坊)&#xff1a;文火冰糖&#xff08;王文兵&#xff09;的博客_文火冰糖的硅基工坊_CSDN博客 本文网址&#xff1a;https://blog.csdn.net/HiWangWenBing/article/details/126855421 目录 第1章 什么是需求分析 1.1 概述 1.2 需求分析的本质 1.…

go-cqhttp调用接口

目录调用接口一、 概述1、 简介2、 接口二、 接入权限系统1、 智能聊天2、 戳一戳3、 新成员三、 调用接口1、 查找接口2、 调用接口3、 接入机器人 调用接口 一、 概述 1、 简介 在我们实现了权限控制功能后,那么我们就在也不用担心机器人话太多,同时,平时又没时间,电脑又…

openSmile 在 Linux 下的安装教程与使用示例

目录openSMILE 工具简介Linux 上的安装步骤使用示例后续openSMILE 工具简介 一款以命令行形式运行的工具&#xff0c;通过配置config文件&#xff0c;主要用于音频特征的提取。官网&#xff1a;https://www.audeering.com/research/opensmile/ &#xff08;当前是3.0版本&…

Oracle中的用户和表空间

文章目录Oracle中的用户和表空间一、用户和表空间简介二、用户1、系统用户登录1.1、数据库在本机时1.2、数据库在远程时1.3、案例2、查看登录用户2.1、命令2.2、案例3、解锁与锁定用户3.1、命令3.2、案例4、使用scott用户登录4.1、命令4.2、案例三、表空间1、表空间数据字典2、…

解决从PDF复制文字后乱码问题

背景 需要从PDF复制文字出来做笔记&#xff0c;可是谁知道PDF通过adobe打开后复制出来后是乱码&#xff0c;如下图所示&#xff1a; 解决 尝试过安装字体&#xff0c;可惜没卵用。 方法1-CAJViewer打开 用该软件打开后复制&#xff0c;可以完美复制&#xff0c;但是有个小问题…

Fastformer: Additive Attention Can Be All You Need

创新点:本文根据transformer模型进行改进,提出了一个高效的模型,模型复杂度呈线性。 主要改进了注意力机制,出发点在于降低了注意力矩阵的重要程度,该方法采用一个(1*T)一维向量替换了原始T*T大小的注意力矩阵。注意力结构图: 在这里,输入同样通过不同的线性映射得到Q…

Vue23全面知识总结七(2)

感兴趣的朋友可以去我的语雀平台进行查看更多的知识。 https://www.yuque.com/ambition-bcpii/muziteng 7.8 路由的props配置 props作用&#xff1a;让路由组件更方便的收到参数 {name:detail,path:detail/:id,component:Detail,//第一种写法&#xff1a;props值为对象&…

Java内存模型:创建对象在堆区如何分配内存

一、Heap堆区 Heap堆是JVM所管理的内存中最大的一块区域&#xff0c;被所有线程共享的一块内存区域。堆区中存放对象实例和数组&#xff0c;“几乎”所有的对象实例以及数组都在这里分配内存。 新生代、老年代 二、创建对象的内存分配 初始创建对象会在新生代的Eden区生成&…

行为型设计模式之策略模式

行为型设计模式之策略模式策略模式应用场景优缺点主要角色策略模式的基本使用创建抽象策略角色创建具体策略角色创建上下文角色客户端执行策略模式实现支付方式的选择创建抽象策略角色创建具体策略角色创建上下文角色客户端执行策略模式 策略模式&#xff08;Strategy Pattern)…

线程安全集合:CopyOnWriteArrayList源码分析

目录 一、基本思想 二、源码分析 add()方法 set()方法 remove()方法 get()方法 三、小结 一、基本思想 首先CopyOnWrite 简称 COW &#xff0c;是一种用于对集合并发访问的优化策略。基本思想是&#xff1a;当我们往一个集合容器中写入元素时&#xff08;比如添加…

C++左值右值、左值引用右值引用、移动语义move

目录 1.什么是左值、右值 2.什么是左值引用&、右值引用&& 2.1左值引用& 2.2右值引用&& 2.3对左右值引用本质的讨论 2.3.1右值引用有办法指向左值吗&#xff1f; 2.3.2左值引用、右值引用本身是左值还是右值&#xff1f; 2.4 右值引用使用场景…

51单片机学习:静态数码管实验

实验名称&#xff1a;静态数码管实验 接线说明&#xff1a; 实验现象&#xff1a;下载程序后“数码管模块”最左边数码管显示数字0 注意事项&#xff1a; ***************************…

神经体液调节网络,神经网络能干嘛

神经网络的发展趋势如何&#xff1f; 神经网络的云集成模式还不是很成熟&#xff0c;应该有发展潜力&#xff0c;但神经网络有自己的硬伤&#xff0c;不知道能够达到怎样的效果&#xff0c;所以决策支持系统中并不是很热门&#xff0c;但是神经网络无视过程的优点也是无可替代…

CSDN编程竞赛-第六期(上)

CSDN编程竞赛报名地址&#xff1a;https://edu.csdn.net/contest/detail/16 努力是为了让自己不平庸&#xff1a; 前言/背景 四道题都是相关数组的&#xff0c;思路很好想&#xff0c;但是需要熟练使用&#xff0c;不能有小错误。 参赛流程 活动时间&#xff1a;9月8日-21日&a…

Python机器视觉--OpenCV进阶(核心)--图像直方图与掩膜直方图与直方图均衡化

1.图像直方图 1.1 图像直方图的基本概念 在统计学中&#xff0c;直方图是一种对数据分布情况的图形表示&#xff0c;是一种二维统计图表. 图像直方图是用一表示数字图像中亮度分布的直方图&#xff0c;标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整…