- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python OpenCV招商银行信用卡卡号识别的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧.
本文的目标是最终获取一套招商银行卡,0~9 数字的图,对于下图的数字,我们需要提取出来,便于后续模板匹配使用。不过下图中找到的数字不完整,需要找到尽量多的卡片,然后补齐这些数字.
先对上文中卡片中的数字进行相关提取操作,加载图片的灰度图,获取目标区域。在画板中模拟一下坐标区域,为了便于进行后续的操作.
具体代码如下:
import cv2 as cvimport numpy as np# 读取灰度图src = cv.imread("./ka1.jpg", 0)# 寻找卡号目标区域roi = src[142:168, 42:360]# cv.imshow("roi",roi)
获取到的图片如下,发现右侧边缘缺少一部分内容,对目标区域坐标进行微调.
修改之后的代码如下,你如果使用的图片与橡皮擦不一致,注意进行修改.
# 寻找卡号目标区域roi = src[142:168, 46:364]cv.imshow("roi",roi)
消除噪音,可以增加模糊卷积操作,分别测试均值模糊,中值模糊,高斯模糊效果.
# 模糊卷积操作blur_roi = cv.blur(roi,(5,5))cv.imshow("blur_roi",blur_roi)med_roi = cv.medianBlur(roi,5)cv.imshow("med_roi",med_roi)gau_roi = cv.GaussianBlur(roi,(7,7),0)cv.imshow("gau_roi",gau_roi)
测试不同的卷积核效果,选择一个合适的即可,我这里发现卷积核为 (7,7) 的时候,高斯模糊效果不错,可以去噪.
接下来进行二值化操作.
# 对目标区域进行二值化操作ret, thresh = cv.threshold( gau_roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)cv.imshow("thresh", thresh)
二值化处理完毕之后,发现还存在一些白色区域的点,需要去除掉,这里使用了形态学里面的腐蚀操作.
# 腐蚀kernel = np.ones((3, 4), np.uint8)dst = cv.erode(thresh, kernel=kernel)
腐蚀之后在进行膨胀,让原有的数字区域变的明显,最后的图片是进行之后的效果,关于卷积核你可以自行调整.
# 腐蚀kernel = np.ones((3, 4), np.uint8)erode_dst = cv.erode(thresh, kernel=kernel)cv.imshow("erode_dst", erode_dst)# 膨胀kernel = np.ones((4, 4), np.uint8)dilate_dst = cv.dilate(erode_dst, kernel=kernel)
下面进行外轮廓检测,检测之后发现恰好有 16 个轮廓,也就对应了 16 个数字区域.
# 检测外轮廓# 只检测外轮廓contours, hierarchy = cv.findContours(dilate_dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)print(len(contours))
对轮廓面积进行一下输出,为了防止出现非目标区域,可以进行一下基本的判断,当罗阔面积大于 80 的时候才进行展示.
target_list = []# 轮廓判断for cnt in contours: # 轮廓面积 area = cv.contourArea(cnt) print(area) if area > 79: target_list.append(cnt)print(len(target_list))
有这些参数之后,就可以对灰度图进行裁切了,基于外接矩形获取目标区域,我直接做了循环展示.
for index, cnt in enumerate(target_list): # 外接矩形 x, y, w, h = cv.boundingRect(cnt) # 在二值化的图像上进行目标区域获取 c_roi = roi[y:y+h, x:x+w] # 调整图像大小 # big_roi = cv.resize(c_roi, dsize=(0, 0), fx=2, fy=2) # big_roi = cv.resize(c_roi, dsize=(0, 0)) cv.imshow("big_roi"+str(index), c_roi) # cv.imwrite(f"./numbers/ka_{index}.png", big_roi)
接下来放大图片对其进行保存即可,得到如下图片列表,至此,已经获取到 1、4、6、8 几个数字,下面在切换到另一张卡片,去获取其他数字即可,注意图片大小保持一致.
big_roi = cv.resize(c_roi, dsize=(42, 66))# cv.imshow("c_roi"+str(index), c_roi)cv.imwrite(f"./numbers/ka1_{index}.png", big_roi)
新的图像注意调整目标区域,获取素材,已经获取到 1、2、4、5、6、7、8 几个数字 。
反复迭代这个办法,知道 0~9 个数字获取完整,找到所有数字之后,对该文件夹中的所有文件进行二值化操作.
import cv2 as cvimport osdef walk_file(file): for root, dirs, files in os.walk(file): for f in files: file = os.path.join(root, f) # 读取灰度图 basename = os.path.basename(file) filename = basename.split(".")[0] src = cv.imread(file, 0) ret, thresh = cv.threshold(src, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # cv.imshow("thresh", thresh) cv.imwrite(f"./numbers/001_{filename}_bit.png", thresh) cv.waitKey() cv.destroyAllWindows()if __name__ == "__main__": walk_file("./numbers")
二值化之后,挑选出比较清晰的数字即可,如果发现存在不清楚的,可以在寻找资源进行提取,银行里面 8 真的是太多了.
橡皮擦最后调整之后,得到的结果如下所示,信用卡卡号识别的第一步算是准备好了.
到此这篇关于Python OpenCV招商银行信用卡卡号识别的方法的文章就介绍到这了,更多相关OpenCV信用卡卡号识别内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://dream.blog.csdn.net/article/details/114366561 。
最后此篇关于Python OpenCV招商银行信用卡卡号识别的方法的文章就讲到这里了,如果你想了解更多关于Python OpenCV招商银行信用卡卡号识别的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我使用的是linux的windows子系统,安装了ubuntu,bash运行流畅。 我正在尝试使用make,似乎bash 无法识别gcc。尝试将其添加到 PATH,但没有任何改变。奇怪的是 - cmd
ImageMagick 已正确安装。 WAMP 的“PHP 扩展”菜单也显示带有勾选的 php_imagick。除了 Apache 和系统环境变量外,phpinfo() 没有显示任何 imagick
我是这么想的,因为上限是 2^n,并且考虑到它们都是有限机,n 状态 NFA 和具有 2^n 或更少状态的 DFA 的交集将是有效。 我错了吗? 最佳答案 你是对的。 2^n 是一个上限,因此生成的
我有一个大型数据集,其中包含每日值,指示一年中的特定一天是否特别热(用 1 或 0 表示)。我的目标是识别 3 个或更多特别炎热的日子的序列,并创建一个包含每个日子的长度以及开始和结束日期的新数据集。
我有一个向量列表,每个向量看起来像这样 c("Japan", "USA", "country", "Japan", "source", "country", "UK", "source", "coun
是否有任何工具或方法可以识别静态定义数组中的缓冲区溢出(即 char[1234] 而不是 malloc(1234))? 昨天我花了大部分时间来追踪崩溃和奇怪的行为,最终证明是由以下行引起的: // e
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我一直在尝试通过导入制表符分隔的文件来手动创建 Snakemake 通配符,如下所示: dataset sample species frr PRJNA493818_GSE120639_SRP1628
我想录下某人的声音,然后根据我获得的关于他/她声音的信息,如果那个人再次说话,我就能认出来!问题是我没有关于哪些统计数据(如频率)导致人声差异的信息,如果有人可以帮助我如何识别某人的声音? 在研究过程
我希望我的程序能够识别用户何时按下“enter”并继续循环播放。但是我不知道如何使程序识别“输入”。尝试了两种方法: string enter; string ent = "\n"; dice d1;
我创建了这个带有一个参数(文件名)的 Bash 小脚本,该脚本应该根据文件的扩展名做出响应: #!/bin/bash fileFormat=${1} if [[ ${fileFormat} =~ [F
我正在寻找一种在 for 循环内迭代时识别 subview 对象的方法,我基本上通过执行 cell.contentView.subviews 从 UITableView 的 contentView 获
我正在尝试在 Swift 中使用 CallKit 来识别调用者。 我正在寻找一种通过发出 URL 请求来识别调用者的方法。 例如:+1-234-45-241 给我打电话,我希望它向 mydomain.
我将(相当古老的)插件称为“thickbox”,如下所述: 创建厚盒时,它包含基于查询的内容列表。 使用 JavaScript 或 jQuery,我希望能够访问 type 的值(在上面的示例中 t
我想编写一些可以接受某种输入并将其识别为方波、三角波或某种波形的代码。我还需要一些产生所述波的方法。 我确实有使用 C/C++ 的经验,但是,我不确定我将如何模拟所有这些。最终,我想将其转换为微 Co
我创建了一个 for 循环,用于在每个部分显示 8 个项目,但我试图在循环中识别某些项目。例如,我想识别前两项,然后是第五项和第六项,但我的识别技术似乎是正确的。 for (int i = 0; i
如何识别 UIStoryboard? 该类具有创建和实例化的方法,但我没有看到带有类似name 的@property。例如 获取 Storyboard对象 + storyboardWithName:b
如何确定所运行的SQLServer2005的版本 要确定所运行的SQLServer2005的版本,请使用SQLServerManagementStudio连接到SQLServer2005,然后运行
这个问题在这里已经有了答案: How to check whether an object is a date? (26 个答案) 关闭2 年前。 我正在使用一个 npm 模块,它在错误时抛出一个空
我正在制作一个使用 ActivityRecognition API 在后台跟踪用户 Activity 的应用,如果用户在指定时间段(例如 1 小时)内停留在同一个地方,系统就会推送通知告诉用户去散步.
我是一名优秀的程序员,十分优秀!