13- 信用卡账号识别 (OpenCV基础) (项目十三) *

项目要点

  • _, ref = cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV)   二值化处理图片, 黑白化图片
  • ref = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY灰度化处理
  • ref_contours, _ = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  计算轮廓
  • cv2.drawContours(img, ref_contours, -1, (0, 0, 255), 2)  画出外轮廓
  • image = cv2.resize(image, (300, int(h * r)))   等比例缩放原图   # r = width / w
  • 顶帽运算: tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rect_kernel)  顶帽 = 原图 - 开运算  开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.
  • 索贝尔算子: grad_x = cv2.Sobel(tophat, ddepth = cv2.CV_32F, dx = 1, dy = 0, ksize = -1)  边缘检测, 一般先分别求x, y 方向上的检测结果, 再进行合并 .
  • 闭操作: grad_x = cv2.morphologyEx(grad_x, cv2.MORPH_CLOSE, rect_kernel)  闭运算 = 膨胀 + 腐蚀  填充图像内部的噪点 .
  • _, thresh = cv2.threshold(grad_x, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU大津算法找到合适的阈值进行全局二值化  主要是通过阈值进行前后背景分割 .
  • 模板匹配: result = cv2.matchTemplate(roi, digit_roi, cv2.TM_CCOEFF)


信用卡识别项目

基本思路:

总体思路就是取出信用卡中每一个数字作为去和模板中的10个数字进行模板匹配操作.

  1. 先对模板处理, 获取每个数字的模板及其对应的数字标识.

  2. 再对信用卡处理, 通过一系列预处理操作, 取出信用卡数字区域.

  3. 然后再取出每一个数字去和模板中的10个数字进行匹配.

1  先对模板处理

1.1 显示原始图片

# 先处理数字模板的图片
import cv2
import numpy as np# 模板图片
img = cv2.imread('./ocr_a_reference.png')
def cv_show(name, img):    # 封装显示的函数cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()print(img.shape)    # (126, 800, 3)
cv_show('img', img)

1.2 灰度化处理

ref = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # 灰度化处理
cv_show('ref', ref)
print(ref.shape)   # (126, 800)

 1.3 二值化图片

# 二值化处理
_, ref = cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV)
cv_show('ref', ref)

 1.4 描绘轮廓

# 计算轮廓
ref_contours,_=cv2.findContours(ref.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# 画出外轮廓
cv2.drawContours(img, ref_contours, -1, (0, 0, 255), 2)
cv_show('img', img)
print(np.array(ref_contours).shape)   # (10,)

1.5 外接矩形

# 对轮廓进行排序, 按照数字大小进行排序, 方便使用
# 排序思路:根据每个数字的最大外接矩形的X轴坐标进行排序
# 计算每个轮廓的外接矩形
bounding_boxes = [cv2.boundingRect(c) for c in ref_contours]
print(len(bounding_boxes))   # 10
sorted(bounding_boxes, key = lambda b : b[0])
print('---------\n', bounding_boxes[0][:2])   # (15, 20)
cv2.rectangle(img, bounding_boxes[0][:2], (bounding_boxes[0][0]+bounding_boxes[0][2],bounding_boxes[0][1]+bounding_boxes[0][3]), (255, 0, 0), 2)
# * 去中括号                                            
(ref_contours, bounding_boxes) = zip(*sorted(zip(ref_contours, bounding_boxes), key = lambda b : b[1][0]))
digits = {}
for (i, c) in enumerate(ref_contours):# 重新计算外接矩形(x, y, w, h) = cv2.boundingRect(c)# region of interest 感兴趣的区域,取出每个数字roi = ref[y: y+h, x: x+ w]# resize 成合适的图像roi = cv2.resize(roi, (57, 88))digits[i] = roiprint(len(digits))   # 10
cv_show('img', img)
  • digits 是一个数字和特征对应的字典 .

2 信用卡处理

2.1 信用卡图片

# 对信用卡图片进行处理
image = cv2.imread('./credit_card_01.png')
print(image.shape)   # (368, 583, 3)
cv_show('img',image)

 2.2 调整图片尺寸

# 对信用卡图片resize
# 保证原图不拉伸, 计算原图的长宽比
h, w = image.shape[:2]
width = 300
r = width / w
image = cv2.resize(image, (300, int(h * r)))  # 等比例缩放原图
print(image.shape)  # (189, 300, 3)
cv_show('image', image)

 2.3 灰度化处理图片

# 灰度化处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
print(gray.shape)    # (189, 300)
cv_show('image', gray)

 2.4 顶帽操作

# 形态学操作
# 顶帽操作,突出明亮区,初始化卷积核, 去除图像外的噪点
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rect_kernel)
print(tophat.shape)   # (189, 300)
cv_show('tophat', tophat)

 2.5 索贝尔算子

# 索贝尔算子, 计算图像轮廓
grad_x = cv2.Sobel(tophat, ddepth = cv2.CV_32F, dx = 1, dy = 0, ksize = -1)
grad_x = np.absolute(grad_x)
# 再把grad_x 变成0 到255 之间的整数
min_val, max_val = np.min(grad_x), np.max(grad_x)
grad_x = ((grad_x - min_val)/ (max_val - min_val)) * 255   # 归一化 ?
# 修改 数据类型
grad_x = grad_x.astype('uint8')
cv_show('grad_x', grad_x)  # 只用X方向的值

# 计算y轴梯度
grad_y = cv2.Sobel(tophat, ddepth = cv2.CV_32F, dx = 0, dy = 1, ksize = -1)
grad_y = np.absolute(grad_y)
# 再把grad_y 变成0 到255 之间的整数
min_val, max_val = np.min(grad_y), np.max(grad_y)
grad_y = ((grad_y - min_val)/ (max_val - min_val)) * 255
# 修改 数据类型
grad_y = grad_y.astype('uint8')cv_show('grad_y', grad_y)
cv_show('gray', grad_x + grad_y)

. y轴的索贝尔算子梯度                                     . 索贝尔算子合并后效果

 2.6 闭操作

# 闭操作 ,先膨胀,再腐蚀, 填充内部噪点
grad_x = cv2.morphologyEx(grad_x, cv2.MORPH_CLOSE, rect_kernel)
cv_show('grad_x', grad_x)

 2.7 大津算法

# 大津算法找到合适的阈值进行全局二值化, 区分前景背景
_, thresh = cv2.threshold(grad_x, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv_show('thresh', thresh)

 2.8 继续闭运算

# 再来闭操作, 中间还有空洞  5 * 5 的卷积核放入, 减少内部噪点
sq_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sq_kernel)
cv_show('thresh', thresh)

 2.9 寻找轮廓

# 找轮廓
thresh_contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 在原图画轮廓
image_copy = image.copy()
cv2.drawContours(image_copy, thresh_contours, -1, (0, 0, 255), 3)
cv_show('image', image_copy)

2.10 查找信用卡数字区

  • 根据信用卡数字区的长宽特征, 找出数字区域 .

# 定义每一组匹配到的值的列表
# 遍历轮廓, 计算外接矩形,然后根据信用卡的长宽比,找到数字区
locs = []
for c in thresh_contours:# 计算外接矩形(x, y, w, h) = cv2.boundingRect(c)# 计算外接矩形的长宽比例ar = w / float(h)# 选择合适的区域if ar > 2.5 and ar < 4.0:# 根据实际的长宽进一步的筛选if (w > 40 and w < 55) and (h > 10 and h < 20):locs.append((x, y, w, h))print(locs)  
# [(224, 102, 52, 14), (157, 102, 51, 14), (90, 102, 51, 14), (24, 102, 50, 14)]

3  模板匹配

# 对符合的轮廓进行排序
# 遍历每个外接矩形,通过外接矩形可以把原图中的数字抠出来
sorted(locs, key = lambda x : x[0])
out_put = []
for (i , (gx, gy, gw, gh)) in enumerate(locs):# 扣除数字,外轮廓留预值# 根据坐标调出在原图的位置截图group = gray[gy - 5 : gy + gh + 5, gx - 5: gx+ gw + 5]   # gray 是灰度化处理后的图片# 对取出的灰色group做全局二值化处理, 黑白图group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]# 计算轮廓digit_contours, _ = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 对轮廓进行排序bounding_boxes = [cv2.boundingRect(c) for c in digit_contours](digit_contours, _) = zip(*sorted(zip(digit_contours, bounding_boxes), key = lambda b : b[1][0]))# print(len(digit_contours))   # 4 每次是四个数字, 每个数字的轮廓group_output = []# 遍历排好序的轮廓, 每个digit_contours 为每个数字的元组for c in digit_contours:# 找到当前的轮廓,resize成合适的大小, 进行模板匹配(x, y , w, h) = cv2.boundingRect(c)# 取出数字roi = group[y : y+ h, x : x + w]roi = cv2.resize(roi, (57, 88))# cv_show('roi', roi)   # 显示每个数字# 进行模板匹配, 定义保存匹配得分的列表scores = []for (digit, digit_roi) in digits.items():result = cv2.matchTemplate(roi, digit_roi, cv2.TM_CCOEFF)# 只要最大值分数(_, score, _, _) = cv2.minMaxLoc(result)scores.append(score)# 找到分数最高的数字, 即匹配到的数字group_output.append(str(np.argmax(scores)))# print(scores)    # 第一列在 9位置的值: -5058846.5# print(group_output)  # 第一个值是 ['9']out_put = group_output + out_put# 画出轮廓显示数字cv2.rectangle(image, (gx - 5, gy - 5), (gx + gw + 5, gy + gh + 5), (0, 0, 255), 1)cv2.putText(image, ''.join(group_output), (gx, gy - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
cv_show('image', image)
print(out_put)    # ['4', '0', '0', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '0']
car_num = ''
for i in out_put:car_num += str(i)
print('信用卡账号:',car_num)    # 信用卡账号: 4000123456789010

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

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

相关文章

OpenCv图像处理实战——银行卡卡号识别

图像处理项目 测试图片自取区 card1 card2 银行卡卡号识别 from imutils import contours import numpy as np import argparse import imutils import cv2 import myutils #argparse这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行。#这两个方法在包中没…

【OpenCV】 ⚠️实战⚠️ 银行卡卡号读取 ☢️建议手收藏☢️

【OpenCV】 ⚠️实战⚠️ 银行卡卡号读取 概述预处理代码模板预处理银行卡预处理 计算轮廓代码模板轮廓银行卡轮廓 其他程序主函数代码数字分割最终结果 概述 今天带大家使用我们之前学会的知识来实现银行卡卡号读取. 代码分为四个部分: 主函程序, 预处理, 计算轮廓, 其他程序…

openCV实践项目:银行卡卡号识别

本文用于对之前openCV知识点学习的复习及实践。要求达到以下效果&#xff1a; 一、基本流程思路分析 本项目本质上就是进行模板匹配。 注&#xff1a;为多用到所学知识&#xff0c;为了加深理解多加了些步骤&#xff0c;实际上本项目可以很简单就能完成。 1.1 模板处理 模…

什么是物联网平台

1、什么是物联网平台 阿里云物联网平台为设备提供安全可靠的连接通信能力&#xff0c;向下连接海量设备&#xff0c;支撑设备数据采集上云&#xff1b;向上提供云端API&#xff0c;服务端通过调用云端API将指令下发至设备端&#xff0c;实现远程控制。 物联网平台消息通信流程…

新兴 IoT 物联网场景中 MQTT 与 TCP 通信协议对比

在IoT 物联网开发中&#xff0c;大多数通信模组都支持 TCP、UDP、MQTT、CoAP、HTTP、LwM2M 等网络通信协议&#xff0c;其中既有传输层协议&#xff0c;也有应用层的协议&#xff0c;不同协议适用的场景也不同。 我们在设计IoT硬件产品时&#xff0c;通常只需选择一种协议即可。…

lot物联网场景通用架构分享

1.通用参考架构&#xff1a; 2.lot物联网硬件设备上云技术方案&#xff1a; #lot物联网业务链路包含&#xff1a;数据采集&#xff0c;通信连接&#xff0c;数据存储&#xff0c;数据可视化&#xff0c;洞察&#xff0c;行动决策&#xff1b;其中以设备端各种厂商提供得协议差…

物联网网络通讯知识

RTU是什么 RTU英文全称Remote Terminal Units&#xff0c;中文全称为远程终端单元。远程终端设备(RTU)是安装在远程现场的电子设备&#xff0c;用来监视和测量安装在远程现场的传感器和设备。通俗理解就是能够编程的还可以将数据传输到服务器的工具。RTU内部是包含通讯模块的&…

APP与服务器之间通过 http(POST、GET)进行数据交互 ( 实现一个简单的物联网系统-1 )

文章目录 一、APP POST 数据到服务器二、APP 从服务器 GET 数据三、APP 界面部分四、相关疑问五、学习方法六、专栏地址 一、APP POST 数据到服务器 首先 post 的数据应该包括识别这个花卉的信息和我们想要浇水的量&#xff0c;这里我们识别花卉采用花卉的名字&#xff0c;这样…

什么是物联网(Internet of Things)?

你可能在某些时候会听到物联网这个词&#xff0c;但是你对它可能不知所以然&#xff0c;这篇文章让你弄清楚什么是物联网&#xff0c;以及它代表什么&#xff1f; 物联网&#xff08;Internet of Things&#xff09;是指设备到互联网的连接。汽车&#xff0c;厨房电器&#xff…

物联网网关有哪些能力和哪些应用?

工业物联网的应用受到越来越多企业的关注&#xff0c;很多人都了解网关这个概念。网关就是一个网络连接到另一个网口的桥梁&#xff0c;起到协议解析、数据采集的作用&#xff0c;实现运行状态数据的高效利用。 物联网网关具备的能力 1、广泛连接的能力 目前各个行业、不同设…

一文了解物联网网关

物联网是指通过射频识别(RFID)、红外感应器、GPS、激光扫描器等信息传感设备&#xff0c;按约定的协议&#xff0c;实现任何时间、任何地点、任何物体进行信息交换和通信&#xff0c;以实现智能化识别、定位、监控和管理的一种网络。物联网是具有全面感知、可靠传输、智能处理特…

什么是物联网?有哪些应用?终于有人讲明白了

作者&#xff1a;佩里利&#xff08;Perry Lea&#xff09; 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 我们将从连接设备的角度来研究物联网&#xff0c;这些设备之前未必相互连接或接入互联网。它们可能一直没有太多的计算或通信能力。我们假…

LPWA物联网通信

物联网LPWA是物联网中的无线通信技术之一。 根据物联网无线通信技术的覆盖距离&#xff0c;大致可分为两类&#xff1a;一类是短距离通信技术&#xff0c;包括蓝牙(蓝牙)&#xff1b;NFC,Zigbee、WIFI、NFC&#xff0c;主要用于室内智能家庭、消费电子等场景&#xff1b;另一种…

物联网通讯协议:MQTT,NB-IOT,Zigbee,CoAP,RFID,BLUETOOTH,NFC,4G,HTTP

目录 一、按网络四层协议分类二、按需要网关来分类三、NB-IoT&#xff0c;4G对比四、应用层协议&#xff1a;MQTT和COAP对比物联网组网技术WIFI蓝牙ZigBee2G/4G/5GNB-IoTLoRa网关 物联网中常见的物联通信协议TCPUDPTCP和UDP比较HTTPMQTTCoAPLwM2M 一、按网络四层协议分类 NB-I…

chatgpt赋能python:如何使用Python拷贝微信聊天记录的图片?

如何使用Python拷贝微信聊天记录的图片&#xff1f; 微信聊天记录中的图片是我们很重要的一部分。它们记录了我们和我们的朋友、家人和同事之间的重要时刻和特殊瞬间。然而&#xff0c;有些时候我们需要把这些图片从微信聊天记录中拷贝出来&#xff0c;以便于备份和共享。本文…

《辉煌优配》科技股强势引领A股反弹 沪深两市日成交额再超万亿元

受美联储再度加息扰动&#xff0c;昨日早盘沪深两市指数低开&#xff0c;随后科技股强势拉升&#xff0c;带动商场回暖。到收盘&#xff0c;上证综指报3286.65点&#xff0c;上涨0.64%&#xff1b;深证成指报11605.29点&#xff0c;上涨0.94%&#xff1b;创业板指报2361.41点&a…

深度分析台积电的投资价值:伟大的公司,伟大的投资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 公司介绍 台积电&#xff08;TSM&#xff09;是一家在1987年成立于台湾的半导体公司&#xff0c;并在全球范围内率先实施了“商业晶圆厂”代工模式。该公司为部分或全部外包生产的半导体生产商提供晶圆代工服务。台积电的产…

汇正财经靠谱吗?沪深创再现调整

盘面回顾&#xff1a; 周三A股开盘时间段&#xff0c;人民币再现快速贬值&#xff0c;再加上5月PMI数据不及预期&#xff0c;空头情绪放大&#xff0c;沪深创再陷调整&#xff0c;截止收盘沪指跌0.61%&#xff0c;深成指跌0.7%&#xff0c;创业板指跌1.14%。全天唯独科创50能逆…

超级模型GPT-4发布!

本文来源 量子位 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a; 这是我们迄今为止功能最强大的模型&#xff01; 有多强&#xff1f; 根据OpenAI官方的介绍&#xff0c;GPT-4是一个超大的多模态…

透过现象看本质 | GPT爆火的背后

前言&#xff1a; 近年来&#xff0c;GPT&#xff08;Generative Pre-trained Transformer&#xff09;作为一种革命性的语言模型&#xff0c;以其强大的文本生成能力和广泛的应用领域引发了全球范围内的热议。然而&#xff0c;GPT爆火的背后&#xff0c;是一个更加深刻的本质。…