当前位置: 首页 > article >正文

openCV项目实战——信用卡数字识别

代码见文末

实现效果


1. 项目背景

        随着数字化支付的普及,信用卡信息的自动识别需求逐渐增加。本项目旨在实现一个基于图像处理的信用卡数字自动识别系统,能够从图片中自动提取并识别出信用卡号。该系统主要应用于金融领域,能够加速信用卡号的提取,减少人工输入错误,提高效率。

        本项目通过图像处理技术,特别是模板匹配与轮廓提取的结合,完成信用卡数字的定位与识别。通过此项目,用户可以上传信用卡图像,系统能够快速、准确地识别出信用卡号和卡类型。


2. 主要步骤及其目的

步骤 1:图像预处理
  • 目的:通过图像处理预处理步骤,将原图转化为适合数字识别的格式。首先读取输入图像,并将其转换为灰度图像。然后应用二值化和形态学操作增强图像中的字符和数字区域,使其适合后续的轮廓提取和数字识别。

    关键操作

    • 灰度转换
    • 二值化(使用OTSU算法)
    • 礼帽操作突出亮区
    • 使用Sobel算子提取梯度
    • 闭操作填补字符间隙
步骤 2:轮廓检测与区域筛选
  • 目的:通过轮廓检测来提取数字区域。首先利用cv2.findContours()方法找出图像中的轮廓,并根据轮廓的几何特征(长宽比、尺寸等)筛选出可能包含信用卡数字的区域。

    关键操作

    • cv2.findContours()提取轮廓
    • 根据外接矩形的长宽比和尺寸筛选出数字区域
步骤 3:数字模板创建与模板匹配
  • 目的:利用手工或已有的模板图像(数字的标准样式),通过模板匹配识别数字。通过计算待匹配区域与模板之间的相似度来找出最匹配的数字。

    关键操作

    • 使用cv2.matchTemplate()进行模板匹配
    • 根据匹配分数选择最佳数字
步骤 4:结果定位与显示
  • 目的:将识别出的数字区域绘制到原图上,并显示或输出完整的信用卡号。同时,根据第一个数字判断信用卡类型。

    关键操作

    • 使用cv2.rectangle()在图像中绘制识别框
    • 使用cv2.putText()在图像中标注识别结果
    • 输出信用卡类型与号码

3. 相关代码片段

以下是项目中部分关键步骤的实现代码:

# 读取并预处理输入图像
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

目的:将图像转换为灰度图并进行二值化,适应后续的轮廓提取。

# 礼帽操作突出亮区
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)

目的:通过礼帽操作增强图像中的高亮区域,突出字符和数字。

# 计算每个轮廓的外接矩形,并筛选合适的区域
for (i, c) in enumerate(cnts):
    (x, y, w, h) = cv2.boundingRect(c)
    ar = w / float(h)  # 长宽比
    if ar > 2.5 and ar < 4.0 and (w > 40 and w < 55) and (h > 10 and h < 20):
        locs.append((x, y, w, h))

目的:根据长宽比和尺寸筛选出潜在的数字区域。

# 遍历每个数字组并进行模板匹配
for (i, (gX, gY, gW, gH)) in enumerate(locs):
    group = gray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5]
    group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    group_, digitCnts, hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    digitCnts = contours.sort_contours(digitCnts, method="left-to-right")[0]

目的:提取数字区域,进行二值化和轮廓检测,按从左到右的顺序排序数字。

# 使用模板匹配识别数字
scores = []
for (digit, digitROI) in digits.items():
    result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF)
    (_, score, _, _) = cv2.minMaxLoc(result)
    scores.append(score)
groupOutput.append(str(np.argmax(scores)))

目的:使用模板匹配方法识别数字,选择与模板最匹配的数字。

# 绘制识别结果
cv2.rectangle(image, (gX - 5, gY - 5), (gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)
cv2.putText(image, "".join(groupOutput), (gX, gY - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)

目的:将识别出的数字绘制到原图上,并标注结果。


通过网盘分享的文件:opencv
链接: https://pan.baidu.com/s/1FHrtVqgysy_mtBIiVg9X-A?pwd=r2k7 提取码: r2k7 

http://www.kler.cn/a/507214.html

相关文章:

  • OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用
  • Spring Boot 动态表操作服务实现
  • 【机器学习】制造业转型:机器学习如何推动工业 4.0 的深度发展
  • springCloudGateway+nacos自定义负载均衡-通过IP隔离开发环境
  • 微服务之松耦合
  • 灵活妙想学数学
  • Vue 开发者的 React 实战指南:测试篇
  • CMake构建C#工程(protobuf)
  • Web 实时消息推送的七种实现方案
  • SpringBoot链接Kafka
  • 在 .NET 9 中使用 Scalar 替代 Swagger
  • 基于 Python 的财经数据接口库:AKShare
  • NFTScan | 01.06~01.12 NFT 市场热点汇总
  • 图论基础,如何快速上手图论?
  • Redis哨兵模式搭建示例(配置开机自启)
  • 代码随想录25 回溯算法
  • 78_Redis网络模型
  • K8S--边车容器
  • 如何Python机器学习、深度学习技术提升气象、海洋、水文?
  • 2025第3周 | json-server的基本使用
  • Linux下使用MySql数据库
  • 采用海豚调度器+Doris开发数仓保姆级教程(满满是踩坑干货细节,持续更新)
  • 浏览器中的Markdown编辑器
  • 【2024年华为OD机试】(B卷,100分)- 相对开音节 (Java JS PythonC/C++)
  • java常用开发工具类
  • uniapp 自定义日历组件 源码