Python OpenCV招商银行信用卡卡号识别的方法

作者:梦想橡皮擦 时间:2022-01-16 06:31:30 

学在前面

从本篇博客起,我们将实际完成几个小案例,第一个就是银行卡号识别,预计本案例将写 5 篇左右的博客才可以完成,一起加油吧。

本文的目标是最终获取一套招商银行卡,0~9 数字的图,对于下图的数字,我们需要提取出来,便于后续模板匹配使用。不过下图中找到的数字不完整,需要找到尽量多的卡片,然后补齐这些数字。

Python OpenCV招商银行信用卡卡号识别的方法

提取卡片相关数字

先对上文中卡片中的数字进行相关提取操作,加载图片的灰度图,获取目标区域。在画板中模拟一下坐标区域,为了便于进行后续的操作。

Python OpenCV招商银行信用卡卡号识别的方法

具体代码如下:


import cv2 as cv
import numpy as np
# 读取灰度图
src = cv.imread("./ka1.jpg", 0)

# 寻找卡号目标区域
roi = src[142:168, 42:360]
# cv.imshow("roi",roi)

获取到的图片如下,发现右侧边缘缺少一部分内容,对目标区域坐标进行微调。

Python OpenCV招商银行信用卡卡号识别的方法

修改之后的代码如下,你如果使用的图片与橡皮擦不一致,注意进行修改。


# 寻找卡号目标区域
roi = src[142:168, 46:364]
cv.imshow("roi",roi)

Python OpenCV招商银行信用卡卡号识别的方法

消除噪音,可以增加模糊卷积操作,分别测试均值模糊,中值模糊,高斯模糊效果。


# 模糊卷积操作
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) 的时候,高斯模糊效果不错,可以去噪。

Python OpenCV招商银行信用卡卡号识别的方法

接下来进行二值化操作。


# 对目标区域进行二值化操作
ret, thresh = cv.threshold(
 gau_roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("thresh", thresh)

Python OpenCV招商银行信用卡卡号识别的方法

二值化处理完毕之后,发现还存在一些白色区域的点,需要去除掉,这里使用了形态学里面的腐蚀操作。


# 腐蚀
kernel = np.ones((3, 4), np.uint8)
dst = cv.erode(thresh, kernel=kernel)

Python OpenCV招商银行信用卡卡号识别的方法

腐蚀之后在进行膨胀,让原有的数字区域变的明显,最后的图片是进行之后的效果,关于卷积核你可以自行调整。


# 腐蚀
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)

Python OpenCV招商银行信用卡卡号识别的方法

下面进行外轮廓检测,检测之后发现恰好有 16 个轮廓,也就对应了 16 个数字区域。


# 检测外轮廓
# 只检测外轮廓
contours, hierarchy = cv.findContours(dilate_dst, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

print(len(contours))

Python OpenCV招商银行信用卡卡号识别的方法

对轮廓面积进行一下输出,为了防止出现非目标区域,可以进行一下基本的判断,当罗阔面积大于 80 的时候才进行展示。


target_list = []
# 轮廓判断
for cnt in contours:

# 轮廓面积
 area = cv.contourArea(cnt)
 print(area)
 if area > 79:
   target_list.append(cnt)

print(len(target_list))

Python OpenCV招商银行信用卡卡号识别的方法

有这些参数之后,就可以对灰度图进行裁切了,基于外接矩形获取目标区域,我直接做了循环展示。


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)

Python OpenCV招商银行信用卡卡号识别的方法

接下来放大图片对其进行保存即可,得到如下图片列表,至此,已经获取到 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)

Python OpenCV招商银行信用卡卡号识别的方法

新的图像注意调整目标区域,获取素材,已经获取到 1、2、4、5、6、7、8 几个数字

Python OpenCV招商银行信用卡卡号识别的方法

反复迭代这个办法,知道 0~9 个数字获取完整,找到所有数字之后,对该文件夹中的所有文件进行二值化操作。


import cv2 as cv
import os

def 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招商银行信用卡卡号识别的方法

橡皮擦最后调整之后,得到的结果如下所示,信用卡卡号识别的第一步算是准备好了。

Python OpenCV招商银行信用卡卡号识别的方法

来源:https://dream.blog.csdn.net/article/details/114366561

标签:OpenCV,信用卡,卡号识别
0
投稿

猜你喜欢

  • form 元素内的字段 name 不要跟 form 属性名称一致

    2008-10-22 13:25:00
  • Oracle判断表、列、主键是否存在的方法

    2023-07-22 19:13:06
  • seaborn绘制双变量联合分布图示例详解

    2021-04-29 01:49:24
  • python pexpect ssh 远程登录服务器的方法

    2021-07-10 22:28:53
  • 详解Python如何实现惰性导入-lazy import

    2023-12-22 20:15:43
  • 详解Python中最难理解的点-装饰器

    2023-02-14 04:51:59
  • Sanic框架安装与简单入门示例

    2022-06-08 19:37:41
  • Pytorch十九种损失函数的使用详解

    2021-07-19 22:23:07
  • php实现网站留言板功能

    2023-11-23 21:06:36
  • Python argparse模块使用方法解析

    2022-10-12 10:58:57
  • Python3 Post登录并且保存cookie登录其他页面的方法

    2023-08-18 22:45:52
  • Python 3.8 新功能大揭秘【新手必学】

    2021-07-23 18:08:50
  • python实现二级登陆菜单及安装过程

    2023-09-16 16:05:44
  • 10点优化sql数据库技巧

    2008-06-09 15:00:00
  • java微信开发之上传下载多媒体文件

    2024-06-05 09:43:46
  • 关于golang 字符串 int uint int64 uint64 互转问题

    2023-07-13 17:52:44
  • 在python中实现求输出1-3+5-7+9-......101的和

    2022-10-08 16:33:14
  • JS实现控制表格内指定单元格内容对齐的方法

    2024-04-17 09:42:28
  • Python多线程的使用详情

    2023-05-29 15:13:36
  • Asp的上下午时间格式问题

    2009-04-13 16:06:00
  • asp之家 网络编程 m.aspxhome.com